diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/src/parser.c b/src/parser.c index 2dcf96b..384d8ea 100644 --- a/src/parser.c +++ b/src/parser.c @@ -8,6 +8,7 @@ parser_t* parser_init(token_t* token) { parser = emalloc(sizeof(struct PARSER)); parser->token = token; parser->tree = NULL; + parser->ltree = NULL; return parser; } @@ -26,6 +27,7 @@ int parser_nxt_token(parser_t* parser) { return parser->token ? 1 : 0; } +#if 0 /* TODO: This seems like it might be useful?? tree_t* parser_parse_init(parser_t* parser) { /* There is nothing to do. */ if (!parser->token) { @@ -33,13 +35,14 @@ tree_t* parser_parse_init(parser_t* parser) { } tree_t* block; - block = tree_init(TREE_TYPE_BLOCK); + block = tree_init(TREE_TYPE_BLOCK, NULL); block->data.block.val = parser_parse_expr(parser); block->data.block.nxt = parser_parse_block(parser); return block; } +#endif tree_t* parser_parse_block(parser_t* parser) { /* There is nothing to do. */ @@ -49,9 +52,12 @@ tree_t* parser_parse_block(parser_t* parser) { } tree_t* block; - block = tree_init(TREE_TYPE_BLOCK); + block = tree_init(TREE_TYPE_BLOCK, parser->ltree); + parser->ltree = block; block->data.block.val = parser_parse_expr(parser); + + parser->ltree = block; block->data.block.nxt = parser_parse_block(parser); return block; @@ -68,12 +74,12 @@ 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. */ + /* 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); expr = parser_parse_call(parser); break; case TOKEN_TYPE_TAG: @@ -88,12 +94,15 @@ tree_t* parser_parse_expr(parser_t* parser) { } tree_t* parser_parse_def(parser_t* parser) { - tree_t* def = tree_init(TREE_TYPE_DEF); + tree_t* def = tree_init(TREE_TYPE_DEF, parser->ltree); + parser->ltree = def; def->data.def.tag = parser_parse_tag(parser); if (parser->token->type == TOKEN_TYPE_APPLY) { parser_nxt_token(parser); /* Skip over apply. */ + + parser->ltree = def; def->data.def.arg = parser_parse_darg(parser); } else { def->data.def.arg = NULL; @@ -101,6 +110,8 @@ tree_t* parser_parse_def(parser_t* parser) { if (parser->token->type == TOKEN_TYPE_SET) { parser_nxt_token(parser); /* Skip over set. */ + + parser->ltree = def; def->data.def.val = parser_parse_expr(parser); } else { def->data.def.val = NULL; @@ -115,25 +126,29 @@ tree_t* parser_parse_tag(parser_t* parser) { parser->token->type != TOKEN_TYPE_TAG ) { return NULL; } - tree_t* tag = tree_init(TREE_TYPE_TAG); + tree_t* tag = tree_init(TREE_TYPE_TAG, parser->ltree); tag->data.tag.val = parser->token->val; parser->token->val = NULL; parser_nxt_token(parser); + parser->ltree = tag; tag->data.tag.nxt = parser_parse_tag(parser); return tag; } tree_t* parser_parse_darg(parser_t* parser) { - tree_t* darg = tree_init(TREE_TYPE_DARG); + tree_t* darg = tree_init(TREE_TYPE_DARG, parser->ltree); + parser->ltree = darg; darg->data.darg.tag = parser_parse_tag(parser); if (parser->token->type == TOKEN_TYPE_LIST_DELIM) { parser_nxt_token(parser); /* Skip over list delim. */ + + parser->ltree = darg; darg->data.darg.nxt = parser_parse_darg(parser); } else { darg->data.darg.nxt = NULL; @@ -145,11 +160,9 @@ tree_t* parser_parse_darg(parser_t* parser) { tree_t* parser_parse_carg(parser_t* parser) { tree_t* carg; - /* - f.x,y,z; - */ + carg = tree_init(TREE_TYPE_CARG, parser->ltree); - carg = tree_init(TREE_TYPE_CARG); + parser->ltree = carg; carg->data.carg.val = parser_parse_expr(parser); if ( @@ -157,6 +170,7 @@ tree_t* parser_parse_carg(parser_t* parser) { && parser->token->type == TOKEN_TYPE_LIST_DELIM && parser_nxt_token(parser) ) { + parser->ltree = carg; carg->data.carg.nxt = parser_parse_carg(parser); } else { carg->data.carg.nxt = NULL; @@ -168,7 +182,7 @@ tree_t* parser_parse_carg(parser_t* parser) { tree_t* parser_parse_kwd(parser_t* parser) { tree_t* call; - call = tree_init(TREE_TYPE_CALL); + call = tree_init(TREE_TYPE_CALL, parser->ltree); call->data.call.target = parser->token->val; parser->token->val = NULL; @@ -180,6 +194,8 @@ tree_t* parser_parse_kwd(parser_t* parser) { ) { /* Expect some arguments. */ parser_nxt_token(parser); + + parser->ltree = call; call->data.call.arg = parser_parse_carg(parser); } else { /* There're no arguments. */ @@ -202,7 +218,7 @@ int parser_nxt_token_match(parser_t* parser, token_type_t type) { tree_t* parser_parse_lint(parser_t* parser) { tree_t* lint; - lint = tree_init(TREE_TYPE_LINT); + lint = tree_init(TREE_TYPE_LINT, parser->ltree); lint->data.lint.val = atoi(parser->token->val); parser_nxt_token(parser); @@ -212,7 +228,7 @@ tree_t* parser_parse_lint(parser_t* parser) { tree_t* parser_parse_lstr(parser_t* parser) { tree_t* lstr; - lstr = tree_init(TREE_TYPE_LSTR); + lstr = tree_init(TREE_TYPE_LSTR, parser->ltree); lstr->data.lstr.len = strlen(parser->token->val); /* Move token value to tree, to allow for future token destruction. */ @@ -226,7 +242,7 @@ tree_t* parser_parse_lstr(parser_t* parser) { tree_t* parser_parse_call(parser_t* parser) { tree_t* call; - call = tree_init(TREE_TYPE_CALL); + call = tree_init(TREE_TYPE_CALL, parser->ltree); call->data.call.target = parser->token->val; parser->token->val = NULL; @@ -240,6 +256,7 @@ tree_t* parser_parse_call(parser_t* parser) { && parser->token->type == TOKEN_TYPE_APPLY && parser_nxt_token(parser) ) { + parser->ltree = call; call->data.call.arg = parser_parse_carg(parser); } else { call->data.call.arg = NULL; @@ -248,6 +265,7 @@ tree_t* parser_parse_call(parser_t* parser) { return call; } +#if 0 /* ??? */ void parser_parse(parser_t* parser) { while (parser->token) { switch (parser->token->type) { @@ -260,7 +278,9 @@ void parser_parse(parser_t* parser) { } } +#endif void parser_run(parser_t* parser) { + parser->ltree = NULL; parser->tree = parser_parse_block(parser); } |