From c3c0f8f78085bdc4698263513aea0c9b2d33bae4 Mon Sep 17 00:00:00 2001 From: c+1 Date: Tue, 21 Nov 2023 10:16:23 -0500 Subject: Basic block, expression, and number parsing. --- src/parser.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 67 insertions(+), 5 deletions(-) (limited to 'src/parser.c') diff --git a/src/parser.c b/src/parser.c index 0b2fa37..fb8a4aa 100644 --- a/src/parser.c +++ b/src/parser.c @@ -25,17 +25,79 @@ int parser_nxt_token(parser_t* parser) { } int parser_match(parser_t* parser, token_type_t type) { - return parser->token->type == type; + if (parser->token->type == type) { + return 1; + } else { + log_err("Unexpected token."); + return 0; + } } -void parser_parse_lit(parser_t* parser) { +int parser_nxt_token_match(parser_t* parser, token_type_t type) { + parser_nxt_token(parser); + return parser_match(parser, type); +} + +tree_t* parser_parse_lit(parser_t* parser) { + tree_t* lint; + + lint = tree_init(TREE_TYPE_LINT); + lint->data.lint.val = atoi(parser->token->val); + + return lint; +} + +tree_t* parser_parse_expr(parser_t* parser) { + tree_t* expr; + + expr = tree_init(TREE_TYPE_EXPR); + + /* For now this is the only type of expression. */ + expr->data.expr.val = parser_parse_lit(parser); + + return expr; } -void parser_parser_expr(parser_t* parser) { +tree_t* parser_parse_block(parser_t* parser) { + tree_t* block; + + block = tree_init(TREE_TYPE_BLOCK); + + if (parser->token->type == TOKEN_EXPR_END) { + if (parser_nxt_token(parser)) { + block->data.block.val = parser_parse_expr(parser); + } else { + block->data.block.val = NULL; + } + + if (parser_nxt_token(parser)) { + block->data.block.nxt = parser_parse_block(parser); + } else { + block->data.block.nxt = NULL; + } + + return block; + } + + if (parser->token) { + block->data.block.val = parser_parse_expr(parser); + } else { + block->data.block.val = NULL; + } + + if (parser_nxt_token(parser)) { + block->data.block.nxt = parser_parse_block(parser); + } else { + block->data.block.nxt = NULL; + } + + return block; } -void parser_parse_blk(parser_t* parser) { +tree_t* parser_parse(parser_t* parser) { + return parser_parse_block(parser); } -void parser_parse(parser_t* parser) { +void parser_run(parser_t* parser) { + parser->tree = parser_parse(parser); } -- cgit v1.2.3