mjplusplus  v0.4.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
parser.hpp
Go to the documentation of this file.
1 #ifndef PARSER_HPP
2 #define PARSER_HPP
3 
4 #include <memory>
5 #include "../globals.hpp"
6 
7 #include "../util/ErrorReporter.hpp"
8 #include "../lexer/lexer.hpp"
9 #include "../ast/Program.hpp"
10 #include "../ast/ClassMember.hpp"
11 #include "../ast/ClassDeclaration.hpp"
12 #include "../ast/MainMethodDeclaration.hpp"
13 #include "../ast/FieldDeclaration.hpp"
14 #include "../ast/LVDStatement.hpp"
15 #include "../ast/Block.hpp"
16 #include "../ast/ExpressionStatement.hpp"
17 #include "../ast/Statement.hpp"
18 #include "../ast/IfStatement.hpp"
19 #include "../ast/WhileStatement.hpp"
20 #include "../ast/ReturnStatement.hpp"
21 #include "../ast/PostfixExpression.hpp"
22 #include "../ast/PostfixOp.hpp"
23 #include "../ast/ArrayAccess.hpp"
24 #include "../ast/FieldAccess.hpp"
25 #include "../ast/MethodInvocation.hpp"
26 #include "../ast/UnaryExpression.hpp"
27 #include "../ast/BinaryExpression.hpp"
28 #include "../ast/PrimaryExpression.hpp"
29 #include "../ast/Type.hpp"
30 #include "../ast/TypeIdent.hpp"
31 
32 class Parser
33 {
34  public:
40  Parser(lexer::Lexer& lexer, shptr<ErrorReporter> errorReporter); // TODO: determine parameters
41 
45  bool start();
50 
51  private:
52  lexer::Lexer& lexer;
53  shptr<ErrorReporter> errorReporter;
54  shptr<ast::Program> astRoot;
55  lexer::Token current;
56 
60  bool error_mode = false;
64  bool errors_found = false;
65 
66 
70  void nextToken();
75  void expect(lexer::Token::Token_type const& tokenType);
80  void expect(lexer::Token::Token_type const& tokenType, std::string const& string_val);
81 
85  void reportError(std::string const& error_msg);
86 
87  /*
88  * Precedences of all operators, associativity is stored implicitly
89  */
90  int operator_precs(lexer::Token::Token_type t);
91 
92  shptr<ast::Program> parseProgram();
93  shptr<vec<shptr<ast::ClassMember>>> parseClassMembers();
94  shptr<ast::MainMethodDeclaration> parseMainMethod();
95 
96  shptr<ast::TypeIdent> parseTypeIdent();
97  shptr<ast::Type> parseType();
98  shptr<ast::Type> parseBasicType();
99  int parseArrayDecl();
100  shptr<ast::Expression> parseNewArrayExpression();
101  int parseOptionalBrackets();
102 
103  shptr<ast::ClassMember> parseFieldOrMethod();
104  shptr<vec<shptr<ast::TypeIdent>>> parseOptionalParameters();
105  shptr<ast::Arguments> parseArguments();
106 
107  shptr<ast::stmt::Statement> parseStatement();
108  shptr<ast::stmt::Block> parseBlock();
109  shptr<ast::stmt::Statement> parseBlockStatement();
110  shptr<ast::stmt::LVDStatement> parseLocalVariableDeclarationStatement();
111  shptr<ast::stmt::IfStatement> parseIfStatement();
112  shptr<ast::stmt::WhileStatement> parseWhileStatement();
113  shptr<ast::stmt::ReturnStatement> parseReturnStatement(source_position_t position);
114 
115  shptr<ast::Expression> parseExpression();
116  shptr<ast::Expression> precedenceClimb(int minPrec);
117  shptr<ast::Expression> parseUnaryExpression();
118 
119  shptr<ast::Expression> parsePrimaryExpression();
120  shptr<vec<shptr<ast::po::PostfixOp>>> parsePostfixOps();
121  shptr<ast::po::PostfixOp> parseMethodInvocationOrFieldAccess();
122 
123  shptr<ast::Expression> parseNewObjectExpression();
124  shptr<ast::Expression> parseNewObjectOrNewArrayExpression();
125 
126 };
127 
128 #endif
Definition: lexer.hpp:13
Definition: PositionAwareNode.hpp:6
Definition: token.hpp:11
std::pair< unsigned int, unsigned int > source_position_t
Definition: globals.hpp:10
Parser(lexer::Lexer &lexer, shptr< ErrorReporter > errorReporter)
Definition: parser.cpp:7
Token_type
Definition: token.hpp:21
Definition: parser.hpp:32
std::shared_ptr< T > shptr
Definition: globals.hpp:7
bool start()
shptr< ast::Program > getRoot()