Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 8 additions & 15 deletions src/main/antlr4/PiccodeScript.g4
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -86,9 +77,9 @@ expr
| expr BAND expr
| expr COLON expr
| LPAREN expr? RPAREN
| unary
| if_expr
| when_expr
| unary
| do_expr
| array
| tuple
Expand All @@ -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;
Expand Down Expand Up @@ -182,6 +173,8 @@ IF: 'if';
ELSE: 'else';
MODULE: 'module';
DO: 'do';
USE: 'use';
RETURN_TOK: 'return';

NUMBER
: HEX_LITERAL
Expand Down
24 changes: 23 additions & 1 deletion src/main/java/org/piccode/ast/PiccodeVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -587,7 +596,20 @@ public Ast visitObject(ObjectContext ctx) {
private HashMap<String, Ast> visitKeyValuePairs(Key_val_pairsContext key_val_pairs) {
var obj = new HashMap<String, Ast>();
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;
}
Expand Down