Improve java code generator.

This commit is contained in:
James Roseborough
2010-07-22 23:35:25 +00:00
parent 67216b17e1
commit 6bf647ff37
7 changed files with 27 additions and 18 deletions

View File

@@ -342,7 +342,7 @@ Exp SimpleExp():
<NIL> { return Exp.constant(LuaValue.NIL); } <NIL> { return Exp.constant(LuaValue.NIL); }
| <TRUE> { return Exp.constant(LuaValue.TRUE); } | <TRUE> { return Exp.constant(LuaValue.TRUE); }
| <FALSE> { return Exp.constant(LuaValue.FALSE); } | <FALSE> { return Exp.constant(LuaValue.FALSE); }
| n=<NUMBER> { return Exp.constant(LuaValue.valueOf(Double.valueOf(n.image))); } | n=<NUMBER> { return Exp.numberconstant(n.image); }
| s=Str() { return Exp.constant(s); } | s=Str() { return Exp.constant(s); }
| "..." { return Exp.varargs(); } | "..." { return Exp.varargs(); }
| tc=TableConstructor() { return Exp.tableconstructor(tc); } | tc=TableConstructor() { return Exp.tableconstructor(tc); }

View File

@@ -30,6 +30,7 @@ import java.util.List;
import org.luaj.vm2.Lua; import org.luaj.vm2.Lua;
import org.luaj.vm2.ast.Chunk; import org.luaj.vm2.ast.Chunk;
import org.luaj.vm2.lib.JsePlatform;
import org.luaj.vm2.lua2java.JavaCodeGen; import org.luaj.vm2.lua2java.JavaCodeGen;
import org.luaj.vm2.parser.LuaParser; import org.luaj.vm2.parser.LuaParser;
@@ -125,6 +126,7 @@ public class lua2java {
} }
// process input files // process input files
JsePlatform.standardGlobals();
for ( InputFile inf : files ) for ( InputFile inf : files )
processFile( inf ); processFile( inf );

View File

@@ -32,6 +32,10 @@ public class Exp {
return new Constant(value); return new Constant(value);
} }
public static Exp numberconstant(String token) {
return new Constant( LuaValue.valueOf(token).tonumber() );
}
public static Exp varargs() { public static Exp varargs() {
return new VarargsExp(); 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_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_CONCAT: return 3;
case Lua.OP_ADD: case Lua.OP_SUB: return 4; 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_NOT: case Lua.OP_UNM: case Lua.OP_LEN: return 6;
case Lua.OP_POW: return 7; case Lua.OP_POW: return 7;
default: throw new IllegalStateException("precedence of bad op "+op); default: throw new IllegalStateException("precedence of bad op "+op);

View File

@@ -91,7 +91,7 @@ public class NameResolver extends Visitor {
} }
public void visit(LocalAssign stat) { public void visit(LocalAssign stat) {
super.visit(stat); visitExps(stat.values);
defineLocalVars( stat.names ); defineLocalVars( stat.names );
} }

View File

@@ -317,18 +317,17 @@ public class JavaCodeGen {
} }
public void visit(BinopExp exp) { public void visit(BinopExp exp) {
String lhs = evalLuaValue(exp.lhs) ;
String rhs = evalLuaValue(exp.rhs) ;
switch ( exp.op ) { switch ( exp.op ) {
case Lua.OP_AND: case Lua.OP_AND:
case Lua.OP_OR: case Lua.OP_OR:
out(exp.op==Lua.OP_AND? "(!($b=": "(($b="); String not = (exp.op==Lua.OP_AND? "!": "");
exp.lhs.accept(this); out("("+not+"($b="+lhs+").toboolean()?$b:"+rhs+")");
out(").toboolean()?$b:");
exp.rhs.accept(this);
out( ")" );
return; return;
} }
exp.lhs.accept(this); out( lhs );
switch ( exp.op ) { switch ( exp.op ) {
case Lua.OP_ADD: out(".add"); break; case Lua.OP_ADD: out(".add"); break;
case Lua.OP_SUB: out(".sub"); break; case Lua.OP_SUB: out(".sub"); break;
@@ -345,9 +344,7 @@ public class JavaCodeGen {
case Lua.OP_CONCAT: out(".concat"); break; case Lua.OP_CONCAT: out(".concat"); break;
default: throw new IllegalStateException("unknown bin op:"+exp.op); default: throw new IllegalStateException("unknown bin op:"+exp.op);
} }
out("("); out("("+rhs+")");
exp.rhs.accept(this);
out(")");
} }
public void visit(UnopExp exp) { public void visit(UnopExp exp) {
@@ -444,7 +441,7 @@ public class JavaCodeGen {
case 0: case 0:
out(".method("+evalStringConstant(exp.name)+")"); out(".method("+evalStringConstant(exp.name)+")");
break; break;
case 1: case 2: case 3: case 1: case 2:
out(".method("+evalStringConstant(exp.name)+","); out(".method("+evalStringConstant(exp.name)+",");
exp.args.accept(this); exp.args.accept(this);
out(")"); out(")");
@@ -605,16 +602,19 @@ public class JavaCodeGen {
public void visit(NumericFor stat) { public void visit(NumericFor stat) {
String javaname = javascope.getJavaName(stat.name.variable); String javaname = javascope.getJavaName(stat.name.variable);
String indexname = stat.name.variable.isupvalue? javaname+"$0": javaname;
outi("for ( LuaValue " outi("for ( LuaValue "
+javaname+"="+evalLuaValue(stat.initial)+", " +indexname+"="+evalLuaValue(stat.initial)+", "
+javaname+"$limit="+evalLuaValue(stat.limit)); +javaname+"$limit="+evalLuaValue(stat.limit));
String stepname = "ONE"; String stepname = "ONE";
if ( stat.step!=null ) if ( stat.step!=null )
out(", "+(stepname=javaname+"$step")+"="+evalLuaValue(stat.step)); out(", "+(stepname=javaname+"$step")+"="+evalLuaValue(stat.step));
outr( "; " outr( "; "
+javaname+".testfor_b("+javaname+"$limit,"+stepname+"); " +indexname+".testfor_b("+javaname+"$limit,"+stepname+"); "
+javaname+"="+javaname+".add("+stepname+") ) {" ); +indexname+"="+indexname+".add("+stepname+") ) {" );
addindent(); addindent();
if ( stat.name.variable.isupvalue )
this.singleLocalDeclareAssign(stat.name, indexname);
super.visit(stat.block); super.visit(stat.block);
oute( "}" ); oute( "}" );
} }

View File

@@ -56,6 +56,9 @@ public class JavaScope extends NameScope {
"char", "final", "interface", "static", "void", "char", "final", "interface", "static", "void",
"class", "finally", "long", "strictfp", "volatile", "class", "finally", "long", "strictfp", "volatile",
"const", "float", "native", "super", "while", "const", "float", "native", "super", "while",
// java literals
"false", "null", "true",
}; };
static { static {
@@ -101,7 +104,7 @@ public class JavaScope extends NameScope {
final private String allocateJavaName(Object astele, String proposal) { final private String allocateJavaName(Object astele, String proposal) {
for ( int i=0; true; i++ ) { for ( int i=0; true; i++ ) {
String jname = proposal+(i==0? "": "$"+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); javanames.add(jname);
astele2javaname.put(astele,jname); astele2javaname.put(astele,jname);
return jname; return jname;

View File

@@ -551,7 +551,7 @@ public class LuaParser implements LuaParserConstants {
break; break;
case NUMBER: case NUMBER:
n = jj_consume_token(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; break;
case LONGSTRING0: case LONGSTRING0:
case LONGSTRING1: case LONGSTRING1: