//in method public override void InAMethod(AMethod node) { // save current symbol table _previousSymbolTables.AddFirst(_currentSymbolTable); // build new param list _currentParamList = new List <VariableDefinition>(); // build def allowed by types according to grammar BasicTypeDefinition intType; intType = new BasicTypeDefinition(); intType.name = "int"; BasicTypeDefinition fltType; fltType = new BasicTypeDefinition(); fltType.name = "float"; BasicTypeDefinition boolType; boolType = new BasicTypeDefinition(); boolType.name = "boolean"; StringTypeDefinition stringType = new StringTypeDefinition(); stringType.name = "string"; // create and seed symbol table _currentSymbolTable = new Dictionary <string, Definition>(); _currentSymbolTable.Add("int", intType); _currentSymbolTable.Add("float", fltType); _currentSymbolTable.Add("boolean", boolType); _currentSymbolTable.Add("string", stringType); }
//out mehtod public override void OutAMethod(AMethod node) { // restore previous symbol table _currentSymbolTable = _previousSymbolTables.First(); _previousSymbolTables.RemoveFirst(); Definition def; String methodName = node.GetId().Text; // ensure submethod isnt used if (_currentSymbolTable.TryGetValue(methodName, out def) || _globalSymbolTable.TryGetValue(methodName, out def)) { Console.WriteLine("[" + node.GetOpenparen().Line + "] : " + methodName + " is already declared."); // build function def and add to symbol table } else { def = new MethodDefinition(); def.name = node.GetId().Text; ((MethodDefinition)def).paramList = _currentParamList; _currentSymbolTable.Add(methodName, def); } }
protected virtual Node_Method parseMethod(AMethod node) { return new Node_Method( parseOne<TIdentifier,Node_Identifier>(parseIdentifier, (TIdentifier)node.GetName()), parseOne<PExpression,INode_Expression>(parseExpression, (PExpression)node.GetInterface()), getSource(node)); }