private void BubblingProcessNode(SyntaxTreeNode node) { if (node.Value is Nonterminal) { Nonterminal nonterminal = node.Value as Nonterminal; if (nonterminal.Equals(MyNonterminals.ASSIGN_STATEMENT) && node.ChildrenCount == 4) { var idToken = (node[1].Value as ConcreteTerminal).Token; string defVariableName = idToken.Value; if (!_defindedVariables.Contains(defVariableName)) { _defindedVariables.Add(defVariableName); } else { _errors.Add(new Error(idToken, ErrorKind.Semantic, "Variable redefinition")); } } } else { ConcreteTerminal terminal = node.Value as ConcreteTerminal; if (terminal.Token.HasType(TokenType.Identifier) && !_defindedVariables.Contains(terminal.Token.Value)) { if (((Nonterminal)node.Parent.Value).Equals(MyNonterminals.FACTOR)) { _errors.Add(new Error(terminal.Token, ErrorKind.Semantic, "Undefined variable")); } } } }