8 error_fatal(
"Memory allocation failed for parser");
12 parser->lexer = lexer;
13 parser->current_token = lexer_next_token(lexer);
14 parser->peek_token = lexer_next_token(lexer);
19void parser_destroy(
Parser *parser) {
25void parser_advance(
Parser *parser) {
26 parser->current_token = parser->peek_token;
27 parser->peek_token = lexer_next_token(parser->lexer);
31 return parser->current_token.type == type;
35 if (parser_match(parser, type)) {
36 parser_advance(parser);
39 error_syntax(parser->current_token.line, parser->current_token.column,
40 "Expected %s, got %s",
41 token_type_to_string(type),
42 token_type_to_string(parser->current_token.type));
47bool parser_is_type_specifier(
TokenType type) {
48 return type == TOKEN_INT || type == TOKEN_CHAR_KW || type == TOKEN_VOID;
52 DataType type = token_to_data_type(parser->current_token.type);
53 if (type != TYPE_UNKNOWN) {
54 parser_advance(parser);
58 error_syntax(parser->current_token.line, parser->current_token.column,
59 "Expected type specifier");
66 case TOKEN_INT:
return TYPE_INT;
67 case TOKEN_CHAR_KW:
return TYPE_CHAR;
68 case TOKEN_VOID:
return TYPE_VOID;
69 default:
return TYPE_UNKNOWN;
74 ASTNode *program = ast_create_program();
76 while (!parser_match(parser, TOKEN_EOF)) {
78 if (parser->current_token.type == TOKEN_UNKNOWN) {
79 parser_advance(parser);
83 ASTNode *declaration = parser_parse_declaration(parser);
86 ast_add_declaration(program, declaration);
89 while (!parser_match(parser, TOKEN_EOF) &&
90 !parser_is_type_specifier(parser->current_token.type)) {
91 parser_advance(parser);
101 if (!parser_is_type_specifier(parser->current_token.type)) {
106 TokenType type_token = parser->current_token.type;
107 DataType data_type = token_type_to_data_type(type_token);
108 parser_advance(parser);
111 if (parser->current_token.type != TOKEN_IDENTIFIER) {
115 char *name = strdup(parser->current_token.value);
116 parser_advance(parser);
119 if (parser->current_token.type == TOKEN_LPAREN) {
121 ASTNode *result = parser_parse_function(parser, data_type, name);
124 }
else if (parser->current_token.type == TOKEN_SEMICOLON) {
126 parser_advance(parser);
127 ASTNode *result = parser_create_variable_declaration(data_type, name);
139 if (parser->current_token.type != TOKEN_LPAREN) {
142 parser_advance(parser);
145 if (parser->current_token.type != TOKEN_RPAREN) {
147 while (parser->current_token.type != TOKEN_RPAREN &&
148 parser->current_token.type != TOKEN_EOF) {
149 parser_advance(parser);
153 if (parser->current_token.type == TOKEN_RPAREN) {
154 parser_advance(parser);
158 if (parser->current_token.type == TOKEN_SEMICOLON) {
160 parser_advance(parser);
161 return parser_create_function_declaration(return_type, name);
162 }
else if (parser->current_token.type == TOKEN_LBRACE) {
164 return parser_parse_function_definition(parser, return_type, name);
172 ASTNode *body = parser_parse_compound_statement(parser);
178 ASTNode *func = parser_create_function_declaration(return_type, name);
189ASTNode *parser_create_function_declaration(
DataType return_type,
const char *name) {
192 return ast_create_function_decl(return_type, name, NULL, NULL);
196ASTNode *parser_create_variable_declaration(
DataType type,
const char *name) {
199 return ast_create_var_decl(type, name, NULL);
205 if (parser_match(parser, TOKEN_ASSIGN)) {
206 parser_advance(parser);
207 initializer = parser_parse_expression(parser);
210 parser_expect(parser, TOKEN_SEMICOLON);
212 return ast_create_var_decl(var_type,
"", initializer);
216 switch (parser->current_token.type) {
218 return parser_parse_compound_statement(parser);
220 return parser_parse_return_statement(parser);
222 return parser_parse_if_statement(parser);
224 return parser_parse_while_statement(parser);
226 return parser_parse_for_statement(parser);
228 parser_advance(parser);
229 parser_expect(parser, TOKEN_SEMICOLON);
230 return ast_create_break_stmt();
232 parser_advance(parser);
233 parser_expect(parser, TOKEN_SEMICOLON);
234 return ast_create_continue_stmt();
236 return parser_parse_expression_statement(parser);
241 ASTNode *compound = ast_create_compound_stmt();
243 parser_expect(parser, TOKEN_LBRACE);
245 while (!parser_match(parser, TOKEN_RBRACE) && !parser_match(parser, TOKEN_EOF)) {
248 if (parser_is_type_specifier(parser->current_token.type)) {
250 DataType var_type = parser_parse_type_specifier(parser);
252 if (parser_match(parser, TOKEN_IDENTIFIER)) {
253 char *var_name = strdup(parser->current_token.value);
254 parser_advance(parser);
256 ASTNode *var_decl = parser_parse_variable_declaration(parser, var_type);
258 free(var_decl->data.var_decl.name);
259 var_decl->data.var_decl.name = var_name;
266 stmt = parser_parse_statement(parser);
270 ast_add_statement(compound, stmt);
274 parser_expect(parser, TOKEN_RBRACE);
280 ASTNode *expr = parser_parse_expression(parser);
281 parser_expect(parser, TOKEN_SEMICOLON);
282 return ast_create_expression_stmt(expr);
286 parser_advance(parser);
289 if (!parser_match(parser, TOKEN_SEMICOLON)) {
290 expr = parser_parse_expression(parser);
293 parser_expect(parser, TOKEN_SEMICOLON);
295 return ast_create_return_stmt(expr);
299 parser_advance(parser);
301 parser_expect(parser, TOKEN_LPAREN);
302 ASTNode *condition = parser_parse_expression(parser);
303 parser_expect(parser, TOKEN_RPAREN);
305 ASTNode *then_stmt = parser_parse_statement(parser);
308 if (parser_match(parser, TOKEN_ELSE)) {
309 parser_advance(parser);
310 else_stmt = parser_parse_statement(parser);
313 return ast_create_if_stmt(condition, then_stmt, else_stmt);
317 parser_advance(parser);
319 parser_expect(parser, TOKEN_LPAREN);
320 ASTNode *condition = parser_parse_expression(parser);
321 parser_expect(parser, TOKEN_RPAREN);
323 ASTNode *body = parser_parse_statement(parser);
325 return ast_create_while_stmt(condition, body);
329 parser_advance(parser);
331 parser_expect(parser, TOKEN_LPAREN);
334 if (!parser_match(parser, TOKEN_SEMICOLON)) {
335 init = parser_parse_expression(parser);
337 parser_expect(parser, TOKEN_SEMICOLON);
340 if (!parser_match(parser, TOKEN_SEMICOLON)) {
341 condition = parser_parse_expression(parser);
343 parser_expect(parser, TOKEN_SEMICOLON);
346 if (!parser_match(parser, TOKEN_RPAREN)) {
347 update = parser_parse_expression(parser);
349 parser_expect(parser, TOKEN_RPAREN);
351 ASTNode *body = parser_parse_statement(parser);
353 return ast_create_for_stmt(init, condition, update, body);
357 return parser_parse_assignment_expression(parser);
361 ASTNode *left = parser_parse_logical_or_expression(parser);
363 if (parser_match(parser, TOKEN_ASSIGN)) {
364 parser_advance(parser);
365 ASTNode *right = parser_parse_assignment_expression(parser);
367 if (left->type == AST_IDENTIFIER) {
368 return ast_create_assignment(left->data.identifier.name, right);
370 error_syntax(parser->current_token.line, parser->current_token.column,
371 "Invalid left-hand side in assignment");
379 ASTNode *left = parser_parse_logical_and_expression(parser);
381 while (parser_match(parser, TOKEN_OR)) {
382 TokenType op = parser->current_token.type;
383 parser_advance(parser);
384 ASTNode *right = parser_parse_logical_and_expression(parser);
385 left = ast_create_binary_expr(op, left, right);
391ASTNode *parser_parse_logical_and_expression(
Parser *parser) {
392 ASTNode *left = parser_parse_equality_expression(parser);
394 while (parser_match(parser, TOKEN_AND)) {
395 TokenType op = parser->current_token.type;
396 parser_advance(parser);
397 ASTNode *right = parser_parse_equality_expression(parser);
398 left = ast_create_binary_expr(op, left, right);
405 ASTNode *left = parser_parse_relational_expression(parser);
407 while (parser_match(parser, TOKEN_EQUAL) || parser_match(parser, TOKEN_NOT_EQUAL)) {
408 TokenType op = parser->current_token.type;
409 parser_advance(parser);
410 ASTNode *right = parser_parse_relational_expression(parser);
411 left = ast_create_binary_expr(op, left, right);
418 ASTNode *left = parser_parse_additive_expression(parser);
420 while (parser_match(parser, TOKEN_LESS) || parser_match(parser, TOKEN_LESS_EQUAL) ||
421 parser_match(parser, TOKEN_GREATER) || parser_match(parser, TOKEN_GREATER_EQUAL)) {
422 TokenType op = parser->current_token.type;
423 parser_advance(parser);
424 ASTNode *right = parser_parse_additive_expression(parser);
425 left = ast_create_binary_expr(op, left, right);
432 ASTNode *left = parser_parse_multiplicative_expression(parser);
434 while (parser_match(parser, TOKEN_PLUS) || parser_match(parser, TOKEN_MINUS)) {
435 TokenType op = parser->current_token.type;
436 parser_advance(parser);
437 ASTNode *right = parser_parse_multiplicative_expression(parser);
438 left = ast_create_binary_expr(op, left, right);
444ASTNode *parser_parse_multiplicative_expression(
Parser *parser) {
445 ASTNode *left = parser_parse_unary_expression(parser);
447 while (parser_match(parser, TOKEN_MULTIPLY) || parser_match(parser, TOKEN_DIVIDE) ||
448 parser_match(parser, TOKEN_MODULO)) {
449 TokenType op = parser->current_token.type;
450 parser_advance(parser);
451 ASTNode *right = parser_parse_unary_expression(parser);
452 left = ast_create_binary_expr(op, left, right);
459 if (parser_match(parser, TOKEN_MINUS) || parser_match(parser, TOKEN_NOT)) {
460 TokenType op = parser->current_token.type;
461 parser_advance(parser);
462 ASTNode *operand = parser_parse_unary_expression(parser);
463 return ast_create_unary_expr(op, operand);
466 return parser_parse_primary_expression(parser);
472 switch (parser->current_token.type) {
474 int value = atoi(parser->current_token.value);
475 primary = ast_create_number(value);
476 parser_advance(parser);
480 primary = ast_create_string(parser->current_token.value);
481 parser_advance(parser);
484 case TOKEN_IDENTIFIER: {
485 primary = ast_create_identifier(parser->current_token.value);
486 parser_advance(parser);
490 parser_advance(parser);
491 primary = parser_parse_expression(parser);
492 parser_expect(parser, TOKEN_RPAREN);
496 error_syntax(parser->current_token.line, parser->current_token.column,
497 "Expected primary expression");
502 if (primary && primary->type == AST_IDENTIFIER && parser_match(parser, TOKEN_LPAREN)) {
503 primary = parser_parse_call_expression(parser, primary);
510 if (primary->type != AST_IDENTIFIER) {
514 ASTNode *call = ast_create_call_expr(primary->data.identifier.name);
516 parser_advance(parser);
518 if (!parser_match(parser, TOKEN_RPAREN)) {
520 ASTNode *arg = parser_parse_expression(parser);
522 ast_add_argument(call, arg);
525 if (parser_match(parser, TOKEN_COMMA)) {
526 parser_advance(parser);
533 parser_expect(parser, TOKEN_RPAREN);
536 ast_destroy(primary);
TokenType
Token types for lexical analysis.
DataType
Data types supported by the compiler.