Mercurial Hosting > luan
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 |