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); }
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); } }