aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2019-03-02 22:40:34 +0100
committerdec05eba <dec05eba@protonmail.com>2020-07-25 14:36:46 +0200
commitd640066d9390e3ba1abca183db9263b775c000d4 (patch)
tree4389abf1244ab930a225e4c33b2b5071d4d0d70f /src/parser.c
parentaf74ddb119e3c5167a10bf5468af3960c8db42c0 (diff)
Readd requirement for semicolon, makes things much simpler (for user as well)
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/parser.c b/src/parser.c
index babb2d9..7588bda 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -266,18 +266,36 @@ int parser_parse_rhs_start(Parser *self, Ast *rhs_expr) {
}
/*
-BODY = (LHS '=' RHS_START) |
- RHS_START
+BODY = LHS ';' |
+ (LHS '=' RHS_START ';') |
+ (RHS_START ';')
+
+Note: Semicolon is not required for closures, structs and tables
*/
int parser_parse_body(Parser *self, Ast *ast) {
+ bool match;
LhsExpr *lhs_expr;
Ast rhs_expr;
rhs_expr = ast_none();
return_if_error(parser_parse_lhs(self, &lhs_expr));
- if(lhs_expr)
- return_if_error(tokenizer_accept(&self->tokenizer, TOK_EQUALS));
+ if(lhs_expr) {
+ return_if_error(tokenizer_consume_if(&self->tokenizer, TOK_EQUALS, &match));
+ if(match)
+ goto rhs;
+
+ return_if_error(tokenizer_consume_if(&self->tokenizer, TOK_SEMICOLON, &match));
+ if(!match) {
+ self->error = tokenizer_create_error(&self->tokenizer, "Expected '=' or ';'");
+ return PARSER_UNEXPECTED_TOKEN;
+ }
+
+ ast->type = AST_LHS;
+ ast->value.lhs_expr = lhs_expr;
+ return PARSER_OK;
+ }
+ rhs:
return_if_error(parser_parse_rhs_start(self, &rhs_expr));
if(lhs_expr) {
lhs_expr->rhs_expr = rhs_expr;
@@ -286,6 +304,11 @@ int parser_parse_body(Parser *self, Ast *ast) {
} else {
*ast = rhs_expr;
}
+
+ /* TODO: Check for struct and tables */
+ if(rhs_expr.type != AST_FUNCTION_DECL)
+ return_if_error(tokenizer_accept(&self->tokenizer, TOK_SEMICOLON));
+
return PARSER_OK;
}