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