From 8c56ddf0b640b8880eb5b97e5ca1b787585c29c0 Mon Sep 17 00:00:00 2001 From: Johnny Richard Date: Mon, 1 May 2023 01:57:21 +0200 Subject: parser: Use peek and drop token when parsing expressions --- src/parser.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/parser.c') diff --git a/src/parser.c b/src/parser.c index 662449b..af372fb 100644 --- a/src/parser.c +++ b/src/parser.c @@ -167,9 +167,11 @@ parser_parse_term(parser_t *parser, ast_node_t *node) return false; token_t token; - lexer_next_token(parser->lexer, &token); + lexer_peek_next_token(parser->lexer, &token); while (token.kind == TOKEN_STAR || token.kind == TOKEN_SLASH) { + lexer_drop_next_token(parser->lexer); + ast_node_t *left = ast_node_new(); *left = *node; @@ -179,11 +181,9 @@ parser_parse_term(parser_t *parser, ast_node_t *node) ast_node_init_binary_operation(node, token_to_binary_operation_kind(&token), left, right); - lexer_next_token(parser->lexer, &token); + lexer_peek_next_token(parser->lexer, &token); } - lexer_step_back_to(parser->lexer, &token); - return true; } @@ -201,9 +201,11 @@ parser_parse_expression(parser_t *parser, ast_node_t *node) return false; token_t token; - lexer_next_token(parser->lexer, &token); + lexer_peek_next_token(parser->lexer, &token); while (token.kind == TOKEN_PLUS || token.kind == TOKEN_MINUS) { + lexer_drop_next_token(parser->lexer); + ast_node_t *left = ast_node_new(); *left = *node; @@ -213,11 +215,9 @@ parser_parse_expression(parser_t *parser, ast_node_t *node) ast_node_init_binary_operation(node, token_to_binary_operation_kind(&token), left, right); - lexer_next_token(parser->lexer, &token); + lexer_peek_next_token(parser->lexer, &token); } - lexer_step_back_to(parser->lexer, &token); - return true; } -- cgit v1.2.3