From 7dbec8d29413d62967ed7eb5854dd56b1a2814ab Mon Sep 17 00:00:00 2001 From: c Date: Sat, 3 Feb 2024 17:34:25 -0500 Subject: Parser now parses blocks and simple calls. --- src/parser.c | 61 ++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 22 deletions(-) (limited to 'src/parser.c') diff --git a/src/parser.c b/src/parser.c index 9da3da0..f7ababe 100644 --- a/src/parser.c +++ b/src/parser.c @@ -28,9 +28,10 @@ int parser_nxt_token(parser_t* parser) { tree_t* parser_parse_init(parser_t* parser) { /* There is nothing to do. */ - if (!parser->token || parser->token->type == TOKEN_TYPE_RBLOCK) { + if (!parser->token) { return NULL; } + tree_t* block; block = tree_init(TREE_TYPE_BLOCK); @@ -46,14 +47,13 @@ tree_t* parser_parse_block(parser_t* parser) { (void) parser_nxt_token(parser); /* Skip over closing bracket. */ return NULL; } + tree_t* block; block = tree_init(TREE_TYPE_BLOCK); block->data.block.val = parser_parse_expr(parser); block->data.block.nxt = parser_parse_block(parser); - parser_nxt_token(parser); /* Skip over semicolon. */ - return block; } @@ -68,20 +68,53 @@ tree_t* parser_parse_expr(parser_t* parser) { expr = parser_parse_lstr(parser); break; case TOKEN_TYPE_LBLOCK: + /* TODO: Move this into parser_parse_block, parser_parse_init exists now. */ parser_nxt_token(parser); /* Skip over opening curly bracket. */ expr = parser_parse_block(parser); break; + case TOKEN_TYPE_KWD: + expr = parser_parse_kwd(parser); + break; default: - log_war("%s: Unknown token type: %d", __func__, parser->token->type); + LOG_WARF("%s: Unknown token type: %d", __func__, parser->token->type); parser_nxt_token(parser); } return expr; } +tree_t* parser_parse_carg(parser_t* parser) { + tree_t* carg; + + carg = tree_init(TREE_TYPE_CARG); + + carg->data.carg.val = parser_parse_expr(parser); + + carg->data.carg.nxt = NULL; + + return carg; +} + +tree_t* parser_parse_kwd(parser_t* parser) { + tree_t* call; + + call = tree_init(TREE_TYPE_CALL); + + call->data.call.target = parser->token->val; + parser->token->val = NULL; + + if (parser_nxt_token_match(parser, TOKEN_TYPE_APPLY)) { + call->data.call.arg = parser_parse_carg(parser); + } else { + call->data.call.arg = NULL; + } + + return call; +} + /* I don't know if these need to exist. Guess I'll wait and seeā€¦ */ int parser_match(parser_t* parser, token_type_t type) { - return parser->token->type == type; + return parser->token ? parser->token->type == type : 0; } int parser_nxt_token_match(parser_t* parser, token_type_t type) { @@ -140,7 +173,7 @@ tree_t* parser_parse_darg(parser_t* parser) { darg->data.darg.tag = parser_parse_tag(parser); - log_war("%d", parser->token->type); + LOG_WARF("%d", parser->token->type); if (parser->token->type != TOKEN_TYPE_LIST_DELIM) { darg->data.darg.nxt = NULL; @@ -169,22 +202,6 @@ tree_t* parser_parse_def(parser_t* parser) { return def; } -tree_t* parser_parse_carg(parser_t* parser) { - tree_t* carg; - - carg = tree_init(TREE_TYPE_CARG); - - carg->data.carg.val = parser_parse_expr(parser); - carg->data.carg.nxt = ( - parser_nxt_token_match(parser, TOKEN_TYPE_LIST_DELIM) && - parser_nxt_token(parser) - ) ? - parser_parse_carg(parser) : - NULL; - - return carg; -} - tree_t* parser_parse_call(parser_t* parser) { tree_t* call; -- cgit v1.2.3