private static int DoOpConst() {//количество байт, выделенных под данные int byteCount = TableInstruction.GetByName(TableLexeme.MnemName()).ByteCount; int result = byteCount; int value; if (TableSentence.Item.Operands[1, 0] != 0) // есть второй операнд { Errors.Add(20); //@error слишком много операндов } if (TableSentence.Item.Operands[0, 1] == 1) //константа { TableLexeme lex = TableLexeme.GetByNumber(TableSentence.Item.Operands[0, 0]); //первая лексема первого операнда value = lex.NumberDex(); double f = Math.Pow(2, 8 * byteCount) - 1; uint j = Convert.ToUInt32(f); if (value > j) { Errors.Add(2);//@error too big number } TableOperand.GetByNumbers(10, isFirst).Modify(value, byteCount); } else//выражение { int FirstLex = TableSentence.Item.Operands[0, 0]; int LastLex = FirstLex + TableSentence.Item.Operands[0, 1] - 1; int Const = Calc.DoCalc(FirstLex, LastLex); result = LastLex - FirstLex; TableOperand.GetByNumbers(10, isFirst).Modify(Const, byteCount); } AnalysisGrammar.AddTableUser(byteCount); return(result); }
public static void GoFirst(int StopNumber) { IsGoFirst = true; IsEnd = false; ClearTables(); string line = ""; Result.Count = 0; if (Result.FileLength > 0) { for (int LineNumber = 0; LineNumber < Result.FileLength; LineNumber++) { line = File.ReadAllLines(Result.FilePath)[LineNumber]; Result result = new Result(LineNumber + 1, line); Result.Count++; AnalysisLexy.FormLexyTable(line); if (TableLexeme.Count > 0) { AnalysisSyntaxy.FormSentenceTable(); if (TableSentence.Item.Type != TableAsmWords.Types.пусто) { int CurrentOffset = AnalysisGrammar.CalculateOffset(); TableSegment.IncOffset(CurrentOffset); result.ModifyOffset(CurrentOffset); } if (TableLexeme.MnemName() == "END") { IsEnd = true; break; } } else//пустая строка { Result.Table.Rows.RemoveAt(Result.Items.Count - 1); Result.Items.RemoveAt(Result.Items.Count - 1); result = null; Result.Count--; } if (LineNumber == StopNumber) { LineNumber += 0;//@error: doesn't do anything } } } if (Result.Count == 0) { Errors.Add(16);//@error пустой исходный файл } else if (!IsEnd) { Errors.Add(17);//@error end is missing } }
public static void GoSecond(int StopNumber, string ListingName) { IsGoFirst = false; TableAssume.Clear(); string line = ""; Result.Count = 0; if (Result.FileLength > 0) { for (int LineNumber = 0; LineNumber < Result.FileLength; LineNumber++) { line = File.ReadAllLines(Result.FilePath)[LineNumber]; Result.Count++;//доступ к текущей строке результата AnalysisLexy.FormLexyTable(line); if (TableLexeme.Count > 0) { AnalysisSyntaxy.FormSentenceTable(); if (TableSentence.Item.Type != TableAsmWords.Types.пусто) { int CurrentOffset = AnalysisGrammar.CalculateOffset(); if (CurrentOffset != Result.Current().LineSize) { Errors.Add(19); //@error невідповідність зміщень першого та другого переглядів } if (Result.Current().Error == null) //ошибок нет { string CurrentCommand = AnalysisGrammar.CommandCreate(); Result.Items[Result.Count - 1].ModifyCode(CurrentCommand);//формирование команды } } } else//пустая строка { Result.Count--; } if (LineNumber == StopNumber) { LineNumber += 0;//@error: doesn't do anything } } } //формирование файла листинга try { Result.CreateListing(ListingName); } catch { MessageBox.Show("Не вдалося сформувати файл лістингу"); } Result.FileLength = 0; }
private static void DoOpText() { TableLexeme lex = TableLexeme.GetByNumber(TableSentence.Item.Operands[0, 0]);//первая лексема первого операнда int byteCount = TableInstruction.GetByName(TableLexeme.MnemName()).ByteCount; if (byteCount == 1) { byteCount *= lex.Length; } else { Errors.Add(14);//@error недопустимий аргумент директиви } TableOperand.GetByNumbers(11, isFirst).Modify(byteCount, -1); AnalysisGrammar.AddTableUser(1); }
private static void DoOpName(TableLexeme Lexeme) { TableUser user = TableUser.GetByName(Lexeme.Name); if (user != null) { TableOperand.GetByNumbers(4, isFirst).Modify(user.Number, -1); } else { TableOperand.GetByNumbers(5, isFirst).Modify(-1, -1); } if (TableLexeme.MnemName() == "DD") { AnalysisGrammar.AddTableUser(4); } else { AnalysisGrammar.AddTableUser(-1); } }