Пример #1
0
        public void CheckASTScopeAndType(ASTNode node)
        {
            node.AppearsInScope = Symbols.CurrentScope;
            switch (node.Token.Kind)
            {
            case TokenKind.Block:
                Symbols.NewScope();
                break;

            case TokenKind.IdentifierToken:
                if (node.Parent.Token.Kind == TokenKind.VarDecl)
                {
                    Symbols.AddSymbol(node, node.Parent.Descendants[0].Token.Text);
                }
                else
                {
                    int symbolScope = FindSymbol(node, Symbols.CurrentScope);
                    if (symbolScope == -1)
                    {
                        Symbols.Diagnostics.Semantic_ReportUndeclaredIdentifier(node.Token, Symbols.CurrentScope.Level);
                        return;
                    }
                    else
                    {
                        node.ReferenceScope = symbolScope;
                    }
                }
                break;

            case TokenKind.AssignmentToken:
            case TokenKind.EquivalenceToken:
            case TokenKind.NotEqualToken:
            case TokenKind.AdditionToken:
                TypeChecker.CheckTypes(node);
                break;
            }
        }