Exemplo n.º 1
0
        public Node Program()
        {
            var declList = new Declaration_List();
            var stmtList = new Statement_List();

            while (firstOfDeclaration.Contains(CurrentToken))
            {
                declList.Add(Declaration());
            }
            Expect(TokenCategory.PROGRAM);
            while (firstOfStatement.Contains(CurrentToken))
            {
                stmtList.Add(Statement());
            }
            Expect(TokenCategory.END);
            Expect(TokenCategory.EOL);
            Expect(TokenCategory.EOF);

            return(new Program_Node()
            {
                declList,
                stmtList
            });
        }
Exemplo n.º 2
0
        public Node ProcedureDeclaration()
        {
            var procedureNode = new Procedure_Declaration()
            {
                AnchorToken = Expect(TokenCategory.PROCEDURE)
            };

            var procedureName = new Identifier()
            {
                AnchorToken = Expect(TokenCategory.IDENTIFIER)
            };

            var declList = new Declaration_List();
            var stmtList = new Statement_List();

            Expect(TokenCategory.PARENTHESIS_OPEN);
            while (CurrentToken == TokenCategory.IDENTIFIER)
            {
                declList.Add(ParameterDeclaration());
            }
            Expect(TokenCategory.PARENTHESIS_CLOSE);

            if (CurrentToken == TokenCategory.DECL)
            {
                var declNode = new Identifier()
                {
                    AnchorToken = Expect(TokenCategory.DECL)
                };
                declNode.Add(procedureName);
                declNode.Add(Type());

                procedureNode.Add(declNode);
            }
            else
            {
                procedureNode.Add(procedureName);
            }

            Expect(TokenCategory.EOL);


            while (CurrentToken == TokenCategory.CONST)
            {
                declList.Add(ConstantDeclaration());
            }
            while (CurrentToken == TokenCategory.VAR)
            {
                declList.Add(VariableDeclaration());
            }


            stmtList.AnchorToken = (Expect(TokenCategory.BEGIN));
            while (firstOfStatement.Contains(CurrentToken))
            {
                stmtList.Add(Statement());
            }
            Expect(TokenCategory.END);
            Expect(TokenCategory.EOL);

            procedureName.Add(declList);
            procedureName.Add(stmtList);

            return(procedureNode);
        }