Mercurial Hosting > luan
changeset 25:0e406bd9ac7b
fix table constructors
git-svn-id: https://luan-java.googlecode.com/svn/trunk@26 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Thu, 06 Dec 2012 09:36:24 +0000 |
parents | 7ee247560db5 |
children | 409871b33355 |
files | src/luan/interp/LuaParser.java src/luan/interp/TableExpr.java |
diffstat | 2 files changed, 17 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
diff -r 7ee247560db5 -r 0e406bd9ac7b src/luan/interp/LuaParser.java --- a/src/luan/interp/LuaParser.java Thu Dec 06 04:40:54 2012 +0000 +++ b/src/luan/interp/LuaParser.java Thu Dec 06 09:36:24 2012 +0000 @@ -521,68 +521,42 @@ } Rule TableExpr() { + Var<List<TableExpr.Field>> fields = new Var<List<TableExpr.Field>>(new ArrayList<TableExpr.Field>()); + Var<ExpList.Builder> builder = new Var<ExpList.Builder>(new ExpList.Builder()); return Sequence( '{', incParens(), Spaces(), - push( new ArrayList<TableExpr.Field>() ), - push( 1.0 ), // counter Optional( - Field(), + Field(fields,builder), ZeroOrMore( FieldSep(), - Field() + Field(fields,builder) ), Optional( FieldSep() ) ), '}', decParens(), - push( newTableExpr() ), - Spaces() + Spaces(), + push( new TableExpr( fields.get().toArray(new TableExpr.Field[0]), builder.get().build() ) ) ); } - TableExpr newTableExpr() { - pop(); // counter - @SuppressWarnings("unchecked") - List<TableExpr.Field> list = (List<TableExpr.Field>)pop(); - return new TableExpr(list.toArray(new TableExpr.Field[0])); - } - Rule FieldSep() { return Sequence( AnyOf(",;"), Spaces() ); } - Rule Field() { + Rule Field(Var<List<TableExpr.Field>> fields,Var<ExpList.Builder> builder) { return FirstOf( Sequence( FirstOf( SubExpr(), NameExpr() ), '=', Spaces(), Expr(), - addField() + fields.get().add( new TableExpr.Field( expr(pop(1)), expr(pop()) ) ) ), Sequence( Expr(), - addIndexedField() + addToExpList(builder.get()) ) ); } - boolean addField() { - TableExpr.Field field = new TableExpr.Field( expr(pop(1)), expr(pop()) ); - @SuppressWarnings("unchecked") - List<TableExpr.Field> list = (List<TableExpr.Field>)peek(1); - list.add(field); - return true; - } - - boolean addIndexedField() { - Expr val = expr(pop()); - double i = (Double)pop(); - TableExpr.Field field = new TableExpr.Field( new ConstExpr(new LuaNumber(i)), val ); - push( i + 1 ); - @SuppressWarnings("unchecked") - List<TableExpr.Field> list = (List<TableExpr.Field>)peek(1); - list.add(field); - return true; - } - static Expr expr(Object obj) { if( obj instanceof Expressions ) return new ExpressionsExpr((Expressions)obj); @@ -690,7 +664,6 @@ return true; } - Rule SubExpr() { return Sequence( '[', incParens(), Spaces(), Expr(), ']', decParens(), Spaces() ); }
diff -r 7ee247560db5 -r 0e406bd9ac7b src/luan/interp/TableExpr.java --- a/src/luan/interp/TableExpr.java Thu Dec 06 04:40:54 2012 +0000 +++ b/src/luan/interp/TableExpr.java Thu Dec 06 09:36:24 2012 +0000 @@ -3,6 +3,7 @@ import luan.LuaException; import luan.LuaState; import luan.LuaTable; +import luan.LuaNumber; final class TableExpr implements Expr { @@ -18,9 +19,11 @@ } private final Field[] fields; + private final Expressions expressions; - TableExpr(Field[] fields) { + TableExpr(Field[] fields,Expressions expressions) { this.fields = fields; + this.expressions = expressions; } @Override public Object eval(LuaState lua) throws LuaException { @@ -28,6 +31,10 @@ for( Field field : fields ) { table.set( field.key.eval(lua), field.value.eval(lua) ); } + Object[] a = expressions.eval(lua); + for( int i=0; i<a.length; i++ ) { + table.set( new LuaNumber(i+1), a[i] ); + } return table; } }