} // the method declaration itself public MethodSymbolTable(ClassSymbolTable parentClass, DeclaringNode methodDeclaring, ErrorSummary errorSummary) { _parentClass = parentClass; MethodDeclaring = methodDeclaring; _methodVarDeclarings = new Dictionary <string, DeclaringNode>(); _errorSummary = errorSummary; }
} // the declaration for the class or interface itself public ClassSymbolTable(DeclaringNode n, Dictionary <string, DeclaringNode> stdlib, ErrorSummary errorSummary) { _classVarDeclarings = new Dictionary <string, DeclaringNode>(); _classMethodSymbolTables = new Dictionary <string, MethodSymbolTable>(); ClassDeclaring = n; _stdlib = stdlib; _errorSummary = errorSummary; }
public void EnterSymbol(string ident, DeclaringNode declaring) { if (_classVarDeclarings.ContainsKey(ident)) { _errorSummary.AddError(new SemanticError($"'{ident}' is already declared", declaring.SourcePosition)); } else { _classVarDeclarings.Add(ident, declaring); } }
private DeclaringSequenceNode ParseMethodDeclarings() { DeclaringSequenceNode itsAST; SourceCodePosition itsPos = _currentToken.SourcePosition; DeclaringNode itsMethod = ParseMethodDeclaring(); if (_currentToken.Type == Token.TokenType.Method) { DeclaringSequenceNode itsNextMethods = ParseMethodDeclarings(); itsAST = new MultipleDeclaringSequenceNode(itsMethod, itsNextMethods, itsPos); } else { itsAST = new SingleDeclaringSequenceNode(itsMethod, itsPos); } return(itsAST); }
private DeclaringSequenceNode ParseVariableDeclarings() { DeclaringSequenceNode itsAST; SourceCodePosition itsPos = _currentToken.SourcePosition; DeclaringNode itsVar = ParseVariableDeclaring(); if (_currentToken.Type == Token.TokenType.Var) { DeclaringSequenceNode itsNextVars = ParseVariableDeclarings(); itsAST = new MultipleDeclaringSequenceNode(itsVar, itsNextVars, itsPos); } else { itsAST = new SingleDeclaringSequenceNode(itsVar, itsPos); } return(itsAST); }
private DeclaringSequenceNode ParseImplements() { DeclaringSequenceNode itsAST; SourceCodePosition itsPos = _currentToken.SourcePosition; DeclaringNode itsImplement = ParseImplement(); if (_currentToken.Type == Token.TokenType.Comma) { Accept(Token.TokenType.Comma); DeclaringSequenceNode itsNextImplements = ParseImplements(); itsAST = new MultipleDeclaringSequenceNode(itsImplement, itsNextImplements, itsPos); } else { itsAST = new SingleDeclaringSequenceNode(itsImplement, itsPos); } return(itsAST); }
private ClassDeclaringNode ClassDeclaring() { ClassDeclaringNode itsAST; SourceCodePosition itsPos = _currentToken.SourcePosition; Accept(Token.TokenType.Class); IdentifierNode itsName = new IdentifierNode(_currentToken); Accept(Token.TokenType.Identifier); DeclaringSequenceNode itsImplements = Implements(); Accept(Token.TokenType.LeftBrace); DeclaringSequenceNode itsVars = VariableDeclarings(); DeclaringNode itsConstructor = ConstructorDeclaring(); DeclaringSequenceNode itsMethods = MethodDeclarings(); Accept(Token.TokenType.RightBrace); itsAST = new ClassDeclaringNode(itsName, itsImplements, itsVars, itsConstructor, itsMethods, itsPos); return(itsAST); }