示例#1
0
        }                                               // the method declaration itself

        public MethodSymbolTable(ClassSymbolTable parentClass, DeclaringNode methodDeclaring, ErrorSummary errorSummary)
        {
            _parentClass         = parentClass;
            MethodDeclaring      = methodDeclaring;
            _methodVarDeclarings = new Dictionary <string, DeclaringNode>();
            _errorSummary        = errorSummary;
        }
示例#2
0
            }                                               // 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;
            }
示例#3
0
 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);
     }
 }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }