public TableSentence(string mnem, int nameNum, int mnemNum, int[,] opers, TableAsmWords.Types type) { Type = type; Mnem = mnem; NameOrLabelNumber = nameNum; MnemNumber = mnemNum; for (int k = 0; k < 6; k++) { for (int l = 0; l < 2; l++) { Operands[k, l] = opers[k, l]; } } Item = this; if (Table.Rows.Count <= 0) { Table.Rows.Add(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } Table.Rows[0][0] = NameOrLabelNumber; Table.Rows[0][1] = MnemNumber; for (int p = 0; p < 6; p++) { Table.Rows[0][p * 2 + 2] = Operands[p, 0]; Table.Rows[0][p * 2 + 3] = Operands[p, 1]; } }
public TableLexeme(string name, string desc, TableAsmWords.Types type) { Number = Count + 1; Name = name; Length = name.Length; Description = desc; Type = type; Items.Add(this); Table.Rows.Add(Count, name, name.Length, desc, type); }
public TableAsmWords.Types Type; //короткое описание #endregion Fields #region Constructors public TableLexeme(string name, string desc, TableAsmWords.Types type) { Number = Count + 1; Name = name; Length = name.Length; Description = desc; Type = type; Items.Add(this); Table.Rows.Add(Count, name, name.Length, desc, type); }
public TableAsmWords.Types Type = TableAsmWords.Types.пусто; //тип предложения #endregion Fields #region Constructors public TableSentence(string mnem, int nameNum, int mnemNum, int[,] opers, TableAsmWords.Types type) { Type = type; Mnem = mnem; NameOrLabelNumber = nameNum; MnemNumber = mnemNum; for (int k = 0; k < 6; k++) for (int l = 0; l < 2; l++) Operands[k, l] = opers[k, l]; Item = this; if (Table.Rows.Count <= 0) Table.Rows.Add(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); Table.Rows[0][0] = NameOrLabelNumber; Table.Rows[0][1] = MnemNumber; for (int p = 0; p < 6; p++) { Table.Rows[0][p * 2 + 2] = Operands[p, 0]; Table.Rows[0][p * 2 + 3] = Operands[p, 1]; } }
public static void FormSentenceTable() { Mnem = ""; NameOrLabelNumber = 0; MnemNumber = 0; Type = TableAsmWords.Types.пусто; for (int k = 0; k < 6; k++) for (int l = 0; l < 2; l++) Operands[k, l] = 0; TableSentence.Item = null;//Обнуляем таблицу предложения в начале строки TableSentence.Table.Clear(); TableOperand.ReCreate();//Обнуляем таблицы операндов в начале строки foreach (var lexem in TableLexeme.Items) if (lexem.AsmWord() != null) if ((lexem.Type == TableAsmWords.Types.інструкція) || (lexem.Type == TableAsmWords.Types.директива)) { MnemNumber = lexem.Number; Mnem = lexem.Name; if (MnemNumber > 1)//mnem not first NameOrLabelNumber = 1; Type = lexem.Type; } switch (MnemNumber) { case 0://label only possible if (TableLexeme.Items[0].Type == TableAsmWords.Types.користувач && TableLexeme.Items[1].Name == ":")//it IS label { NameOrLabelNumber = 1; Mnem = TableLexeme.Items[0].Name; Type = TableAsmWords.Types.мітка; } else Errors.Add(5);//@error хз шо не удалось определить конструкцию IsComa = false; break; case 1://команда IsComa = true; break; case 2://директива if (TableLexeme.Items[0].Type == TableAsmWords.Types.користувач)//имя на своём месте IsComa = true; else Errors.Add(5);//@error хз шо не удалось определить конструкцию break; case 3://команда с меткой в одной строке if (TableLexeme.Items[0].Type == TableAsmWords.Types.користувач && TableLexeme.Items[1].Name == ":")//there IS label IsComa = true; else Errors.Add(5);//@error хз шо не удалось определить конструкцию break; default: Errors.Add(5);//@error хз шо не удалось определить конструкцию break; } if (MnemNumber < TableLexeme.Count && Mnem != "LABEL" && IsComa)//mnem has operands ReadOperands(); new TableSentence(Mnem, NameOrLabelNumber, MnemNumber, Operands, Type); }
private static string CreateLexemeTable(string Lexeme, int count, int iter) { char[] Chars = new char[225]; for (int i = 0; i < iter; i++) { if (i == 1) { count = 1; } Lexeme.CopyTo(0, Chars, 0, count); Lexeme = Lexeme.Remove(0, count); string CurrentLexeme = new string(Chars); CurrentLexeme = CurrentLexeme.Trim(new Char[] { '\0' }); Array.Clear(Chars, 0, Chars.Length); if (CurrentLexeme == "") { continue;//проверка на две односимвольные подряд } TableAsmWords Word = TableAsmWords.GetByName(CurrentLexeme.ToUpper()); if (Word != null)//мы знаем эту лексему { new TableLexeme(Word.Name, Word.Description, Word.Type); } else { string ConstDescript = ConstOrUser(CurrentLexeme); TableAsmWords.Types ConstType = TableAsmWords.Types.пусто; switch (ConstDescript) { case "Помилка": ConstType = TableAsmWords.Types.помилка; Errors.Add(1); //@error недопустимые символы в лексеме break; case "Текстова константа": CurrentLexeme = CurrentLexeme.Remove(0, 1); CurrentLexeme = CurrentLexeme.Remove(CurrentLexeme.Length - 1, 1); ConstType = TableAsmWords.Types.текст; break; case "Ідентифікатор користувача або невизначений": CurrentLexeme = CurrentLexeme.ToUpper(); ConstType = TableAsmWords.Types.користувач; if (CurrentLexeme.Length > 8) { Errors.Add(3); //@error Ідентифікатор довший за 8 символів } break; default: CurrentLexeme = CurrentLexeme.ToUpper(); ConstType = TableAsmWords.Types.число; break; } new TableLexeme(CurrentLexeme, ConstDescript, ConstType); } } return(Lexeme); }
public static void FormSentenceTable() { Mnem = ""; NameOrLabelNumber = 0; MnemNumber = 0; Type = TableAsmWords.Types.пусто; for (int k = 0; k < 6; k++) { for (int l = 0; l < 2; l++) { Operands[k, l] = 0; } } TableSentence.Item = null; //Обнуляем таблицу предложения в начале строки TableSentence.Table.Clear(); TableOperand.ReCreate(); //Обнуляем таблицы операндов в начале строки foreach (var lexem in TableLexeme.Items) { if (lexem.AsmWord() != null) { if ((lexem.Type == TableAsmWords.Types.інструкція) || (lexem.Type == TableAsmWords.Types.директива)) { MnemNumber = lexem.Number; Mnem = lexem.Name; if (MnemNumber > 1)//mnem not first { NameOrLabelNumber = 1; } Type = lexem.Type; } } } switch (MnemNumber) { case 0: //label only possible if (TableLexeme.Items[0].Type == TableAsmWords.Types.користувач && TableLexeme.Items[1].Name == ":") //it IS label { NameOrLabelNumber = 1; Mnem = TableLexeme.Items[0].Name; Type = TableAsmWords.Types.мітка; } else { Errors.Add(5); //@error хз шо не удалось определить конструкцию } IsComa = false; break; case 1: //команда IsComa = true; break; case 2: //директива if (TableLexeme.Items[0].Type == TableAsmWords.Types.користувач) //имя на своём месте { IsComa = true; } else { Errors.Add(5); //@error хз шо не удалось определить конструкцию } break; case 3: //команда с меткой в одной строке if (TableLexeme.Items[0].Type == TableAsmWords.Types.користувач && TableLexeme.Items[1].Name == ":") //there IS label { IsComa = true; } else { Errors.Add(5); //@error хз шо не удалось определить конструкцию } break; default: Errors.Add(5); //@error хз шо не удалось определить конструкцию break; } if (MnemNumber < TableLexeme.Count && Mnem != "LABEL" && IsComa)//mnem has operands { ReadOperands(); } new TableSentence(Mnem, NameOrLabelNumber, MnemNumber, Operands, Type); }