Exemplo n.º 1
0
        private void EmitVarStatement(NonTerm nonTerm)
        {
            BaseSymbol varStat;
            BaseSymbol expression;

            NonTermFactory.GetAssignVarStatement(nonTerm, out varStat, out expression);

            if (expression != null)
            {
                Token varType;
                Token varToken;
                NonTermFactory.GetVarDecl(varStat, out varType, out varToken);

                if (varType.TypeToken == TokenType.ID)
                {
                    _currentOperand           = _g.Local(Exp.New(_classesTable[varType.Value]));
                    _currentOperandTempResult = _g.Local(_currentOperand);
                }
                else
                {
                    _currentOperand           = _g.Local(varType.TypeOf);
                    _currentOperandTempResult = _g.Local(_currentOperand.Type);
                }

                if (!(expression is Token))
                {
                    Generate(expression);
                    _g.Assign(GetOperandValue(varToken.Value, varToken), _currentOperandTempResult);
                }
                else
                {
                    _g.Assign(GetOperandValue(varToken.Value, varToken), OperandTokenInit(expression, GetOperandValue(varToken.Value, varToken)));
                }
            }
        }
Exemplo n.º 2
0
        private void AddPreInitLocalVariables(BaseSymbol root)
        {
            if (root == null)
            {
                return;
            }

            if (root.GrammarMember == GrammarMemberType.NonTerm)
            {
                NonTerm nonTerm = root as NonTerm;
                // заносим в список переменные только текущего блока
                if (GrammarHelper.BlockVariablesList.Contains(nonTerm.TypeNonTerm))
                {
                    return;
                }
                switch (nonTerm.TypeNonTerm)
                {
                case NonTermType.Variable:
                case NonTermType.ArrayVariable:

                    Token typeDeclSimple;
                    Token idVar;
                    NonTermFactory.GetVarDecl(nonTerm, out typeDeclSimple, out idVar);

                    _currentOperand = _g.Local(GetVariableType(typeDeclSimple));

                    try
                    {
                        _localVariablesTable.Add(idVar.Value, _currentOperand);
                        _currentBlockVariableList.Add(idVar.Value);
                    }
                    catch (ArgumentException ex)
                    {
                        throw new CodeGenerationException(MessagesHelper.LocalVariableIsAlreadyDefinedEx, idVar.ToStringInfo(), ex);
                    }
                    break;
                }
            }

            if (root.GrammarMember == GrammarMemberType.NonTerm)
            {
                root.Symbols.ForEach(x => AddPreInitLocalVariables(x));
            }
        }