From 68021d185803799150a955549cb67a5196ff9622 Mon Sep 17 00:00:00 2001 From: hexaredecimal Date: Sun, 29 Jun 2025 23:21:42 +0200 Subject: [PATCH 1/2] antlr4: Managed to fix the bugs --- .../java/org/piccode/ast/PiccodeVisitor.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/piccode/ast/PiccodeVisitor.java b/src/main/java/org/piccode/ast/PiccodeVisitor.java index 4018238..fdcd46f 100644 --- a/src/main/java/org/piccode/ast/PiccodeVisitor.java +++ b/src/main/java/org/piccode/ast/PiccodeVisitor.java @@ -523,6 +523,15 @@ private Ast visitUnaryExpr(UnaryContext ctx) { return result; } + + if (ctx.RETURN_TOK() != null) { + var tok = ctx.RETURN_TOK().getSymbol(); + var result = finalizeAstNode( + new ReturnAst(visitExpr(ctx.expr())), + tok); + return result; + } + var start = ctx.getStart(); var err = new PiccodeException(fileName, start.getLine(), start.getCharPositionInLine(), "Invalid unary expression"); err.frame = null; @@ -587,7 +596,20 @@ public Ast visitObject(ObjectContext ctx) { private HashMap visitKeyValuePairs(Key_val_pairsContext key_val_pairs) { var obj = new HashMap(); for (var kv : key_val_pairs.key_val_pair()) { - obj.put(kv.ID().getText(), visitExpr(kv.expr())); + var id = kv.ID(); + if (id == null) { + var tok = key_val_pairs.getStart(); + throw new PiccodeException(fileName, tok.getLine(), tok.getCharPositionInLine(), "Missing a key in object literal"); + } + + var expr = kv.expr(); + + if (expr == null) { + var tok = key_val_pairs.getStart(); + throw new PiccodeException(fileName, tok.getLine(), tok.getCharPositionInLine(), "Missing expression in object literal"); + } + + obj.put(id.getText(), visitExpr(expr)); } return obj; } From fed52437fd76585410887eee6722aa52582d37c1 Mon Sep 17 00:00:00 2001 From: hexaredecimal Date: Sun, 29 Jun 2025 23:24:33 +0200 Subject: [PATCH 2/2] antlr4: Fixed more bugs --- src/main/antlr4/PiccodeScript.g4 | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/main/antlr4/PiccodeScript.g4 b/src/main/antlr4/PiccodeScript.g4 index 845a287..b14fef0 100644 --- a/src/main/antlr4/PiccodeScript.g4 +++ b/src/main/antlr4/PiccodeScript.g4 @@ -46,24 +46,15 @@ func_args: '(' arg_list? ')' ; arg_list: arg (',' arg)* ; -arg: ID (ASSIGN literal_expr)? ; // only allow literals in default values - - -literal_expr : - NUMBER - | STRING - |array - | tuple - | object - ; +arg: (USE?) ID (ASSIGN expr)? ; // only allow literals in default values expr_stmt: expr; // parser rules expr - : expr CC expr - | expr LPAREN call_expr_list? RPAREN + : expr LPAREN call_expr_list? RPAREN | var_decl | closure_decl + | expr CC expr | expr DOT expr | expr MUL expr | expr DIV expr @@ -86,9 +77,9 @@ expr | expr BAND expr | expr COLON expr | LPAREN expr? RPAREN - | unary | if_expr | when_expr + | unary | do_expr | array | tuple @@ -102,12 +93,12 @@ closure_decl: BOR arg_list? BOR ARROW expr; unary: EXCLAIM expr | SUB expr - | RETURN expr + | RETURN_TOK expr | TILDE expr | BAND expr; if_expr: - IF expr LBRACE expr RBRACE (ELSE LBRACE expr RBRACE)?; + IF expr expr (ELSE expr)?; when_expr: WHEN expr LBRACE when_cases else_case? RBRACE; @@ -182,6 +173,8 @@ IF: 'if'; ELSE: 'else'; MODULE: 'module'; DO: 'do'; +USE: 'use'; +RETURN_TOK: 'return'; NUMBER : HEX_LITERAL