From d0d5fa8ca5df9f873b66a1e57cf78aa1b1129098 Mon Sep 17 00:00:00 2001 From: Vladimir Lichonos Date: Sat, 28 Jan 2012 20:38:12 -0800 Subject: [PATCH 1/3] Bug fixes - Floats, Integers, String and new functionality - Short closures without 'return' --- Readme.md | 28 +++++++++++- .../translator/ClosureAnonymousShort1.java | 44 +++++++++++++++++++ .../translator/ClosureAnonymousShort2.java | 40 +++++++++++++++++ src/com/fjava/translator/ClosureShort1.java | 36 +++++++++++++++ src/com/fjava/translator/ClosureShort2.java | 37 ++++++++++++++++ src/com/fjava/translator/TokenType.java | 22 +++++++--- .../fjava/translator/TranslatorFactory.java | 4 ++ 7 files changed, 204 insertions(+), 7 deletions(-) create mode 100644 src/com/fjava/translator/ClosureAnonymousShort1.java create mode 100644 src/com/fjava/translator/ClosureAnonymousShort2.java create mode 100644 src/com/fjava/translator/ClosureShort1.java create mode 100644 src/com/fjava/translator/ClosureShort2.java diff --git a/Readme.md b/Readme.md index 25f0c4b..6664c23 100644 --- a/Readme.md +++ b/Readme.md @@ -114,6 +114,10 @@ v0.1: - Usage: = () => { return ; } + + or + + = () => ; - Result in Java: @@ -129,6 +133,9 @@ v0.1: f = (String) => { return "Some closure with result of String"; } System.out.println(f.invoke()); + + f = (String) => "Some single line closure"; + System.out.println(f.invoke()); - As parameter: @@ -139,6 +146,14 @@ v0.1: - As anonymous: (String) => { /* to do something */ return "Some string here"; }.invoke(); + + or + + ((String) => "Some simple result").invoke(); + + or, if you like + + (String) => "Some strange result";.invoke(); - Closure with arguments and result (now supports only 1 parameter): - Usage: @@ -159,6 +174,9 @@ v0.1: f = (String, String name) => { return "Hello " + name; } System.out.println(f.invoke("Vladimir")); + + f = (String, String name) => "Hello " + name; + System.out.println(f.invoke("Vladimir")); - As parameter: @@ -168,5 +186,13 @@ v0.1: - As anonymous: - (String, String something) => { /* to do something */ return "We found " + something; }.invoke(); + (String, String something) => { /* to do something */ return "We found " + something; }.invoke("Apple"); + + or + + ((String, String something) => "We found simple " + something).invoke("Apple"); + + or, if you like + + (String, String something) => "We found strange " + something;.invoke("Apple"); diff --git a/src/com/fjava/translator/ClosureAnonymousShort1.java b/src/com/fjava/translator/ClosureAnonymousShort1.java new file mode 100644 index 0000000..6431058 --- /dev/null +++ b/src/com/fjava/translator/ClosureAnonymousShort1.java @@ -0,0 +1,44 @@ +package com.fjava.translator; + +import static com.fjava.translator.TokenType.ASSIGN; +import static com.fjava.translator.TokenType.IDENTIFIER; +import static com.fjava.translator.TokenType.LPAREN; +import static com.fjava.translator.TokenType.RPAREN; +import static com.fjava.translator.TokenType.RT; +import static com.fjava.translator.TokenType.SEMICOLON; + +public class ClosureAnonymousShort1 extends Atom { + + public ClosureAnonymousShort1(TranslatorFactory factory) { + super(factory); + } + + @Override + public String translate() { + final StringBuilder result = new StringBuilder(format("new F1<$2>() { @Override public $2 invoke() { return ")); + skipRequired(); + + int parenCounter = 0; + TokenType type = require(); + while (type != SEMICOLON) { + if (type == LPAREN) + parenCounter++; + else if (type == RPAREN && --parenCounter < 0) + break; + + result.append(get()); + type = require(); + } + result.append(";}}"); + + if (type == RPAREN) + result.append(')'); + + return result.toString(); + } + + @Override + public boolean test() { + return test(LPAREN, IDENTIFIER, RPAREN, ASSIGN, RT); + } +} diff --git a/src/com/fjava/translator/ClosureAnonymousShort2.java b/src/com/fjava/translator/ClosureAnonymousShort2.java new file mode 100644 index 0000000..7a6b0be --- /dev/null +++ b/src/com/fjava/translator/ClosureAnonymousShort2.java @@ -0,0 +1,40 @@ +package com.fjava.translator; + +import static com.fjava.translator.TokenType.*; + +public class ClosureAnonymousShort2 extends Atom { + + public ClosureAnonymousShort2(TranslatorFactory factory) { + super(factory); + } + + @Override + public String translate() { + final StringBuilder result = new StringBuilder( + format("new F2<$2, $4>() { @Override public $2 invoke(final $4 $5) { return ")); + skipRequired(); + + int parenCounter = 0; + TokenType type = require(); + while (type != SEMICOLON) { + if (type == LPAREN) + parenCounter++; + else if (type == RPAREN && --parenCounter < 0) + break; + + result.append(get()); + type = require(); + } + result.append(";}}"); + + if (type == RPAREN) + result.append(')'); + + return result.toString(); + } + + @Override + public boolean test() { + return test(LPAREN, IDENTIFIER, COMMA, IDENTIFIER, IDENTIFIER, RPAREN, ASSIGN, RT); + } +} diff --git a/src/com/fjava/translator/ClosureShort1.java b/src/com/fjava/translator/ClosureShort1.java new file mode 100644 index 0000000..d997042 --- /dev/null +++ b/src/com/fjava/translator/ClosureShort1.java @@ -0,0 +1,36 @@ +package com.fjava.translator; + +import static com.fjava.translator.TokenType.ASSIGN; +import static com.fjava.translator.TokenType.IDENTIFIER; +import static com.fjava.translator.TokenType.LPAREN; +import static com.fjava.translator.TokenType.RPAREN; +import static com.fjava.translator.TokenType.RT; +import static com.fjava.translator.TokenType.SEMICOLON; + +public class ClosureShort1 extends Atom { + + public ClosureShort1(TranslatorFactory factory) { + super(factory); + } + + @Override + public String translate() { + final StringBuilder result = new StringBuilder( + format("final F1<$4> $1 = new F1<$4>() { @Override public $4 invoke() { return ")); + skipRequired(); + + TokenType type = require(); + while (type != SEMICOLON) { + result.append(get()); + type = require(); + } + result.append(";}};"); + + return result.toString(); + } + + @Override + public boolean test() { + return test(IDENTIFIER, ASSIGN, LPAREN, IDENTIFIER, RPAREN, ASSIGN, RT); + } +} diff --git a/src/com/fjava/translator/ClosureShort2.java b/src/com/fjava/translator/ClosureShort2.java new file mode 100644 index 0000000..e97e106 --- /dev/null +++ b/src/com/fjava/translator/ClosureShort2.java @@ -0,0 +1,37 @@ +package com.fjava.translator; + +import static com.fjava.translator.TokenType.ASSIGN; +import static com.fjava.translator.TokenType.COMMA; +import static com.fjava.translator.TokenType.IDENTIFIER; +import static com.fjava.translator.TokenType.LPAREN; +import static com.fjava.translator.TokenType.RPAREN; +import static com.fjava.translator.TokenType.RT; +import static com.fjava.translator.TokenType.SEMICOLON; + +public class ClosureShort2 extends Atom { + + public ClosureShort2(TranslatorFactory factory) { + super(factory); + } + + @Override + public String translate() { + final StringBuilder result = new StringBuilder( + format("final F2<$4, $6> $1 = new F2<$4, $6>() { @Override public $4 invoke(final $6 $7) { return ")); + skipRequired(); + + TokenType type = require(); + while (type != SEMICOLON) { + result.append(get()); + type = require(); + } + result.append(";}};"); + + return result.toString(); + } + + @Override + public boolean test() { + return test(IDENTIFIER, ASSIGN, LPAREN, IDENTIFIER, COMMA, IDENTIFIER, IDENTIFIER, RPAREN, ASSIGN, RT); + } +} diff --git a/src/com/fjava/translator/TokenType.java b/src/com/fjava/translator/TokenType.java index 10b9c41..c9307c2 100644 --- a/src/com/fjava/translator/TokenType.java +++ b/src/com/fjava/translator/TokenType.java @@ -119,12 +119,22 @@ enum TokenType { + "\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-" + "\ufdfb\ufe20-\ufe23\ufe33-\ufe34\ufe4d-\ufe4f\ufe69\ufe70-\ufe72\ufe74\ufe76-\ufefc\ufeff\uff04\uff10-\uff19\uff21-\uff3a\uff3f\uff41-" + "\uff5a\uff65-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\uffe0-\uffe1\uffe5-\uffe6\ufff9-\ufffb]*)\\b", - " "), INTEGER_LITERAL("^([a-fA-F0-9lLxX]+)"), FLOAT_LITERAL("^([a-fA-F0-9\\.\\+\\-pPxX]+)"), - CHARACTER_LITERAL("^(\\'([^\\'\\\\n\r]|(\\\\[ntbrf\\\\\\'\\\"0-7]+))\\')"), STRING_LITERAL( - "^(\\\"([^\\'\\\\\n\\r]|(\\\\[ntbrf\\\\\\'\\\"0-7]+))*\\\")"), LPAREN("^(\\()"), RPAREN("^(\\))"), LBRACE( - "^(\\{)"), RBRACE("^(\\})"), LBREACKET("^(\\[)"), RBRACKET("^(\\])"), SEMICOLON("^(\\;)"), COMMA("^(\\,)"), - AT("^(\\@)"), ASSIGN("^(\\=)"), LT("^(\\<)"), RT("^(\\>)"), BANG("^(\\!)"), TILDE("^(\\~)"), HOOK("^(\\?)"), COLON( - "^(\\:)"), EQ("^(\\=\\=)"), LE("^(\\<\\=)"), GE("^(\\>\\=)"), NE("^(\\!\\=)"), SC_OR("^(\\|\\|)"), SC_AND( + " "), + LPAREN("^(\\()"), + RPAREN("^(\\))"), + LBRACE("^(\\{)"), + RBRACE("^(\\})"), + LBREACKET("^(\\[)"), + RBRACKET("^(\\])"), + FLOAT_LITERAL( + "^(([0-9]+\\.[0-9]*[eE]?[\\-\\+]?[0-9]*[fFdD]?)|(\\.[0-9]+[eE]?[\\-\\+]?[0-9]*[fFdD])|" + + "([0-9]+[eE][\\-\\+]?[0-9]+[fFdD]?)|([0-9]+[eE]?[\\-\\+]?[0-9]*[fFdD])|(0[xX]\\.?[pP][\\-\\+]?[0-9]+[fFdD]?)|" + + "(0[xX][a-fA-F0-9]*\\.[a-fA-F0-9]+[pP][\\-\\+]?[0-9]+[fFdD]?))"), INTEGER_LITERAL( + "^((0[xX][a-fA-F0-9]+[lL]?)|([0-9]+[lL]?))"), CHARACTER_LITERAL( + "^(\\'([^\\'\\\\n\r]|(\\\\[ntbrf\\\\\\'\\\"0-7]+))\\')"), STRING_LITERAL( + "^(\\\"([^\\\"\\'\\\\\n\\r]|(\\\\[ntbrf\\\\\\'\\\"0-7]))*\\\")"), SEMICOLON("^(\\;)"), COMMA("^(\\,)"), AT( + "^(\\@)"), ASSIGN("^(\\=)"), LT("^(\\<)"), RT("^(\\>)"), BANG("^(\\!)"), TILDE("^(\\~)"), HOOK("^(\\?)"), + COLON("^(\\:)"), EQ("^(\\=\\=)"), LE("^(\\<\\=)"), GE("^(\\>\\=)"), NE("^(\\!\\=)"), SC_OR("^(\\|\\|)"), SC_AND( "^(\\&\\&)"), INCR("^(\\+\\+)"), DECR("^(\\-\\-)"), PLUS("^(\\+)"), MINUS("^(\\-)"), STAR("^(\\*)"), SLASH( "^(\\/)"), BIT_AND("^(\\&)"), BIT_OR("^(\\|)"), XOR("^(\\^)"), REM("^(\\%)"), LSHIFT("^(\\<\\<)"), PLUSASSIGN("^(\\+\\=)"), MINUSASSIGN("^(\\-\\=)"), STARASSIGN("^(\\*\\=)"), SLASHASSIGN("^(\\/\\=)"), ANDASSIGN( diff --git a/src/com/fjava/translator/TranslatorFactory.java b/src/com/fjava/translator/TranslatorFactory.java index 622e182..4558249 100644 --- a/src/com/fjava/translator/TranslatorFactory.java +++ b/src/com/fjava/translator/TranslatorFactory.java @@ -12,9 +12,13 @@ class TranslatorFactory { PLUGINS.add(Closure.class); PLUGINS.add(Closure1.class); PLUGINS.add(Closure2.class); + PLUGINS.add(ClosureShort1.class); + PLUGINS.add(ClosureShort2.class); PLUGINS.add(ClosureAnonymous.class); PLUGINS.add(ClosureAnonymous1.class); PLUGINS.add(ClosureAnonymous2.class); + PLUGINS.add(ClosureAnonymousShort1.class); + PLUGINS.add(ClosureAnonymousShort2.class); PLUGINS.add(ClosureType.class); PLUGINS.add(ClosureTypeWithoutParentheses.class); PLUGINS.add(ClosureType1.class); From c4ba07e625c3633a3edeede4ef0ab14f1f7c6f97 Mon Sep 17 00:00:00 2001 From: Vladimir Lichonos Date: Sun, 29 Jan 2012 15:17:52 -0800 Subject: [PATCH 2/3] Closure type changed; Closure type for variables added; --- Readme.md | 10 +++---- .../translator/ClosureNotInitialized.java | 26 ++++++++++++++++++ .../translator/ClosureNotInitialized1.java | 26 ++++++++++++++++++ .../translator/ClosureNotInitialized2.java | 27 +++++++++++++++++++ src/com/fjava/translator/ClosureType.java | 2 +- src/com/fjava/translator/ClosureType1.java | 2 +- src/com/fjava/translator/ClosureType2.java | 2 +- .../ClosureTypeWithoutParentheses.java | 23 ---------------- .../fjava/translator/TranslatorFactory.java | 10 ++++--- 9 files changed, 91 insertions(+), 37 deletions(-) create mode 100644 src/com/fjava/translator/ClosureNotInitialized.java create mode 100644 src/com/fjava/translator/ClosureNotInitialized1.java create mode 100644 src/com/fjava/translator/ClosureNotInitialized2.java delete mode 100644 src/com/fjava/translator/ClosureTypeWithoutParentheses.java diff --git a/Readme.md b/Readme.md index 6664c23..c371473 100644 --- a/Readme.md +++ b/Readme.md @@ -88,11 +88,7 @@ v0.1: - As parameter: - void someFunction(() => f) { /* to do something */ f.invoke(); } - - or - - void someFunction( => f) { /* to do something */ f.invoke(); } + void someFunction(( =>) f) { /* to do something */ f.invoke(); } !WARNING: in Java code () => f and => f are same language constructions, you cannot define two functions above at the same time. @@ -139,7 +135,7 @@ v0.1: - As parameter: - void someFunction((String) => f) { /* to do something */ String s = f.invoke(); } + void someFunction((String =>) f) { /* to do something */ String s = f.invoke(); } someFunction((String) => { /* to do something */ return "Some string here"; }); @@ -180,7 +176,7 @@ v0.1: - As parameter: - void someFunction((String, String) => f) { /* to do something */ String s = f.invoke("something"); } + void someFunction((String, String =>) f) { /* to do something */ String s = f.invoke("something"); } someFunction((String, String something) => { /* to do something */ return "We found " + something; }); diff --git a/src/com/fjava/translator/ClosureNotInitialized.java b/src/com/fjava/translator/ClosureNotInitialized.java new file mode 100644 index 0000000..d508e57 --- /dev/null +++ b/src/com/fjava/translator/ClosureNotInitialized.java @@ -0,0 +1,26 @@ +package com.fjava.translator; + +import static com.fjava.translator.TokenType.ASSIGN; +import static com.fjava.translator.TokenType.IDENTIFIER; +import static com.fjava.translator.TokenType.LPAREN; +import static com.fjava.translator.TokenType.RPAREN; +import static com.fjava.translator.TokenType.RT; +import static com.fjava.translator.TokenType.SEMICOLON; + +public class ClosureNotInitialized extends Atom { + + public ClosureNotInitialized(TranslatorFactory factory) { + super(factory); + } + + @Override + public String translate() { + skipRequired(); + return format("F $5;"); + } + + @Override + public boolean test() { + return test(LPAREN, RPAREN, ASSIGN, RT, IDENTIFIER, SEMICOLON); + } +} diff --git a/src/com/fjava/translator/ClosureNotInitialized1.java b/src/com/fjava/translator/ClosureNotInitialized1.java new file mode 100644 index 0000000..8cba521 --- /dev/null +++ b/src/com/fjava/translator/ClosureNotInitialized1.java @@ -0,0 +1,26 @@ +package com.fjava.translator; + +import static com.fjava.translator.TokenType.ASSIGN; +import static com.fjava.translator.TokenType.IDENTIFIER; +import static com.fjava.translator.TokenType.LPAREN; +import static com.fjava.translator.TokenType.RPAREN; +import static com.fjava.translator.TokenType.RT; +import static com.fjava.translator.TokenType.SEMICOLON; + +public class ClosureNotInitialized1 extends Atom { + + public ClosureNotInitialized1(TranslatorFactory factory) { + super(factory); + } + + @Override + public String translate() { + skipRequired(); + return format("F1<$2> $6;"); + } + + @Override + public boolean test() { + return test(LPAREN, IDENTIFIER, RPAREN, ASSIGN, RT, IDENTIFIER, SEMICOLON); + } +} diff --git a/src/com/fjava/translator/ClosureNotInitialized2.java b/src/com/fjava/translator/ClosureNotInitialized2.java new file mode 100644 index 0000000..710517f --- /dev/null +++ b/src/com/fjava/translator/ClosureNotInitialized2.java @@ -0,0 +1,27 @@ +package com.fjava.translator; + +import static com.fjava.translator.TokenType.ASSIGN; +import static com.fjava.translator.TokenType.COMMA; +import static com.fjava.translator.TokenType.IDENTIFIER; +import static com.fjava.translator.TokenType.LPAREN; +import static com.fjava.translator.TokenType.RPAREN; +import static com.fjava.translator.TokenType.RT; +import static com.fjava.translator.TokenType.SEMICOLON; + +public class ClosureNotInitialized2 extends Atom { + + public ClosureNotInitialized2(TranslatorFactory factory) { + super(factory); + } + + @Override + public String translate() { + skipRequired(); + return format("F2<$2, $4> $8;"); + } + + @Override + public boolean test() { + return test(LPAREN, IDENTIFIER, COMMA, IDENTIFIER, RPAREN, ASSIGN, RT, IDENTIFIER, SEMICOLON); + } +} diff --git a/src/com/fjava/translator/ClosureType.java b/src/com/fjava/translator/ClosureType.java index 7a1e195..b040507 100644 --- a/src/com/fjava/translator/ClosureType.java +++ b/src/com/fjava/translator/ClosureType.java @@ -20,6 +20,6 @@ public String translate() { @Override public boolean test() { - return test(LPAREN, RPAREN, ASSIGN, RT, IDENTIFIER); + return test(LPAREN, ASSIGN, RT, RPAREN, IDENTIFIER); } } diff --git a/src/com/fjava/translator/ClosureType1.java b/src/com/fjava/translator/ClosureType1.java index 08dafce..f4e230d 100644 --- a/src/com/fjava/translator/ClosureType1.java +++ b/src/com/fjava/translator/ClosureType1.java @@ -20,6 +20,6 @@ public String translate() { @Override public boolean test() { - return test(LPAREN, IDENTIFIER, RPAREN, ASSIGN, RT, IDENTIFIER); + return test(LPAREN, IDENTIFIER, ASSIGN, RT, RPAREN, IDENTIFIER); } } diff --git a/src/com/fjava/translator/ClosureType2.java b/src/com/fjava/translator/ClosureType2.java index 8bcad1d..d02d572 100644 --- a/src/com/fjava/translator/ClosureType2.java +++ b/src/com/fjava/translator/ClosureType2.java @@ -21,6 +21,6 @@ public String translate() { @Override public boolean test() { - return test(LPAREN, IDENTIFIER, COMMA, IDENTIFIER, RPAREN, ASSIGN, RT, IDENTIFIER); + return test(LPAREN, IDENTIFIER, COMMA, IDENTIFIER, ASSIGN, RT, RPAREN, IDENTIFIER); } } diff --git a/src/com/fjava/translator/ClosureTypeWithoutParentheses.java b/src/com/fjava/translator/ClosureTypeWithoutParentheses.java deleted file mode 100644 index f7c00af..0000000 --- a/src/com/fjava/translator/ClosureTypeWithoutParentheses.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.fjava.translator; - -import static com.fjava.translator.TokenType.ASSIGN; -import static com.fjava.translator.TokenType.IDENTIFIER; -import static com.fjava.translator.TokenType.RT; - -public class ClosureTypeWithoutParentheses extends Atom { - - public ClosureTypeWithoutParentheses(TranslatorFactory factory) { - super(factory); - } - - @Override - public String translate() { - skipRequired(); - return format("final F $3"); - } - - @Override - public boolean test() { - return test(ASSIGN, RT, IDENTIFIER); - } -} diff --git a/src/com/fjava/translator/TranslatorFactory.java b/src/com/fjava/translator/TranslatorFactory.java index 4558249..b7520a2 100644 --- a/src/com/fjava/translator/TranslatorFactory.java +++ b/src/com/fjava/translator/TranslatorFactory.java @@ -14,15 +14,17 @@ class TranslatorFactory { PLUGINS.add(Closure2.class); PLUGINS.add(ClosureShort1.class); PLUGINS.add(ClosureShort2.class); + PLUGINS.add(ClosureNotInitialized.class); + PLUGINS.add(ClosureNotInitialized1.class); + PLUGINS.add(ClosureNotInitialized2.class); + PLUGINS.add(ClosureType.class); + PLUGINS.add(ClosureType1.class); + PLUGINS.add(ClosureType2.class); PLUGINS.add(ClosureAnonymous.class); PLUGINS.add(ClosureAnonymous1.class); PLUGINS.add(ClosureAnonymous2.class); PLUGINS.add(ClosureAnonymousShort1.class); PLUGINS.add(ClosureAnonymousShort2.class); - PLUGINS.add(ClosureType.class); - PLUGINS.add(ClosureTypeWithoutParentheses.class); - PLUGINS.add(ClosureType1.class); - PLUGINS.add(ClosureType2.class); PLUGINS.add(Lazy.class); PLUGINS.add(Clazz.class); } From 0d8d3eaf3fb4d2eae0f3092e1079c103a7513462 Mon Sep 17 00:00:00 2001 From: Vladimir Lichonos Date: Sun, 29 Jan 2012 15:34:16 -0800 Subject: [PATCH 3/3] Fix for anonymous closures when multiple separated by comma in list of parameters --- src/com/fjava/translator/ClosureAnonymousShort1.java | 5 ++++- src/com/fjava/translator/ClosureAnonymousShort2.java | 12 ++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/com/fjava/translator/ClosureAnonymousShort1.java b/src/com/fjava/translator/ClosureAnonymousShort1.java index 6431058..00153cc 100644 --- a/src/com/fjava/translator/ClosureAnonymousShort1.java +++ b/src/com/fjava/translator/ClosureAnonymousShort1.java @@ -6,6 +6,7 @@ import static com.fjava.translator.TokenType.RPAREN; import static com.fjava.translator.TokenType.RT; import static com.fjava.translator.TokenType.SEMICOLON; +import static com.fjava.translator.TokenType.COMMA; public class ClosureAnonymousShort1 extends Atom { @@ -20,7 +21,7 @@ public String translate() { int parenCounter = 0; TokenType type = require(); - while (type != SEMICOLON) { + while (type != SEMICOLON && type != COMMA) { if (type == LPAREN) parenCounter++; else if (type == RPAREN && --parenCounter < 0) @@ -33,6 +34,8 @@ else if (type == RPAREN && --parenCounter < 0) if (type == RPAREN) result.append(')'); + else if (type == COMMA) + result.append(','); return result.toString(); } diff --git a/src/com/fjava/translator/ClosureAnonymousShort2.java b/src/com/fjava/translator/ClosureAnonymousShort2.java index 7a6b0be..5135667 100644 --- a/src/com/fjava/translator/ClosureAnonymousShort2.java +++ b/src/com/fjava/translator/ClosureAnonymousShort2.java @@ -1,6 +1,12 @@ package com.fjava.translator; -import static com.fjava.translator.TokenType.*; +import static com.fjava.translator.TokenType.ASSIGN; +import static com.fjava.translator.TokenType.COMMA; +import static com.fjava.translator.TokenType.IDENTIFIER; +import static com.fjava.translator.TokenType.LPAREN; +import static com.fjava.translator.TokenType.RPAREN; +import static com.fjava.translator.TokenType.RT; +import static com.fjava.translator.TokenType.SEMICOLON; public class ClosureAnonymousShort2 extends Atom { @@ -16,7 +22,7 @@ public String translate() { int parenCounter = 0; TokenType type = require(); - while (type != SEMICOLON) { + while (type != SEMICOLON && type != COMMA) { if (type == LPAREN) parenCounter++; else if (type == RPAREN && --parenCounter < 0) @@ -29,6 +35,8 @@ else if (type == RPAREN && --parenCounter < 0) if (type == RPAREN) result.append(')'); + else if (type == COMMA) + result.append(','); return result.toString(); }