aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/parser.h1
-rw-r--r--src/parser.c38
2 files changed, 32 insertions, 7 deletions
diff --git a/src/include/parser.h b/src/include/parser.h
index 839e372..6961be8 100644
--- a/src/include/parser.h
+++ b/src/include/parser.h
@@ -5,6 +5,7 @@
#include "tree.h"
#include "token.h"
+/* Parser states. */
typedef enum PARSER_STATE {
PARSER_STATE_BLOCK,
PARSER_STATE_EXPR,
diff --git a/src/parser.c b/src/parser.c
index ea2245c..b42d2f0 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1,5 +1,6 @@
#include "include/parser.h"
#include "include/token.h"
+#include "include/util.h"
parser_t* parser_init(token_t* token) {
parser_t* parser;
@@ -73,7 +74,8 @@ tree_t* parser_parse_expr(parser_t* parser) {
expr = parser_parse_block(parser);
break;
case TOKEN_TYPE_KWD:
- expr = parser_parse_kwd(parser);
+// expr = parser_parse_kwd(parser);
+ expr = parser_parse_call(parser);
break;
case TOKEN_TYPE_TAG:
expr = parser_parse_def(parser);
@@ -146,9 +148,22 @@ 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);
carg->data.carg.val = parser_parse_expr(parser);
- carg->data.carg.nxt = NULL;
+
+ if (
+ parser->token
+ && parser->token->type == TOKEN_TYPE_LIST_DELIM
+ && parser_nxt_token(parser)
+ ) {
+ carg->data.carg.nxt = parser_parse_carg(parser);
+ } else {
+ carg->data.carg.nxt = NULL;
+ }
return carg;
}
@@ -218,11 +233,20 @@ tree_t* parser_parse_call(parser_t* parser) {
call->data.call.target = parser->token->val;
parser->token->val = NULL;
- call->data.call.arg = (
- parser_nxt_token_match(parser, TOKEN_TYPE_APPLY) && parser_nxt_token(parser) ?
- parser_parse_carg(parser) :
- NULL
- );
+
+ /*
+ If there's a call with an apply, but the file ends just after, NULL.
+ ¯\_(ツ)_/¯
+ */
+ if (
+ parser_nxt_token(parser)
+ && parser->token->type == TOKEN_TYPE_APPLY
+ && parser_nxt_token(parser)
+ ) {
+ call->data.call.arg = parser_parse_carg(parser);
+ } else {
+ call->data.call.arg = NULL;
+ }
return call;
}