Beispiel #1
0
        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"));
                    }
                }
            }
        }