From c3f5ce5f8b87974ebfd0d2334882d8ab7a335bda Mon Sep 17 00:00:00 2001 From: dibyendumajumdar Date: Sun, 13 Apr 2025 11:59:46 +0100 Subject: [PATCH 1/2] Allow fields in array initializers so that size and initial value can be set. --- antlr-parser/examples/all-features.lang | 14 +++++++++++--- .../compilerprogramming/ezlang/parser/Parser.java | 5 ----- .../ezlang/parser/TestParser.java | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/antlr-parser/examples/all-features.lang b/antlr-parser/examples/all-features.lang index 2a026c8..21f60a5 100644 --- a/antlr-parser/examples/all-features.lang +++ b/antlr-parser/examples/all-features.lang @@ -19,12 +19,20 @@ func foo(a: Int, b: [Int]) { } } func bar() -> Test { - var v = new Test { intArray = new [Tree] {} } + var v = new Test { intArray = new [Tree] { new Tree{left=null,right=null} } } return v } func main() { var m = 42 + var j: Int var t: Tree - var b = true - var c: Bool + var array = new [Int] {size=10,1,2,3} + array[1] = 42 + t.left = null + if (m < 1) + print(1) + else if (m == 5) + print(2) + else + print(3) } diff --git a/parser/src/main/java/com/compilerprogramming/ezlang/parser/Parser.java b/parser/src/main/java/com/compilerprogramming/ezlang/parser/Parser.java index 0d95fcb..821ce6c 100644 --- a/parser/src/main/java/com/compilerprogramming/ezlang/parser/Parser.java +++ b/parser/src/main/java/com/compilerprogramming/ezlang/parser/Parser.java @@ -334,13 +334,10 @@ private AST.Expr parseNew(Lexer lexer) { AST.TypeExpr resultType = parseTypeExpr(lexer); var newExpr = new AST.NewExpr(resultType); List initExpr = new ArrayList<>(); - int initType = 0; int index = 0; if (testPunctuation(lexer, "{")) { while (!isToken(currentToken, "}")) { if (currentToken.kind == Token.Kind.IDENT && lexer.peekChar() == '=') { - if (initType == 0) initType = 1; - else if (initType != 1) throw new CompilerException("Cannot mix initializer expressions"); String fieldname = currentToken.str; nextToken(lexer); matchPunctuation(lexer, "="); @@ -348,8 +345,6 @@ private AST.Expr parseNew(Lexer lexer) { initExpr.add(new AST.InitFieldExpr(newExpr, fieldname, value)); } else { - if (initType == 0) initType = 2; - else if (initType != 2) throw new CompilerException("Cannot mix initializer expressions"); var indexLit = Integer.valueOf(index++); var indexExpr = new AST.LiteralExpr(Token.newNum(indexLit,indexLit.toString(),0)); initExpr.add(new AST.ArrayInitExpr(newExpr, indexExpr, parseBool(lexer))); diff --git a/parser/src/test/java/com/compilerprogramming/ezlang/parser/TestParser.java b/parser/src/test/java/com/compilerprogramming/ezlang/parser/TestParser.java index 101c75d..1c60dc0 100644 --- a/parser/src/test/java/com/compilerprogramming/ezlang/parser/TestParser.java +++ b/parser/src/test/java/com/compilerprogramming/ezlang/parser/TestParser.java @@ -36,7 +36,7 @@ func bar() -> Test { func main() { var m = 42 var t: Tree - var array = new [Int] {1,2,3} + var array = new [Int] {size=10,1,2,3} array[1] = 42 t.left = null if (m < 1) From 3144cb5d15d5841cc25b7456f0ccb3449f305a21 Mon Sep 17 00:00:00 2001 From: dibyendumajumdar Date: Mon, 14 Apr 2025 10:38:50 +0100 Subject: [PATCH 2/2] Revised language grammar and fib example --- antlr-parser/examples/all-features.lang | 12 +++++++++++ .../ezlang/antlr/EZLanguage.g4 | 9 ++++---- .../ezlang/interpreter/TestInterpreter.java | 21 ++++++++----------- seaofnodes/src/test/cases/fib/fib.ez | 20 ++++++++---------- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/antlr-parser/examples/all-features.lang b/antlr-parser/examples/all-features.lang index 21f60a5..9c4bea4 100644 --- a/antlr-parser/examples/all-features.lang +++ b/antlr-parser/examples/all-features.lang @@ -36,3 +36,15 @@ func main() { else print(3) } +func fib(n: Int)->Int { + var f1=1 + var f2=1 + var i=n + while( i>1 ){ + var temp = f1+f2 + f1=f2 + f2=temp + i=i-1 + } + return f2 +} diff --git a/antlr-parser/src/main/antlr4/com/compilerprogramming/ezlang/antlr/EZLanguage.g4 b/antlr-parser/src/main/antlr4/com/compilerprogramming/ezlang/antlr/EZLanguage.g4 index 476ca54..bfcd0c8 100644 --- a/antlr-parser/src/main/antlr4/com/compilerprogramming/ezlang/antlr/EZLanguage.g4 +++ b/antlr-parser/src/main/antlr4/com/compilerprogramming/ezlang/antlr/EZLanguage.g4 @@ -22,16 +22,17 @@ varDeclaration ; typeName - : simpleType + : nominalType | arrayType ; -simpleType - : IDENTIFIER ('?')? +nominalType + : 'Int' + | IDENTIFIER ('?')? ; arrayType - : '[' simpleType ']' ('?')? + : '[' nominalType ']' ('?')? ; functionDeclaration diff --git a/optvm/src/test/java/com/compilerprogramming/ezlang/interpreter/TestInterpreter.java b/optvm/src/test/java/com/compilerprogramming/ezlang/interpreter/TestInterpreter.java index 161cf38..78af875 100644 --- a/optvm/src/test/java/com/compilerprogramming/ezlang/interpreter/TestInterpreter.java +++ b/optvm/src/test/java/com/compilerprogramming/ezlang/interpreter/TestInterpreter.java @@ -173,22 +173,19 @@ func foo()->Int { public void testFunction9() { String src = """ func fib(n: Int)->Int { - var i: Int; - var temp: Int; - var f1=1; - var f2=1; - i=n; + var f1=1 + var f2=1 + var i=n while( i>1 ){ - temp = f1+f2; - f1=f2; - f2=temp; - i=i-1; + var temp = f1+f2 + f1=f2 + f2=temp + i=i-1 } - return f2; + return f2 } - func foo()->Int { - return fib(10); + return fib(10) } """; var value = compileAndRun(src, "foo", Options.OPT); diff --git a/seaofnodes/src/test/cases/fib/fib.ez b/seaofnodes/src/test/cases/fib/fib.ez index a30b6d9..9d07943 100644 --- a/seaofnodes/src/test/cases/fib/fib.ez +++ b/seaofnodes/src/test/cases/fib/fib.ez @@ -1,18 +1,16 @@ func fib(n: Int)->Int { - var i: Int; - var temp=0; - var f1=1; - var f2=1; - i=n; + var f1=1 + var f2=1 + var i=n while( i>1 ){ - temp = f1+f2; - f1=f2; - f2=temp; - i=i-1; + var temp = f1+f2 + f1=f2 + f2=temp + i=i-1 } - return f2; + return f2 } func foo()->Int { - return fib(10); + return fib(10) } \ No newline at end of file