aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authorc2023-11-25 10:37:37 -0500
committerc2023-11-25 10:37:37 -0500
commitbf3767fa7f0f1687d930d0d137e76a0206545fd6 (patch)
tree30bc03851ecfa3618c19b4de4a895fc7fc284abd /src/parser.c
parent930ca8d3b760b33123ba877514a49eca5af35a6a (diff)
Functions with single arguments are possible.
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/parser.c b/src/parser.c
index b086703..c378d75 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1,5 +1,6 @@
#include "include/parser.h"
#include "include/token.h"
+#include "include/tree.h"
parser_t* parser_init(token_t* token) {
parser_t* parser;
@@ -51,10 +52,11 @@ tree_t* parser_parse_lstr(parser_t* parser) {
tree_t* lstr;
lstr = tree_init(TREE_TYPE_LSTR);
+
lstr->data.lstr.len = strlen(parser->token->val);
- lstr->data.lstr.val = ecalloc(lstr->data.lstr.len + 1, sizeof(char));
- lstr->data.lstr.val[lstr->data.lstr.len] = '\0';
- strcpy(lstr->data.lstr.val, parser->token->val);
+ /* Swap pointers to allow for future token destruction. */
+ lstr->data.lstr.val = parser->token->val;
+ parser->token->val = NULL;
return lstr;
}
@@ -64,8 +66,6 @@ tree_t* parser_parse_expr(parser_t* parser) {
expr = tree_init(TREE_TYPE_EXPR);
- /* For now this is the only type of expression. */
-
switch (parser->token->type) {
case TOKEN_INT:
expr->data.expr.val = parser_parse_lint(parser);
@@ -73,6 +73,9 @@ tree_t* parser_parse_expr(parser_t* parser) {
case TOKEN_STR:
expr->data.expr.val = parser_parse_lstr(parser);
break;
+ case TOKEN_KWD:
+ expr->data.expr.val = parser_parse_call(parser);
+ break;
default:
return expr;
}
@@ -116,6 +119,30 @@ tree_t* parser_parse_block(parser_t* parser) {
return block;
}
+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_call(parser_t* parser) {
+ tree_t* call;
+
+ call = tree_init(TREE_TYPE_CALL);
+
+ call->data.call.target = parser->token->val;
+ parser->token->val = NULL;
+ parser_nxt_token_match(parser, TOKEN_APPLY) || (call->data.call.arg = NULL);
+ call->data.call.arg = (parser_nxt_token(parser) ? parser_parse_carg(parser) : NULL);
+
+ return call;
+}
+
tree_t* parser_parse(parser_t* parser) {
return parser_parse_block(parser);
}