diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 31 |
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; } |