comparison src/luan/interp/LuaParser.java @ 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
comparison
equal deleted inserted replaced
24:7ee247560db5 25:0e406bd9ac7b
519 push( VarArgs.INSTANCE ) 519 push( VarArgs.INSTANCE )
520 ); 520 );
521 } 521 }
522 522
523 Rule TableExpr() { 523 Rule TableExpr() {
524 Var<List<TableExpr.Field>> fields = new Var<List<TableExpr.Field>>(new ArrayList<TableExpr.Field>());
525 Var<ExpList.Builder> builder = new Var<ExpList.Builder>(new ExpList.Builder());
524 return Sequence( 526 return Sequence(
525 '{', incParens(), Spaces(), 527 '{', incParens(), Spaces(),
526 push( new ArrayList<TableExpr.Field>() ),
527 push( 1.0 ), // counter
528 Optional( 528 Optional(
529 Field(), 529 Field(fields,builder),
530 ZeroOrMore( 530 ZeroOrMore(
531 FieldSep(), 531 FieldSep(),
532 Field() 532 Field(fields,builder)
533 ), 533 ),
534 Optional( FieldSep() ) 534 Optional( FieldSep() )
535 ), 535 ),
536 '}', decParens(), 536 '}', decParens(),
537 push( newTableExpr() ), 537 Spaces(),
538 Spaces() 538 push( new TableExpr( fields.get().toArray(new TableExpr.Field[0]), builder.get().build() ) )
539 ); 539 );
540 }
541
542 TableExpr newTableExpr() {
543 pop(); // counter
544 @SuppressWarnings("unchecked")
545 List<TableExpr.Field> list = (List<TableExpr.Field>)pop();
546 return new TableExpr(list.toArray(new TableExpr.Field[0]));
547 } 540 }
548 541
549 Rule FieldSep() { 542 Rule FieldSep() {
550 return Sequence( AnyOf(",;"), Spaces() ); 543 return Sequence( AnyOf(",;"), Spaces() );
551 } 544 }
552 545
553 Rule Field() { 546 Rule Field(Var<List<TableExpr.Field>> fields,Var<ExpList.Builder> builder) {
554 return FirstOf( 547 return FirstOf(
555 Sequence( 548 Sequence(
556 FirstOf( SubExpr(), NameExpr() ), 549 FirstOf( SubExpr(), NameExpr() ),
557 '=', Spaces(), Expr(), 550 '=', Spaces(), Expr(),
558 addField() 551 fields.get().add( new TableExpr.Field( expr(pop(1)), expr(pop()) ) )
559 ), 552 ),
560 Sequence( 553 Sequence(
561 Expr(), 554 Expr(),
562 addIndexedField() 555 addToExpList(builder.get())
563 ) 556 )
564 ); 557 );
565 }
566
567 boolean addField() {
568 TableExpr.Field field = new TableExpr.Field( expr(pop(1)), expr(pop()) );
569 @SuppressWarnings("unchecked")
570 List<TableExpr.Field> list = (List<TableExpr.Field>)peek(1);
571 list.add(field);
572 return true;
573 }
574
575 boolean addIndexedField() {
576 Expr val = expr(pop());
577 double i = (Double)pop();
578 TableExpr.Field field = new TableExpr.Field( new ConstExpr(new LuaNumber(i)), val );
579 push( i + 1 );
580 @SuppressWarnings("unchecked")
581 List<TableExpr.Field> list = (List<TableExpr.Field>)peek(1);
582 list.add(field);
583 return true;
584 } 558 }
585 559
586 static Expr expr(Object obj) { 560 static Expr expr(Object obj) {
587 if( obj instanceof Expressions ) 561 if( obj instanceof Expressions )
588 return new ExpressionsExpr((Expressions)obj); 562 return new ExpressionsExpr((Expressions)obj);
687 } else { 661 } else {
688 bld.add( (Expr)obj ); 662 bld.add( (Expr)obj );
689 } 663 }
690 return true; 664 return true;
691 } 665 }
692
693 666
694 Rule SubExpr() { 667 Rule SubExpr() {
695 return Sequence( '[', incParens(), Spaces(), Expr(), ']', decParens(), Spaces() ); 668 return Sequence( '[', incParens(), Spaces(), Expr(), ']', decParens(), Spaces() );
696 } 669 }
697 670