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