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 int DoCalc(int FirstLex, int LastLex) { DataStek.Clear(); int i = FirstLex; while (i <= LastLex) { TableLexeme CurrLex = TableLexeme.Items[i - 1]; if (CurrLex.Type == TableAsmWords.Types.число) { DataStek.Add(CurrLex.NumberDex()); i++; } else if (CurrLex.Type == TableAsmWords.Types.символ) { if (OpStek.Count == 0 || CurrLex.Name == "(" || Prior(CurrLex.Name) > Prior(OpStek[OpStek.Count - 1])) { OpStek.Add(CurrLex.Name); i++; } else if (CurrLex.Name == ")") { while (DoCount() != "(") { ; } i++; } else { DoCount(); } } else { i++; } } while (OpStek.Count > 0) { DoCount(); } if (DataStek.Count > 1) { Errors.Add(11);//@error невірний абсолютний вираз } return(DataStek[0]); }