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