aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c50
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);
}