예제 #1
0
        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);
        }
예제 #2
0
        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]);
        }