changeset 2:4da26b11d12a

start interp git-svn-id: https://luan-java.googlecode.com/svn/trunk@3 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Wed, 14 Nov 2012 08:53:25 +0000
parents 2df768b926aa
children 7a2cdbc5767f
files src/luan/Lua.java src/luan/LuaException.java src/luan/LuaJavaFunction.java src/luan/LuaNumber.java src/luan/interp/AddExpr.java src/luan/interp/BinaryOpExpr.java src/luan/interp/ConstExpr.java src/luan/interp/ExpList.java src/luan/interp/Expr.java src/luan/interp/FnCall.java src/luan/interp/LengthExpr.java src/luan/interp/SubExpr.java src/luan/interp/UnaryOpExpr.java src/luan/interp/Values.java src/luan/interp/ValuesExpr.java src/luan/lib/BasicLib.java
diffstat 16 files changed, 281 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/Lua.java	Tue Nov 13 05:54:32 2012 +0000
+++ b/src/luan/Lua.java	Wed Nov 14 08:53:25 2012 +0000
@@ -3,12 +3,6 @@
 
 public class Lua {
 
-	public static String toString(Object obj) {
-		if( obj == null )
-			return "nil";
-		return obj.toString();
-	}
-
 	public static String type(Object obj) {
 		if( obj == null )
 			return "nil";
@@ -21,19 +15,13 @@
 		return "userdata";
 	}
 
-	public static int length(Object obj) throws LuaException {
-		if( obj instanceof String ) {
-			String s = (String)obj;
-			return s.length();
-		}
-		if( obj instanceof LuaTable ) {
-			LuaTable t = (LuaTable)obj;
-			return t.length();
-		}
-		throw new LuaException( "attempt to get length of a " + type(obj) + " value" );
+	public static String toString(Object obj) {
+		if( obj == null )
+			return "nil";
+		return obj.toString();
 	}
 
-	static LuaNumber toNumber(Object obj) throws LuaException {
+	public static LuaNumber toNumber(Object obj) throws LuaException {
 		if( obj instanceof LuaNumber )
 			return (LuaNumber)obj;
 		if( obj instanceof String ) {
@@ -45,12 +33,10 @@
 		throw new LuaException( "attempt to perform arithmetic on a " + type(obj) + " value" );
 	}
 
-	static LuaNumber add(Object n1,Object n2) throws LuaException {
-		return new LuaNumber( toNumber(n1).n + toNumber(n2).n );
-	}
-
-	static LuaNumber sub(Object n1,Object n2) throws LuaException {
-		return new LuaNumber( toNumber(n1).n - toNumber(n2).n );
+	public static LuaFunction toFunction(Object obj) throws LuaException {
+		if( obj instanceof LuaFunction )
+			return (LuaFunction)obj;
+		throw new LuaException( "attempt to call a " + type(obj) + " value" );
 	}
 
 }
--- a/src/luan/LuaException.java	Tue Nov 13 05:54:32 2012 +0000
+++ b/src/luan/LuaException.java	Wed Nov 14 08:53:25 2012 +0000
@@ -3,7 +3,7 @@
 
 public class LuaException extends Exception {
 
-	LuaException(String msg) {
+	public LuaException(String msg) {
 		super(msg);
 	}
 
--- a/src/luan/LuaJavaFunction.java	Tue Nov 13 05:54:32 2012 +0000
+++ b/src/luan/LuaJavaFunction.java	Wed Nov 14 08:53:25 2012 +0000
@@ -17,7 +17,7 @@
 		argConverters = getArgConverters(method);
 	}
 
-	public Object[] call(Object... args) {
+	@Override public Object[] call(Object... args) {
 		args = fixArgs(args);
 		Object rtn;
 		try {
--- a/src/luan/LuaNumber.java	Tue Nov 13 05:54:32 2012 +0000
+++ b/src/luan/LuaNumber.java	Wed Nov 14 08:53:25 2012 +0000
@@ -1,13 +1,17 @@
 package luan;
 
 
-public class LuaNumber {
+public final class LuaNumber {
 	final double n;
 
 	public LuaNumber(double n) {
 		this.n = n;
 	}
 
+	public double value() {
+		return n;
+	}
+
 	// convert to Lua format
 	@Override public String toString() {
 		String s = Double.toString(n);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/AddExpr.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,19 @@
+package luan.interp;
+
+import luan.Lua;
+import luan.LuaNumber;
+import luan.LuaException;
+
+
+final class AddExpr extends BinaryOpExpr {
+
+	AddExpr(Expr op1,Expr op2) {
+		super(op1,op2);
+	}
+
+	@Override Object eval() throws LuaException {
+		double n1 = Lua.toNumber(op1.eval()).value();
+		double n2 = Lua.toNumber(op2.eval()).value();
+		return new LuaNumber( n1 + n2 );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/BinaryOpExpr.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,12 @@
+package luan.interp;
+
+
+abstract class BinaryOpExpr extends Expr {
+	final Expr op1;
+	final Expr op2;
+
+	BinaryOpExpr(Expr op1,Expr op2) {
+		this.op1 = op1;
+		this.op2 = op2;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/ConstExpr.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,14 @@
+package luan.interp;
+
+
+final class ConstExpr extends Expr {
+	private final Object obj;
+
+	ConstExpr(Object obj) {
+		this.obj = obj;
+	}
+
+	@Override Object eval() {
+		return obj;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/ExpList.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,71 @@
+package luan.interp;
+
+import java.util.List;
+import java.util.ArrayList;
+import luan.LuaException;
+
+
+final class ExpList extends Values {
+
+	private interface Adder {
+		public void addTo(List<Object> list) throws LuaException;
+	}
+
+	private static class ExprAdder implements Adder {
+		private final Expr expr;
+
+		ExprAdder(Expr expr) {
+			this.expr = expr;
+		}
+
+		public void addTo(List<Object> list) throws LuaException {
+			list.add( expr.eval() );
+		}
+
+	}
+
+	private static class ValuesAdder implements Adder {
+		private final Values values;
+
+		ValuesAdder(Values values) {
+			this.values = values;
+		}
+
+		public void addTo(List<Object> list) throws LuaException {
+			for( Object val : values.eval() ) {
+				list.add( val );
+			}
+		}
+
+	}
+
+	static class Builder {
+		private final List<Adder> adders = new ArrayList<Adder>();
+
+		void add(Expr expr) {
+			adders.add( new ExprAdder(expr) );
+		}
+
+		void add(Values values) {
+			adders.add( new ValuesAdder(values) );
+		}
+
+		ExpList build() {
+			return new ExpList( adders.toArray(new Adder[0]) );
+		}
+	}
+
+	private final Adder[] adders;
+
+	private ExpList(Adder[] adders) {
+		this.adders = adders;
+	}
+
+	List eval() throws LuaException {
+		List<Object> list = new ArrayList<Object>();
+		for( Adder adder : adders ) {
+			adder.addTo(list);
+		}
+		return list;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/Expr.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,8 @@
+package luan.interp;
+
+import luan.LuaException;
+
+
+abstract class Expr {
+	abstract Object eval() throws LuaException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/FnCall.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,23 @@
+package luan.interp;
+
+import java.util.Arrays;
+import java.util.List;
+import luan.Lua;
+import luan.LuaFunction;
+import luan.LuaException;
+
+
+final class FnCall extends Values {
+	private final Expr fnExpr;
+	private final Values args;
+
+	FnCall(Expr fnExpr,Values args) {
+		this.fnExpr = fnExpr;
+		this.args = args;
+	}
+
+	List eval() throws LuaException {
+		LuaFunction fn = Lua.toFunction( fnExpr.eval() );
+		return Arrays.asList( fn.call( args.eval().toArray() ) );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/LengthExpr.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,30 @@
+package luan.interp;
+
+import luan.Lua;
+import luan.LuaNumber;
+import luan.LuaTable;
+import luan.LuaException;
+
+
+final class LengthExpr extends UnaryOpExpr {
+
+	LengthExpr(Expr op) {
+		super(op);
+	}
+
+	@Override Object eval() throws LuaException {
+		return new LuaNumber( length(op.eval()) );
+	}
+
+	private static int length(Object obj) throws LuaException {
+		if( obj instanceof String ) {
+			String s = (String)obj;
+			return s.length();
+		}
+		if( obj instanceof LuaTable ) {
+			LuaTable t = (LuaTable)obj;
+			return t.length();
+		}
+		throw new LuaException( "attempt to get length of a " + Lua.type(obj) + " value" );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/SubExpr.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,19 @@
+package luan.interp;
+
+import luan.Lua;
+import luan.LuaNumber;
+import luan.LuaException;
+
+
+final class SubExpr extends BinaryOpExpr {
+
+	SubExpr(Expr op1,Expr op2) {
+		super(op1,op2);
+	}
+
+	@Override Object eval() throws LuaException {
+		double n1 = Lua.toNumber(op1.eval()).value();
+		double n2 = Lua.toNumber(op2.eval()).value();
+		return new LuaNumber( n1 - n2 );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/UnaryOpExpr.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,10 @@
+package luan.interp;
+
+
+abstract class UnaryOpExpr extends Expr {
+	final Expr op;
+
+	UnaryOpExpr(Expr op) {
+		this.op = op;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/Values.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,9 @@
+package luan.interp;
+
+import java.util.List;
+import luan.LuaException;
+
+
+abstract class Values {
+	abstract List eval() throws LuaException;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/ValuesExpr.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,19 @@
+package luan.interp;
+
+import java.util.List;
+import luan.Lua;
+import luan.LuaException;
+
+
+final class ValuesExpr extends Expr {
+	private final Values values;
+
+	ValuesExpr(Values values) {
+		this.values = values;
+	}
+
+	@Override Object eval() throws LuaException {
+		List list = values.eval();
+		return list.isEmpty() ? null : list.get(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/lib/BasicLib.java	Wed Nov 14 08:53:25 2012 +0000
@@ -0,0 +1,31 @@
+package luan.lib;
+
+import luan.Lua;
+import luan.LuaTable;
+import luan.LuaJavaFunction;
+
+
+public class BasicLib {
+
+	public static void register(LuaTable t) {
+		add( t, "print", new Object[0].getClass() );
+	}
+
+	private static void add(LuaTable t,String method,Class<?>... parameterTypes) {
+		try {
+			t.set( method, new LuaJavaFunction(BasicLib.class.getMethod(method,parameterTypes),null) );
+		} catch(NoSuchMethodException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	public static void print(Object... args) {
+		for( int i=0; i<args.length; i++ ) {
+			if( i > 0 )
+				System.out.print('\t');
+			System.out.print( Lua.toString(args[i]) );
+		}
+		System.out.println();
+	}
+
+}