GSC Interpreter
A Turing-complete interpreter developed for a compiler course
Loading...
Searching...
No Matches
Parser Class Reference

Parser module for the GSC programming language. More...

#include <parser.hpp>

Collaboration diagram for Parser:

Classes

struct  ParseError
 

Public Member Functions

 Parser (const std::vector< Token > &tokens)
 Constructs a Parser object.
 
std::vector< std::shared_ptr< Stmt > > parse ()
 Parses the tokens and returns a vector of statements.
 

Private Member Functions

std::vector< std::shared_ptr< Stmt > > block ()
 
std::shared_ptr< Stmtdeclaration ()
 
std::shared_ptr< Stmtstatement ()
 
std::shared_ptr< StmtprintStatement ()
 
std::shared_ptr< StmtifStatement ()
 
std::shared_ptr< StmtwhileStatement ()
 
std::shared_ptr< StmtforStatement ()
 
std::shared_ptr< StmtvarDeclaration ()
 
std::shared_ptr< StmtexpressionStatement ()
 
std::shared_ptr< Exprassignment ()
 
std::shared_ptr< ExprorLogical ()
 
std::shared_ptr< ExprandLogical ()
 
std::shared_ptr< Exprexpression ()
 
std::shared_ptr< Exprequality ()
 
std::shared_ptr< Exprcomparison ()
 
std::shared_ptr< Exprterm ()
 
std::shared_ptr< Exprfactor ()
 
std::shared_ptr< Exprunary ()
 
std::shared_ptr< Exprprimary ()
 
template<class... T>
bool match (T... types)
 
bool check (TokenType type) const
 
bool isAtEnd () const
 
Token consume (TokenType type, std::string_view message)
 
Token advance ()
 
Token peek () const
 
Token previous () const
 
ParseError error (const Token &token, std::string_view message)
 
void synchronize ()
 

Private Attributes

const std::vector< Token > & tokens
 
int current = 0
 

Detailed Description

Parser module for the GSC programming language.

Parser is responsible for parsing the tokens generated by the Scanner and constructing an abstract syntax tree (AST) from them.

Definition at line 16 of file parser.hpp.

Constructor & Destructor Documentation

◆ Parser()

Parser::Parser ( const std::vector< Token > &  tokens)

Constructs a Parser object.

Parameters
tokensThe vector of tokens to parse.

Definition at line 5 of file parser.cpp.

5: tokens(tokens) {}
const std::vector< Token > & tokens
Definition parser.hpp:31

Member Function Documentation

◆ advance()

Token Parser::advance ( )
private

Definition at line 286 of file parser.cpp.

286 {
287 if (!isAtEnd())
288 current++;
289 return previous();
290}
Token previous() const
Definition parser.cpp:294
bool isAtEnd() const
Definition parser.cpp:275
int current
Definition parser.hpp:32

◆ andLogical()

std::shared_ptr< Expr > Parser::andLogical ( )
private

Definition at line 163 of file parser.cpp.

163 {
164 std::shared_ptr<Expr> expr = equality();
165
166 while (match(TokenType::AND)) {
167 Token operatorToken = previous();
168 std::shared_ptr<Expr> right = equality();
169 expr = std::make_shared<Logical>(expr, std::move(operatorToken), right);
170 }
171
172 return expr;
173}
std::shared_ptr< Expr > equality()
Definition parser.cpp:177
bool match(T... types)
Definition parser.cpp:257
Represents a token in the source code.
Definition token.hpp:14
@ AND
Definition tokenType.hpp:38

◆ assignment()

std::shared_ptr< Expr > Parser::assignment ( )
private

Definition at line 133 of file parser.cpp.

133 {
134 std::shared_ptr<Expr> expr = orLogical();
135
136 if (match(TokenType::EQUAL)) {
137 Token equals = previous();
138 std::shared_ptr<Expr> value = assignment();
139
140 if (std::shared_ptr<Variable> var =
141 std::dynamic_pointer_cast<Variable>(expr)) {
142 return std::make_shared<Assign>(var->getName(), value);
143 }
144
145 throw error(equals, "Invalid assignment target.");
146 }
147
148 return expr;
149}
std::shared_ptr< Expr > orLogical()
Definition parser.cpp:151
ParseError error(const Token &token, std::string_view message)
Definition parser.cpp:299
std::shared_ptr< Expr > assignment()
Definition parser.cpp:133
@ EQUAL
Definition tokenType.hpp:25

◆ block()

std::vector< std::shared_ptr< Stmt > > Parser::block ( )
private

Definition at line 122 of file parser.cpp.

122 {
123 std::vector<std::shared_ptr<Stmt>> statements;
124
125 while (!isAtEnd() && !check(TokenType::RIGHT_BRACE)) {
126 statements.push_back(declaration());
127 }
128
129 consume(TokenType::RIGHT_BRACE, "Expect '}' after block.");
130 return statements;
131}
Token consume(TokenType type, std::string_view message)
Definition parser.cpp:279
bool check(TokenType type) const
Definition parser.cpp:269
std::shared_ptr< Stmt > declaration()
Definition parser.cpp:16
@ RIGHT_BRACE
Definition tokenType.hpp:15

◆ check()

bool Parser::check ( TokenType  type) const
private

Definition at line 269 of file parser.cpp.

269 {
270 if (isAtEnd())
271 return false;
272 return peek().getType() == type;
273}
Token peek() const
Definition parser.cpp:292
TokenType getType() const
Definition token.cpp:8

◆ comparison()

std::shared_ptr< Expr > Parser::comparison ( )
private

Definition at line 189 of file parser.cpp.

189 {
190 std::shared_ptr<Expr> expr = term();
191
194 Token operatorToken = previous();
195 std::shared_ptr<Expr> right = term();
196 expr = std::make_shared<Binary>(expr, std::move(operatorToken), right);
197 }
198
199 return expr;
200}
std::shared_ptr< Expr > term()
Definition parser.cpp:202
@ GREATER
Definition tokenType.hpp:27
@ GREATER_EQUAL
Definition tokenType.hpp:28
@ LESS
Definition tokenType.hpp:29
@ LESS_EQUAL
Definition tokenType.hpp:30

◆ consume()

Token Parser::consume ( TokenType  type,
std::string_view  message 
)
private

Definition at line 279 of file parser.cpp.

279 {
280 if (check(type))
281 return advance();
282
283 throw error(peek(), message);
284}
Token advance()
Definition parser.cpp:286

◆ declaration()

std::shared_ptr< Stmt > Parser::declaration ( )
private

Definition at line 16 of file parser.cpp.

16 {
17 try {
19 return varDeclaration();
20 return statement();
21 } catch (ParseError &error) {
23 return nullptr; // Return null on error
24 }
25}
void synchronize()
Definition parser.cpp:304
std::shared_ptr< Stmt > varDeclaration()
Definition parser.cpp:104
std::shared_ptr< Stmt > statement()
Definition parser.cpp:27
@ VAR
Definition tokenType.hpp:48

◆ equality()

std::shared_ptr< Expr > Parser::equality ( )
private

Definition at line 177 of file parser.cpp.

177 {
178 std::shared_ptr<Expr> expr = comparison();
179
181 Token operatorToken = previous();
182 std::shared_ptr<Expr> right = comparison();
183 expr = std::make_shared<Binary>(expr, std::move(operatorToken), right);
184 }
185
186 return expr;
187}
std::shared_ptr< Expr > comparison()
Definition parser.cpp:189
@ EQUAL_EQUAL
Definition tokenType.hpp:26
@ BANG_EQUAL
Definition tokenType.hpp:24

◆ error()

Parser::ParseError Parser::error ( const Token token,
std::string_view  message 
)
private

Definition at line 299 of file parser.cpp.

299 {
300 ::error(token, std::string(message));
301 return ParseError("");
302}

◆ expression()

std::shared_ptr< Expr > Parser::expression ( )
private

Definition at line 175 of file parser.cpp.

175{ return assignment(); }

◆ expressionStatement()

std::shared_ptr< Stmt > Parser::expressionStatement ( )
private

Definition at line 116 of file parser.cpp.

116 {
117 std::shared_ptr<Expr> expr = expression();
118 consume(TokenType::SEMICOLON, "Expect ';' after expression.");
119 return std::make_shared<Expression>(expr);
120}
std::shared_ptr< Expr > expression()
Definition parser.cpp:175
@ SEMICOLON
Definition tokenType.hpp:18

◆ factor()

std::shared_ptr< Expr > Parser::factor ( )
private

Definition at line 214 of file parser.cpp.

214 {
215 std::shared_ptr<Expr> expr = unary();
216
218 Token operatorToken = previous();
219 std::shared_ptr<Expr> right = unary();
220 expr = std::make_shared<Binary>(expr, std::move(operatorToken), right);
221 }
222
223 return expr;
224}
std::shared_ptr< Expr > unary()
Definition parser.cpp:226
@ STAR
Definition tokenType.hpp:20
@ SLASH
Definition tokenType.hpp:19

◆ forStatement()

std::shared_ptr< Stmt > Parser::forStatement ( )
private

Definition at line 69 of file parser.cpp.

69 {
70 consume(TokenType::LEFT_PAREN, "Expect '(' after 'for'.");
71
72 std::shared_ptr<Stmt> initializer =
74 ? nullptr
76
77 std::shared_ptr<Expr> condition =
79 consume(SEMICOLON, "Expect ';' after loop condition.");
80
81 std::shared_ptr<Expr> increment =
83 consume(TokenType::RIGHT_PAREN, "Expect ')' after for parameters.");
84
85 std::shared_ptr<Stmt> body = statement();
86
87 // Desugaring for statement
88 if (increment)
89 body = std::make_shared<Block>(std::vector<std::shared_ptr<Stmt>>{
90 body, std::make_shared<Expression>(increment)});
91
92 if (condition == nullptr)
93 condition = std::make_shared<Literal>(true);
94
95 body = std::make_shared<While>(condition, body);
96
97 if (initializer)
98 body = std::make_shared<Block>(
99 std::vector<std::shared_ptr<Stmt>>{initializer, body});
100
101 return body;
102}
std::shared_ptr< Stmt > expressionStatement()
Definition parser.cpp:116
@ LEFT_PAREN
Definition tokenType.hpp:12
@ RIGHT_PAREN
Definition tokenType.hpp:13

◆ ifStatement()

std::shared_ptr< Stmt > Parser::ifStatement ( )
private

Definition at line 48 of file parser.cpp.

48 {
49 consume(TokenType::LEFT_PAREN, "Expect '(' after 'if'.");
50 std::shared_ptr<Expr> condition = expression();
51 consume(TokenType::RIGHT_PAREN, "Expect ')' after if condition.");
52
53 std::shared_ptr<Stmt> thenBranch = statement();
54 std::shared_ptr<Stmt> elseBranch =
55 match(TokenType::ELSE) ? statement() : nullptr;
56
57 return std::make_shared<If>(condition, thenBranch, elseBranch);
58}
@ ELSE
Definition tokenType.hpp:41

◆ isAtEnd()

bool Parser::isAtEnd ( ) const
private

Definition at line 275 of file parser.cpp.

275 {
276 return peek().getType() == TokenType::END_OF_FILE;
277}
@ END_OF_FILE
Definition tokenType.hpp:50

◆ match()

template<class... T>
bool Parser::match ( T...  types)
private

Definition at line 257 of file parser.cpp.

257 {
258 assert((std::is_same_v<T, TokenType> && ...));
259
260 for (TokenType type : {types...}) {
261 if (check(type)) {
262 advance();
263 return true;
264 }
265 }
266 return false;
267}
TokenType
Enum representing the different types of tokens in the GSC language.
Definition tokenType.hpp:10

◆ orLogical()

std::shared_ptr< Expr > Parser::orLogical ( )
private

Definition at line 151 of file parser.cpp.

151 {
152 std::shared_ptr<Expr> expr = andLogical();
153
154 while (match(TokenType::OR)) {
155 Token operatorToken = previous();
156 std::shared_ptr<Expr> right = andLogical();
157 expr = std::make_shared<Logical>(expr, std::move(operatorToken), right);
158 }
159
160 return expr;
161}
std::shared_ptr< Expr > andLogical()
Definition parser.cpp:163
@ OR
Definition tokenType.hpp:39

◆ parse()

std::vector< std::shared_ptr< Stmt > > Parser::parse ( )

Parses the tokens and returns a vector of statements.

This function processes the tokens and constructs an abstract syntax tree (AST) represented as a vector of statements.

Returns
std::vector<std::shared_ptr<Stmt>> A vector of shared pointers to the parsed statements.

Definition at line 7 of file parser.cpp.

7 {
8 std::vector<std::shared_ptr<Stmt>> statements;
9 while (!isAtEnd()) {
10 statements.push_back(declaration());
11 }
12
13 return statements;
14}

◆ peek()

Token Parser::peek ( ) const
private

Definition at line 292 of file parser.cpp.

292{ return tokens[current]; }

◆ previous()

Token Parser::previous ( ) const
private

Definition at line 294 of file parser.cpp.

294 {
295 assert(current > 0);
296 return tokens[current - 1];
297}

◆ primary()

std::shared_ptr< Expr > Parser::primary ( )
private

Definition at line 236 of file parser.cpp.

236 {
238 return std::make_shared<Literal>(nullptr);
239 else if (match(TokenType::TRUE))
240 return std::make_shared<Literal>(true);
241 else if (match(TokenType::FALSE))
242 return std::make_shared<Literal>(false);
244 return std::make_shared<Literal>(previous().getLiteral());
245 } else if (match(TokenType::IDENTIFIER)) {
246 return std::make_shared<Variable>(previous());
247 } else if (match(TokenType::LEFT_PAREN)) {
248 std::shared_ptr<Expr> expr = expression();
249 consume(TokenType::RIGHT_PAREN, "Expect ')' after expression.");
250 return std::make_shared<Grouping>(std::move(expr));
251 } else {
252 std::string_view message = "Expect expression.";
253 throw error(peek(), message);
254 }
255}
@ NUMBER
Definition tokenType.hpp:35
@ NIL
Definition tokenType.hpp:46
@ IDENTIFIER
Definition tokenType.hpp:33
@ FALSE
Definition tokenType.hpp:43
@ TRUE
Definition tokenType.hpp:42
@ STRING
Definition tokenType.hpp:34

◆ printStatement()

std::shared_ptr< Stmt > Parser::printStatement ( )
private

Definition at line 42 of file parser.cpp.

42 {
43 std::shared_ptr<Expr> value = expression();
44 consume(TokenType::SEMICOLON, "Expect ';' after value.");
45 return std::make_shared<Print>(value);
46}

◆ statement()

std::shared_ptr< Stmt > Parser::statement ( )
private

Definition at line 27 of file parser.cpp.

27 {
29 return printStatement();
30 else if (match(TokenType::IF))
31 return ifStatement();
32 else if (match(TokenType::WHILE))
33 return whileStatement();
34 else if (match(TokenType::FOR))
35 return forStatement();
37 return std::make_shared<Block>(block());
38 else
39 return expressionStatement();
40}
std::shared_ptr< Stmt > ifStatement()
Definition parser.cpp:48
std::shared_ptr< Stmt > printStatement()
Definition parser.cpp:42
std::vector< std::shared_ptr< Stmt > > block()
Definition parser.cpp:122
std::shared_ptr< Stmt > whileStatement()
Definition parser.cpp:60
std::shared_ptr< Stmt > forStatement()
Definition parser.cpp:69
@ IF
Definition tokenType.hpp:40
@ WHILE
Definition tokenType.hpp:45
@ FOR
Definition tokenType.hpp:44
@ LEFT_BRACE
Definition tokenType.hpp:14
@ PRINT
Definition tokenType.hpp:47

◆ synchronize()

void Parser::synchronize ( )
private

Definition at line 304 of file parser.cpp.

304 {
305 advance();
306
307 while (!isAtEnd()) {
308 if (previous().getType() == TokenType::SEMICOLON)
309 return;
310
311 switch (peek().getType()) {
312 case TokenType::VAR:
313 case TokenType::FOR:
314 case TokenType::IF:
315 case TokenType::WHILE:
316 case TokenType::PRINT:
317 return;
318 default:
319 break;
320 }
321
322 advance();
323 }
324}

◆ term()

std::shared_ptr< Expr > Parser::term ( )
private

Definition at line 202 of file parser.cpp.

202 {
203 std::shared_ptr<Expr> expr = factor();
204
206 Token operatorToken = previous();
207 std::shared_ptr<Expr> right = factor();
208 expr = std::make_shared<Binary>(expr, std::move(operatorToken), right);
209 }
210
211 return expr;
212}
std::shared_ptr< Expr > factor()
Definition parser.cpp:214
@ PLUS
Definition tokenType.hpp:17
@ MINUS
Definition tokenType.hpp:16

◆ unary()

std::shared_ptr< Expr > Parser::unary ( )
private

Definition at line 226 of file parser.cpp.

226 {
228 Token operatorToken = previous();
229 std::shared_ptr<Expr> right = unary();
230 return std::make_shared<Unary>(std::move(operatorToken), right);
231 }
232
233 return primary();
234}
std::shared_ptr< Expr > primary()
Definition parser.cpp:236
@ BANG
Definition tokenType.hpp:23

◆ varDeclaration()

std::shared_ptr< Stmt > Parser::varDeclaration ( )
private

Definition at line 104 of file parser.cpp.

104 {
105 Token name = consume(TokenType::IDENTIFIER, "Expect variable name.");
106 std::shared_ptr<Expr> initializer = nullptr;
107
108 if (match(TokenType::EQUAL)) {
109 initializer = expression();
110 }
111
112 consume(TokenType::SEMICOLON, "Expect ';' after variable declaration.");
113 return std::make_shared<Var>(std::move(name), initializer);
114}

◆ whileStatement()

std::shared_ptr< Stmt > Parser::whileStatement ( )
private

Definition at line 60 of file parser.cpp.

60 {
61 consume(TokenType::LEFT_PAREN, "Expect '(' after 'while'.");
62 std::shared_ptr<Expr> condition = expression();
63 consume(TokenType::RIGHT_PAREN, "Expect ')' after while condition.");
64
65 std::shared_ptr<Stmt> body = statement();
66 return std::make_shared<While>(condition, body);
67}

Member Data Documentation

◆ current

int Parser::current = 0
private

Definition at line 32 of file parser.hpp.

◆ tokens

const std::vector<Token>& Parser::tokens
private

Definition at line 31 of file parser.hpp.


The documentation for this class was generated from the following files: