aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorc2023-12-05 12:41:05 -0500
committerc2023-12-05 12:41:05 -0500
commit3139398d475830f976895d27e772d4e926490881 (patch)
treeea91cd31c6c12739670fd958a1cf9fd445ea2b28 /src/parser.c
parent9f051cf7a3483935c9a740c5339c19fedbdc80e4 (diff)
Made AST output look fancy.
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c52
1 files changed, 15 insertions, 37 deletions
diff --git a/src/parser.c b/src/parser.c
index 06c72d4..7b9dbaa 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -73,6 +73,11 @@ tree_t* parser_parse_expr(parser_t* parser) {
break;
case TOKEN_TAG:
expr->data.expr.val = parser_parse_def(parser);
+ break;
+ case TOKEN_LBLOCK:
+ parser_nxt_token(parser);
+ expr->data.expr.val = parser_parse_block(parser);
+ break;
default:
return expr;
}
@@ -81,37 +86,16 @@ tree_t* parser_parse_expr(parser_t* parser) {
}
tree_t* parser_parse_block(parser_t* parser) {
+ if (!parser->token || parser->token->type == TOKEN_EXPR_END || parser->token->type == TOKEN_RBLOCK) { return NULL; }
+
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;
- }
+ block->data.block.val = parser_parse_expr(parser);
+ block->data.block.nxt = parser_nxt_token_match(parser, TOKEN_EXPR_END) && parser_nxt_token(parser) ?
+ parser_parse_block(parser) :
+ NULL;
return block;
}
@@ -153,17 +137,11 @@ tree_t* parser_parse_def(parser_t* parser) {
def = tree_init(TREE_TYPE_DEF);
def->data.def.tag = parser_parse_tag(parser);
- if (parser->token->type != TOKEN_APPLY) { goto finish; }
- else { parser_nxt_token(parser); }
-
- def->data.def.arg = parser_parse_darg(parser);
- if (parser->token->type != TOKEN_SET) { goto finish; }
- else { parser_nxt_token(parser); }
-
- def->data.def.val = parser_parse_expr(parser);
- finish:
- return def;
+ parser->token->type == TOKEN_APPLY && parser_nxt_token(parser) && (def->data.def.arg = parser_parse_darg(parser));
+ parser->token->type == TOKEN_SET && parser_nxt_token(parser) && (def->data.def.val = parser_parse_expr(parser));
+
+ return def;
}
tree_t* parser_parse_carg(parser_t* parser) {