Example #1
0
        public void Visit(FunCallNode node)
        {
            var varName = node.AnchorToken.Lexeme;

            if (!globalScopeFunctionTable.Contains(varName))
            {
                throw new SemanticError("Undeclared function: " + varName, node.AnchorToken);
            }
            else
            {
                var ndecount = 0;
                foreach (var subnode in node[0])
                {
                    ndecount++;
                }
                if (ndecount != globalScopeFunctionTable[varName])
                {
                    throw new SemanticError("Function called with different parameters as defined ", node.AnchorToken);
                }
                foreach (var subnode in node)
                {
                    Visit((dynamic)subnode);
                }
            }
        }
Example #2
0
            public NamedNode         [] subsequentSteps; // PrimStepNode|FunCallNode


            public override void build()
            {
                if (children[0] is SG_EdgeNode)
                {
                    startSG = (SG_EdgeNode)children[0];
                }
                else
                {
                    startFuncall = (FunCallNode )children[0];
                }

                //primSteps = children.Skip(1).Select( nn => (PrimitiveStepNode) nn ).ToArray();
                subsequentSteps = children.Skip(1).ToArray();
            }
        public Node ExprPrimary()
        {
            switch (CurrentToken)
            {
            case TokenCategory.IDENTIFIER:
                var idToken = Expect(TokenCategory.IDENTIFIER);
                if (CurrentToken == TokenCategory.PARENTHESIS_OPEN)
                {
                    Expect(TokenCategory.PARENTHESIS_OPEN);
                    var fun = new FunCallNode()
                    {
                        AnchorToken = idToken
                    };
                    fun.Add(ExprList());
                    Expect(TokenCategory.PARENTHESIS_CLOSE);
                    return(fun);
                }
                else
                {
                    var id = new IdentifierNode()
                    {
                        AnchorToken = idToken
                    };
                    return(id);
                }

            case TokenCategory.SQUARE_OPEN:
                return(Arr());

            case TokenCategory.PARENTHESIS_OPEN:
                Expect(TokenCategory.PARENTHESIS_OPEN);
                var node = Expr();
                Expect(TokenCategory.PARENTHESIS_CLOSE);
                return(node);

            case TokenCategory.STRING_LITERAL:
                return(new StrNode()
                {
                    AnchorToken = Expect(TokenCategory.STRING_LITERAL)
                });

            case TokenCategory.CHAR_LITERAL:
                return(new CharNode()
                {
                    AnchorToken = Expect(TokenCategory.CHAR_LITERAL)
                });

            case TokenCategory.INT_LITERAL:
                return(new IntLiteralNode()
                {
                    AnchorToken = Expect(TokenCategory.INT_LITERAL)
                });

            case TokenCategory.TRUE:
                return(new TrueNode()
                {
                    AnchorToken = Expect(TokenCategory.TRUE)
                });

            case TokenCategory.FALSE:
                return(new IntLiteralNode()
                {
                    AnchorToken = Expect(TokenCategory.FALSE)
                });

            default:
                throw new SyntaxError(firstOfExprPrimary, tokenStream.Current);
            }
        }
        public Node Stmt()
        {
            switch (CurrentToken)
            {
            case TokenCategory.IDENTIFIER:
                var idToken = Expect(TokenCategory.IDENTIFIER);
                switch (CurrentToken)
                {
                case TokenCategory.ASSIGN:
                    Expect(TokenCategory.ASSIGN);
                    var ass = new AssignmentNode()
                    {
                        AnchorToken = idToken
                    };
                    ass.Add(Expr());
                    Expect(TokenCategory.SEMICOLON);
                    return(ass);

                case TokenCategory.INCREMENT:
                    Expect(TokenCategory.INCREMENT);

                    var inc = new IncrementNode()
                    {
                        AnchorToken = idToken
                    };
                    Expect(TokenCategory.SEMICOLON);
                    return(inc);

                case TokenCategory.DECREMENT:
                    Expect(TokenCategory.DECREMENT);
                    var dec = new DecrementNode()
                    {
                        AnchorToken = idToken
                    };
                    Expect(TokenCategory.SEMICOLON);
                    return(dec);

                case TokenCategory.PARENTHESIS_OPEN:
                    Expect(TokenCategory.PARENTHESIS_OPEN);
                    var fun = new FunCallNode()
                    {
                        AnchorToken = idToken
                    };

                    fun.Add(ExprList());

                    Expect(TokenCategory.PARENTHESIS_CLOSE);
                    Expect(TokenCategory.SEMICOLON);
                    return(fun);
                }
                break;

            case TokenCategory.IF:
                return(If());

            case TokenCategory.WHILE:
                return(While());

            case TokenCategory.BREAK:
                var bre = new StmtNode()
                {
                    AnchorToken = Expect(TokenCategory.BREAK)
                };
                Expect(TokenCategory.SEMICOLON);
                return(bre);

            case TokenCategory.RETURN:
                return(Return());

            case TokenCategory.SEMICOLON:
                return(new StmtNode()
                {
                    AnchorToken = Expect(TokenCategory.SEMICOLON)
                });

            default:
                throw new SyntaxError(firstOfStmt, tokenStream.Current);
            }
            throw new SyntaxError(firstOfStmt, tokenStream.Current);
        }