aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorc2024-02-13 11:49:26 -0500
committerc2024-02-13 11:49:26 -0500
commit3dbe235f65987ae2bb34c6859926f33791feab67 (patch)
treef4ebe27796c02eba3bda728a17b98696c1fcdbe1 /src/parser.c
parent78bdd279d90ace6e53a853a898f4819327e82743 (diff)
Definitions may now be parsed.
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c116
1 files changed, 60 insertions, 56 deletions
diff --git a/src/parser.c b/src/parser.c
index 731df78..ea2245c 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -75,6 +75,9 @@ tree_t* parser_parse_expr(parser_t* parser) {
case TOKEN_TYPE_KWD:
expr = parser_parse_kwd(parser);
break;
+ case TOKEN_TYPE_TAG:
+ expr = parser_parse_def(parser);
+ break;
default:
LOG_WARF("%s: Unknown token type: %d", __func__, parser->token->type);
parser_nxt_token(parser);
@@ -83,6 +86,63 @@ tree_t* parser_parse_expr(parser_t* parser) {
return expr;
}
+tree_t* parser_parse_def(parser_t* parser) {
+ tree_t* def = tree_init(TREE_TYPE_DEF);
+
+ def->data.def.tag = parser_parse_tag(parser);
+
+ if (parser->token->type == TOKEN_TYPE_APPLY) {
+ parser_nxt_token(parser);
+ def->data.def.arg = parser_parse_darg(parser);
+ } else {
+ def->data.def.arg = NULL;
+ }
+
+ if (parser->token->type == TOKEN_TYPE_SET) {
+ parser_nxt_token(parser);
+ def->data.def.val = parser_parse_expr(parser);
+ } else {
+ def->data.def.val = NULL;
+ }
+
+ return def;
+}
+
+tree_t* parser_parse_tag(parser_t* parser) {
+ if (
+ parser->token &&
+ parser->token->type != TOKEN_TYPE_TAG
+ ) { return NULL; }
+
+ tree_t* tag = tree_init(TREE_TYPE_TAG);
+
+ tag->data.tag.val = parser->token->val;
+ parser->token->val = NULL;
+
+ parser_nxt_token(parser);
+
+ 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);
+
+ darg->data.darg.tag = parser_parse_tag(parser);
+
+ parser_nxt_token(parser);
+
+ if (parser->token->type == TOKEN_TYPE_LIST_DELIM) {
+ parser_nxt_token(parser);
+ darg->data.darg.nxt = parser_parse_darg(parser);
+ } else {
+ darg->data.darg.nxt = NULL;
+ }
+
+ return darg;
+}
+
tree_t* parser_parse_carg(parser_t* parser) {
tree_t* carg;
@@ -151,62 +211,6 @@ tree_t* parser_parse_lstr(parser_t* parser) {
return lstr;
}
-tree_t* parser_parse_tag(parser_t* parser) {
- if (parser->token->type != TOKEN_TYPE_TAG) { return NULL; }
-
- tree_t* tag;
-
- tag = tree_init(TREE_TYPE_TAG);
-
- tag->data.tag.val = parser->token->val;
- parser->token->val = NULL;
- tag->data.tag.nxt = (
- parser_nxt_token(parser) ?
- parser_parse_tag(parser) :
- NULL
- );
-
- return tag;
-}
-
-tree_t* parser_parse_darg(parser_t* parser) {
- tree_t* darg;
-
- darg = tree_init(TREE_TYPE_DARG);
-
- if (parser->token->type != TOKEN_TYPE_TAG) { return NULL; }
-
- darg->data.darg.tag = parser_parse_tag(parser);
-
- LOG_WARF("%d", parser->token->type);
-
- if (parser->token->type != TOKEN_TYPE_LIST_DELIM) {
- darg->data.darg.nxt = NULL;
- } else {
- parser_nxt_token(parser) &&
- (darg->data.darg.nxt = parser_parse_darg(parser));
- }
-
- return darg;
-}
-
-tree_t* parser_parse_def(parser_t* parser) {
- tree_t* def;
-
- def = tree_init(TREE_TYPE_DEF);
-
- def->data.def.tag = parser_parse_tag(parser);
-
- parser->token->type == TOKEN_TYPE_APPLY &&
- parser_nxt_token(parser) &&
- ( def->data.def.arg = parser_parse_darg(parser) );
- parser->token->type == TOKEN_TYPE_SET &&
- parser_nxt_token(parser) &&
- ( def->data.def.val = parser_parse_expr(parser) );
-
- return def;
-}
-
tree_t* parser_parse_call(parser_t* parser) {
tree_t* call;