From 6bf647ff373f3166b20c89f5a6ca7195a7390015 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Thu, 22 Jul 2010 23:35:25 +0000 Subject: [PATCH] Improve java code generator. --- grammar/LuaParser.jj | 2 +- src/jse/lua2java.java | 2 ++ src/jse/org/luaj/vm2/ast/Exp.java | 6 ++++- src/jse/org/luaj/vm2/ast/NameResolver.java | 2 +- .../org/luaj/vm2/lua2java/JavaCodeGen.java | 26 +++++++++---------- src/jse/org/luaj/vm2/lua2java/JavaScope.java | 5 +++- src/jse/org/luaj/vm2/parser/LuaParser.java | 2 +- 7 files changed, 27 insertions(+), 18 deletions(-) diff --git a/grammar/LuaParser.jj b/grammar/LuaParser.jj index cf8bd675..2b1f9b64 100644 --- a/grammar/LuaParser.jj +++ b/grammar/LuaParser.jj @@ -342,7 +342,7 @@ Exp SimpleExp(): { return Exp.constant(LuaValue.NIL); } | { return Exp.constant(LuaValue.TRUE); } | { return Exp.constant(LuaValue.FALSE); } -| n= { return Exp.constant(LuaValue.valueOf(Double.valueOf(n.image))); } +| n= { return Exp.numberconstant(n.image); } | s=Str() { return Exp.constant(s); } | "..." { return Exp.varargs(); } | tc=TableConstructor() { return Exp.tableconstructor(tc); } diff --git a/src/jse/lua2java.java b/src/jse/lua2java.java index 18779543..226b5325 100644 --- a/src/jse/lua2java.java +++ b/src/jse/lua2java.java @@ -30,6 +30,7 @@ import java.util.List; import org.luaj.vm2.Lua; import org.luaj.vm2.ast.Chunk; +import org.luaj.vm2.lib.JsePlatform; import org.luaj.vm2.lua2java.JavaCodeGen; import org.luaj.vm2.parser.LuaParser; @@ -125,6 +126,7 @@ public class lua2java { } // process input files + JsePlatform.standardGlobals(); for ( InputFile inf : files ) processFile( inf ); diff --git a/src/jse/org/luaj/vm2/ast/Exp.java b/src/jse/org/luaj/vm2/ast/Exp.java index 04de007c..beb3069c 100644 --- a/src/jse/org/luaj/vm2/ast/Exp.java +++ b/src/jse/org/luaj/vm2/ast/Exp.java @@ -32,6 +32,10 @@ public class Exp { return new Constant(value); } + public static Exp numberconstant(String token) { + return new Constant( LuaValue.valueOf(token).tonumber() ); + } + public static Exp varargs() { return new VarargsExp(); } @@ -87,7 +91,7 @@ public class Exp { case Lua.OP_LT: case Lua.OP_GT: case Lua.OP_LE: case Lua.OP_GE: case Lua.OP_NEQ: case Lua.OP_EQ: return 2; case Lua.OP_CONCAT: return 3; case Lua.OP_ADD: case Lua.OP_SUB: return 4; - case Lua.OP_MUL: case Lua.OP_DIV: return 5; + case Lua.OP_MUL: case Lua.OP_DIV: case Lua.OP_MOD: return 5; case Lua.OP_NOT: case Lua.OP_UNM: case Lua.OP_LEN: return 6; case Lua.OP_POW: return 7; default: throw new IllegalStateException("precedence of bad op "+op); diff --git a/src/jse/org/luaj/vm2/ast/NameResolver.java b/src/jse/org/luaj/vm2/ast/NameResolver.java index c93b64fb..715f1aed 100644 --- a/src/jse/org/luaj/vm2/ast/NameResolver.java +++ b/src/jse/org/luaj/vm2/ast/NameResolver.java @@ -91,7 +91,7 @@ public class NameResolver extends Visitor { } public void visit(LocalAssign stat) { - super.visit(stat); + visitExps(stat.values); defineLocalVars( stat.names ); } diff --git a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java index 666f3f95..90bdf7fb 100644 --- a/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java +++ b/src/jse/org/luaj/vm2/lua2java/JavaCodeGen.java @@ -317,18 +317,17 @@ public class JavaCodeGen { } public void visit(BinopExp exp) { + String lhs = evalLuaValue(exp.lhs) ; + String rhs = evalLuaValue(exp.rhs) ; switch ( exp.op ) { case Lua.OP_AND: case Lua.OP_OR: - out(exp.op==Lua.OP_AND? "(!($b=": "(($b="); - exp.lhs.accept(this); - out(").toboolean()?$b:"); - exp.rhs.accept(this); - out( ")" ); + String not = (exp.op==Lua.OP_AND? "!": ""); + out("("+not+"($b="+lhs+").toboolean()?$b:"+rhs+")"); return; } - exp.lhs.accept(this); + out( lhs ); switch ( exp.op ) { case Lua.OP_ADD: out(".add"); break; case Lua.OP_SUB: out(".sub"); break; @@ -345,9 +344,7 @@ public class JavaCodeGen { case Lua.OP_CONCAT: out(".concat"); break; default: throw new IllegalStateException("unknown bin op:"+exp.op); } - out("("); - exp.rhs.accept(this); - out(")"); + out("("+rhs+")"); } public void visit(UnopExp exp) { @@ -444,7 +441,7 @@ public class JavaCodeGen { case 0: out(".method("+evalStringConstant(exp.name)+")"); break; - case 1: case 2: case 3: + case 1: case 2: out(".method("+evalStringConstant(exp.name)+","); exp.args.accept(this); out(")"); @@ -605,16 +602,19 @@ public class JavaCodeGen { public void visit(NumericFor stat) { String javaname = javascope.getJavaName(stat.name.variable); + String indexname = stat.name.variable.isupvalue? javaname+"$0": javaname; outi("for ( LuaValue " - +javaname+"="+evalLuaValue(stat.initial)+", " + +indexname+"="+evalLuaValue(stat.initial)+", " +javaname+"$limit="+evalLuaValue(stat.limit)); String stepname = "ONE"; if ( stat.step!=null ) out(", "+(stepname=javaname+"$step")+"="+evalLuaValue(stat.step)); outr( "; " - +javaname+".testfor_b("+javaname+"$limit,"+stepname+"); " - +javaname+"="+javaname+".add("+stepname+") ) {" ); + +indexname+".testfor_b("+javaname+"$limit,"+stepname+"); " + +indexname+"="+indexname+".add("+stepname+") ) {" ); addindent(); + if ( stat.name.variable.isupvalue ) + this.singleLocalDeclareAssign(stat.name, indexname); super.visit(stat.block); oute( "}" ); } diff --git a/src/jse/org/luaj/vm2/lua2java/JavaScope.java b/src/jse/org/luaj/vm2/lua2java/JavaScope.java index 2b79aac3..0b89883e 100644 --- a/src/jse/org/luaj/vm2/lua2java/JavaScope.java +++ b/src/jse/org/luaj/vm2/lua2java/JavaScope.java @@ -56,6 +56,9 @@ public class JavaScope extends NameScope { "char", "final", "interface", "static", "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", "native", "super", "while", + + // java literals + "false", "null", "true", }; static { @@ -101,7 +104,7 @@ public class JavaScope extends NameScope { final private String allocateJavaName(Object astele, String proposal) { for ( int i=0; true; i++ ) { String jname = proposal+(i==0? "": "$"+i); - if ( ! javanames.contains(jname) && ! SPECIALS.contains(jname) && !staticnames.contains(jname) ) { + if ( ! isJavanameInScope(jname) && ! SPECIALS.contains(jname) && !staticnames.contains(jname) ) { javanames.add(jname); astele2javaname.put(astele,jname); return jname; diff --git a/src/jse/org/luaj/vm2/parser/LuaParser.java b/src/jse/org/luaj/vm2/parser/LuaParser.java index 5bf93ced..569f99cd 100644 --- a/src/jse/org/luaj/vm2/parser/LuaParser.java +++ b/src/jse/org/luaj/vm2/parser/LuaParser.java @@ -551,7 +551,7 @@ public class LuaParser implements LuaParserConstants { break; case NUMBER: n = jj_consume_token(NUMBER); - {if (true) return Exp.constant(LuaValue.valueOf(Double.valueOf(n.image)));} + {if (true) return Exp.numberconstant(n.image);} break; case LONGSTRING0: case LONGSTRING1: