Improve java code generator.
This commit is contained in:
@@ -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); }
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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( "}" );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user