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 DoOperands()//обробка операндів { string mnemName = TableSentence.Item.Mnem; int opCount; if (TableInstruction.GetByName(mnemName) != null)//у директиви або інструкції є операнди { opCount = TableInstruction.GetByName(mnemName).OperandCount; } else//інші директиви { opCount = 0; } if (mnemName != "ASSUME" && opCount != TableSentence.Item.OpCount) { Errors.Add(6);//@error Невірна кількість операндів } else { for (int i = 0; i < TableSentence.Item.OpCount; i++)//для каждого операнда { isFirst = (i == 0) ? true : false; int j = 0; while (j < TableSentence.Item.Operands[i, 1]) { TableLexeme Lexeme = TableLexeme.GetByNumber(TableSentence.Item.Operands[i, 0] + j); switch (Lexeme.Type) { case TableAsmWords.Types.регістр: DoOpRegister(Lexeme); break; case TableAsmWords.Types.сегментний_регістр: DoOpSegRegister(Lexeme); break; case TableAsmWords.Types.тип: DoOpType(Lexeme); break; case TableAsmWords.Types.користувач: DoOpName(Lexeme); break; case TableAsmWords.Types.символ: j += DoOpSymbols(Lexeme); break; case TableAsmWords.Types.seg: DoOpSeg(Lexeme); break; case TableAsmWords.Types.число: j += DoOpConst(); break; case TableAsmWords.Types.текст: DoOpText(); break; default: break; } j++; } TableOperand.IdentifyOperands(isFirst); } } bool result = opCount > 0 ? TableOperand.VerifyOperands(mnemName) : true; if (!result) { Errors.Add(15);//@error Помилкові операнди } }