Mercurial Hosting > luan
comparison core/src/luan/impl/LuanParser.java @ 650:d658eab7bf4c
finish compiling operators
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 31 Mar 2016 22:43:51 -0600 |
parents | 37f0cf43f191 |
children | 140cc5191b7a |
comparison
equal
deleted
inserted
replaced
649:37f0cf43f191 | 650:d658eab7bf4c |
---|---|
179 } | 179 } |
180 | 180 |
181 FnDef Expression() throws ParseException { | 181 FnDef Expression() throws ParseException { |
182 Spaces(In.NOTHING); | 182 Spaces(In.NOTHING); |
183 int start = parser.begin(); | 183 int start = parser.begin(); |
184 Expressions expr = ExprZ(In.NOTHING); | 184 Expressions expr = exp(ExprZ(In.NOTHING)); |
185 if( expr != null && parser.endOfInput() ) { | 185 if( expr != null && parser.endOfInput() ) { |
186 Stmt stmt = new ReturnStmt( expr ); | 186 Stmt stmt = new ReturnStmt( expr ); |
187 return parser.success(newFnDef(start,stmt)); | 187 return parser.success(newFnDef(start,stmt)); |
188 } | 188 } |
189 return parser.failure(null); | 189 return parser.failure(null); |
277 In inTemplate = in.template(); | 277 In inTemplate = in.template(); |
278 List<Expressions> builder = new ArrayList<Expressions>(); | 278 List<Expressions> builder = new ArrayList<Expressions>(); |
279 while(true) { | 279 while(true) { |
280 if( parser.match( "<%=" ) ) { | 280 if( parser.match( "<%=" ) ) { |
281 Spaces(inTemplate); | 281 Spaces(inTemplate); |
282 builder.add( RequiredExpr(inTemplate) ); | 282 builder.add( exp(RequiredExpr(inTemplate)) ); |
283 RequiredMatch( "%>" ); | 283 RequiredMatch( "%>" ); |
284 } else if( parser.match( "<%" ) ) { | 284 } else if( parser.match( "<%" ) ) { |
285 Spaces(inTemplate); | 285 Spaces(inTemplate); |
286 return parser.success(ExpList.build(builder)); | 286 return parser.success(ExpList.build(builder)); |
287 } else { | 287 } else { |
353 if( !Keyword("for",In.NOTHING) ) | 353 if( !Keyword("for",In.NOTHING) ) |
354 return parser.failure(null); | 354 return parser.failure(null); |
355 List<String> names = RequiredNameList(In.NOTHING); | 355 List<String> names = RequiredNameList(In.NOTHING); |
356 if( !Keyword("in",In.NOTHING) ) | 356 if( !Keyword("in",In.NOTHING) ) |
357 return parser.failure(null); | 357 return parser.failure(null); |
358 Expr expr = expr(RequiredExpr(In.NOTHING)); | 358 Expr expr = expr(exp(RequiredExpr(In.NOTHING))); |
359 RequiredKeyword("do",In.NOTHING); | 359 RequiredKeyword("do",In.NOTHING); |
360 addSymbols(names); | 360 addSymbols(names); |
361 Stmt loop = RequiredLoopBlock(); | 361 Stmt loop = RequiredLoopBlock(); |
362 RequiredKeyword("end",In.NOTHING); | 362 RequiredKeyword("end",In.NOTHING); |
363 Stmt stmt = new ForStmt( stackStart, symbolsSize() - stackStart, expr, loop ); | 363 Stmt stmt = new ForStmt( stackStart, symbolsSize() - stackStart, expr, loop ); |
433 | 433 |
434 private Stmt WhileStmt() throws ParseException { | 434 private Stmt WhileStmt() throws ParseException { |
435 parser.begin(); | 435 parser.begin(); |
436 if( !Keyword("while",In.NOTHING) ) | 436 if( !Keyword("while",In.NOTHING) ) |
437 return parser.failure(null); | 437 return parser.failure(null); |
438 Expr cnd = expr(RequiredExpr(In.NOTHING)); | 438 Expr cnd = expr(exp(RequiredExpr(In.NOTHING))); |
439 RequiredKeyword("do",In.NOTHING); | 439 RequiredKeyword("do",In.NOTHING); |
440 Stmt loop = RequiredLoopBlock(); | 440 Stmt loop = RequiredLoopBlock(); |
441 RequiredKeyword("end",In.NOTHING); | 441 RequiredKeyword("end",In.NOTHING); |
442 return parser.success( new WhileStmt(cnd,loop) ); | 442 return parser.success( new WhileStmt(cnd,loop) ); |
443 } | 443 } |
446 parser.begin(); | 446 parser.begin(); |
447 if( !Keyword("repeat",In.NOTHING) ) | 447 if( !Keyword("repeat",In.NOTHING) ) |
448 return parser.failure(null); | 448 return parser.failure(null); |
449 Stmt loop = RequiredLoopBlock(); | 449 Stmt loop = RequiredLoopBlock(); |
450 RequiredKeyword("until",In.NOTHING); | 450 RequiredKeyword("until",In.NOTHING); |
451 Expr cnd = expr(RequiredExpr(In.NOTHING)); | 451 Expr cnd = expr(exp(RequiredExpr(In.NOTHING))); |
452 return parser.success( new RepeatStmt(loop,cnd) ); | 452 return parser.success( new RepeatStmt(loop,cnd) ); |
453 } | 453 } |
454 | 454 |
455 private Stmt RequiredLoopBlock() throws ParseException { | 455 private Stmt RequiredLoopBlock() throws ParseException { |
456 incLoops(); | 456 incLoops(); |
466 return parser.success( IfStmt2() ); | 466 return parser.success( IfStmt2() ); |
467 } | 467 } |
468 | 468 |
469 private Stmt IfStmt2() throws ParseException { | 469 private Stmt IfStmt2() throws ParseException { |
470 parser.currentIndex(); | 470 parser.currentIndex(); |
471 Expr cnd = expr(RequiredExpr(In.NOTHING)); | 471 Expr cnd = expr(exp(RequiredExpr(In.NOTHING))); |
472 RequiredKeyword("then",In.NOTHING); | 472 RequiredKeyword("then",In.NOTHING); |
473 Stmt thenBlock = RequiredBlock(); | 473 Stmt thenBlock = RequiredBlock(); |
474 Stmt elseBlock; | 474 Stmt elseBlock; |
475 if( Keyword("elseif",In.NOTHING) ) { | 475 if( Keyword("elseif",In.NOTHING) ) { |
476 elseBlock = IfStmt2(); | 476 elseBlock = IfStmt2(); |
505 return parser.success( new SetStmt( vars.toArray(new Settable[0]), values ) ); | 505 return parser.success( new SetStmt( vars.toArray(new Settable[0]), values ) ); |
506 } | 506 } |
507 | 507 |
508 private Stmt ExpressionsStmt() throws ParseException { | 508 private Stmt ExpressionsStmt() throws ParseException { |
509 parser.begin(); | 509 parser.begin(); |
510 Expressions exp = ExprZ(In.NOTHING); | 510 Expressions exp = exp(ExprZ(In.NOTHING)); |
511 if( exp instanceof StmtExp ) | 511 if( exp instanceof StmtExp ) |
512 return parser.success( new ExpressionsStmt(exp) ); | 512 return parser.success( new ExpressionsStmt(exp) ); |
513 return parser.failure(null); | 513 return parser.failure(null); |
514 } | 514 } |
515 | 515 |
519 if( var==null ) | 519 if( var==null ) |
520 return parser.failure(null); | 520 return parser.failure(null); |
521 return parser.success( var.settable() ); | 521 return parser.success( var.settable() ); |
522 } | 522 } |
523 | 523 |
524 private Expressions RequiredExpr(In in) throws ParseException { | 524 private ExpString RequiredExpr(In in) throws ParseException { |
525 parser.begin(); | 525 parser.begin(); |
526 return parser.success(required(ExprZ(in),"Bad expression")); | 526 return parser.success(required(ExprZ(in),"Bad expression")); |
527 } | 527 } |
528 | 528 |
529 private Expressions ExprZ(In in) throws ParseException { | 529 private ExpString ExprZ(In in) throws ParseException { |
530 return OrExpr(in); | 530 return OrExpr(in); |
531 } | 531 } |
532 | 532 |
533 private Expressions OrExpr(In in) throws ParseException { | 533 private ExpString OrExpr(In in) throws ParseException { |
534 parser.begin(); | 534 parser.begin(); |
535 Expressions exp = AndExpr(in); | 535 ExpString exp = AndExpr(in); |
536 if( exp==null ) | 536 if( exp==null ) |
537 return parser.failure(null); | 537 return parser.failure(null); |
538 while( Keyword("or",in) ) { | 538 while( Keyword("or",in) ) { |
539 Expressions exp2 = AndExpr(in); | 539 exp = exp.expr(); |
540 exp = new OrExpr( expr(exp), required(expr(exp2)) ); | 540 ExpString exp2 = required(RelExpr(in)).expr(); |
541 String code = "($Luan.cnd($cnd = " + exp.code + ") ? $cnd : (" + exp2.code + "))"; | |
542 exp = new ExpString(code,true,true); | |
541 } | 543 } |
542 return parser.success(exp); | 544 return parser.success(exp); |
543 } | 545 } |
544 | 546 |
545 private Expressions AndExpr(In in) throws ParseException { | 547 private ExpString AndExpr(In in) throws ParseException { |
546 parser.begin(); | 548 parser.begin(); |
547 Expressions exp = RelExpr(in); | 549 ExpString exp = RelExpr(in); |
548 if( exp==null ) | 550 if( exp==null ) |
549 return parser.failure(null); | 551 return parser.failure(null); |
550 while( Keyword("and",in) ) { | 552 while( Keyword("and",in) ) { |
551 Expressions exp2 = RelExpr(in); | 553 exp = exp.expr(); |
552 exp = new AndExpr( expr(exp), required(expr(exp2)) ); | 554 ExpString exp2 = required(RelExpr(in)).expr(); |
555 String code = "($Luan.cnd($cnd = " + exp.code + ") ? (" + exp2.code + ") : $cnd)"; | |
556 exp = new ExpString(code,true,true); | |
553 } | 557 } |
554 return parser.success(exp); | 558 return parser.success(exp); |
555 } | 559 } |
556 | 560 |
557 private Expressions RelExpr(In in) throws ParseException { | 561 private ExpString RelExpr(In in) throws ParseException { |
558 parser.begin(); | 562 parser.begin(); |
559 Expressions exp = ConcatExpr(in); | 563 ExpString exp = ConcatExpr(in); |
560 if( exp==null ) | 564 if( exp==null ) |
561 return parser.failure(null); | 565 return parser.failure(null); |
562 while(true) { | 566 while(true) { |
563 if( parser.match("==") ) { | 567 if( parser.match("==") ) { |
564 Spaces(in); | 568 Spaces(in); |
565 Expressions exp2 = ConcatExpr(in); | 569 exp = exp.expr(); |
566 exp = new EqExpr( expr(exp), required(expr(exp2)) ); | 570 ExpString exp2 = required(ConcatExpr(in)).expr(); |
571 String code = "$Luan.eq($luan," + exp.code + "," + exp2.code + ")"; | |
572 exp = new ExpString(code,true,false); | |
567 } else if( parser.match("~=") ) { | 573 } else if( parser.match("~=") ) { |
568 Spaces(in); | 574 Spaces(in); |
569 Expressions exp2 = ConcatExpr(in); | 575 exp = exp.expr(); |
570 exp = new NotExpr( new EqExpr( expr(exp), required(expr(exp2)) ) ); | 576 ExpString exp2 = required(ConcatExpr(in)).expr(); |
577 String code = "!$Luan.eq($luan," + exp.code + "," + exp2.code + ")"; | |
578 exp = new ExpString(code,true,false); | |
571 } else if( parser.match("<=") ) { | 579 } else if( parser.match("<=") ) { |
572 Spaces(in); | 580 Spaces(in); |
573 Expressions exp2 = ConcatExpr(in); | 581 exp = exp.expr(); |
574 exp = new LeExpr( expr(exp), required(expr(exp2)) ); | 582 ExpString exp2 = required(ConcatExpr(in)).expr(); |
583 String code = "$Luan.le($luan," + exp.code + "," + exp2.code + ")"; | |
584 exp = new ExpString(code,true,false); | |
575 } else if( parser.match(">=") ) { | 585 } else if( parser.match(">=") ) { |
576 Spaces(in); | 586 Spaces(in); |
577 Expressions exp2 = ConcatExpr(in); | 587 exp = exp.expr(); |
578 exp = new LeExpr( required(expr(exp2)), expr(exp) ); | 588 ExpString exp2 = required(ConcatExpr(in)).expr(); |
589 String code = "$Luan.le($luan," + exp2.code + "," + exp.code + ")"; | |
590 exp = new ExpString(code,true,false); | |
579 } else if( parser.match("<") ) { | 591 } else if( parser.match("<") ) { |
580 Spaces(in); | 592 Spaces(in); |
581 Expressions exp2 = ConcatExpr(in); | 593 exp = exp.expr(); |
582 exp = new LtExpr( expr(exp), required(expr(exp2)) ); | 594 ExpString exp2 = required(ConcatExpr(in)).expr(); |
583 } else if( parser.match(">") ) { | 595 String code = "$Luan.lt($luan," + exp.code + "," + exp2.code + ")"; |
596 exp = new ExpString(code,true,false); | |
597 } else if( parser.match(">") ) { | |
584 Spaces(in); | 598 Spaces(in); |
585 Expressions exp2 = ConcatExpr(in); | 599 exp = exp.expr(); |
586 exp = new LtExpr( required(expr(exp2)), expr(exp) ); | 600 ExpString exp2 = required(ConcatExpr(in)).expr(); |
601 String code = "$Luan.lt($luan," + exp2.code + "," + exp.code + ")"; | |
602 exp = new ExpString(code,true,false); | |
587 } else | 603 } else |
588 break; | 604 break; |
589 } | 605 } |
590 return parser.success(exp); | 606 return parser.success(exp); |
591 } | 607 } |
592 | 608 |
593 private Expressions ConcatExpr(In in) throws ParseException { | 609 private ExpString ConcatExpr(In in) throws ParseException { |
594 parser.begin(); | 610 parser.begin(); |
595 Expressions exp = SumExpr(in); | 611 ExpString exp = SumExpr(in); |
596 if( exp==null ) | 612 if( exp==null ) |
597 return parser.failure(null); | 613 return parser.failure(null); |
598 if( parser.match("..") ) { | 614 if( parser.match("..") ) { |
599 Spaces(in); | 615 Spaces(in); |
600 Expressions exp2 = ConcatExpr(in); | 616 exp = exp.expr(); |
601 exp = new ConcatExpr( expr(exp), required(expr(exp2)) ); | 617 ExpString exp2 = required(ConcatExpr(in)).expr(); |
618 String code = "$Luan.concat($luan," + exp.code + "," + exp2.code + ")"; | |
619 exp = new ExpString(code,true,false); | |
602 } | 620 } |
603 return parser.success(exp); | 621 return parser.success(exp); |
604 } | 622 } |
605 | 623 |
606 private Expressions SumExpr(In in) throws ParseException { | 624 private ExpString SumExpr(In in) throws ParseException { |
607 parser.begin(); | 625 parser.begin(); |
608 Expressions exp = TermExpr(in); | 626 ExpString exp = TermExpr(in); |
609 if( exp==null ) | 627 if( exp==null ) |
610 return parser.failure(null); | 628 return parser.failure(null); |
611 while(true) { | 629 while(true) { |
612 if( parser.match('+') ) { | 630 if( parser.match('+') ) { |
613 Spaces(in); | 631 Spaces(in); |
614 Expressions exp2 = TermExpr(in); | 632 exp = exp.expr(); |
615 exp = new AddExpr( expr(exp), required(expr(exp2)) ); | 633 ExpString exp2 = required(TermExpr(in)).expr(); |
634 String code = "$Luan.add($luan," + exp.code + "," + exp2.code + ")"; | |
635 exp = new ExpString(code,true,false); | |
616 } else if( Minus() ) { | 636 } else if( Minus() ) { |
617 Spaces(in); | 637 Spaces(in); |
618 Expressions exp2 = TermExpr(in); | 638 exp = exp.expr(); |
619 exp = new SubExpr( expr(exp), required(expr(exp2)) ); | 639 ExpString exp2 = required(TermExpr(in)).expr(); |
640 String code = "$Luan.sub($luan," + exp.code + "," + exp2.code + ")"; | |
641 exp = new ExpString(code,true,false); | |
620 } else | 642 } else |
621 break; | 643 break; |
622 } | 644 } |
623 return parser.success(exp); | 645 return parser.success(exp); |
624 } | 646 } |
626 private boolean Minus() { | 648 private boolean Minus() { |
627 parser.begin(); | 649 parser.begin(); |
628 return parser.match('-') && !parser.match('-') ? parser.success() : parser.failure(); | 650 return parser.match('-') && !parser.match('-') ? parser.success() : parser.failure(); |
629 } | 651 } |
630 | 652 |
631 private Expressions TermExpr(In in) throws ParseException { | 653 private ExpString TermExpr(In in) throws ParseException { |
632 parser.begin(); | 654 parser.begin(); |
633 ExpString expStr = UnaryExpr(in); | 655 ExpString exp = UnaryExpr(in); |
634 if( expStr==null ) | 656 if( exp==null ) |
635 return parser.failure(null); | 657 return parser.failure(null); |
636 Expressions exp = expStr.toExpressions(); | |
637 while(true) { | 658 while(true) { |
638 if( parser.match('*') ) { | 659 if( parser.match('*') ) { |
639 Spaces(in); | 660 Spaces(in); |
640 Expressions exp2 = required(UnaryExpr(in)).toExpressions(); | 661 exp = exp.expr(); |
641 exp = new MulExpr( expr(exp), expr(exp2) ); | 662 ExpString exp2 = required(UnaryExpr(in)).expr(); |
663 String code = "$Luan.mul($luan," + exp.code + "," + exp2.code + ")"; | |
664 exp = new ExpString(code,true,false); | |
642 } else if( parser.match('/') ) { | 665 } else if( parser.match('/') ) { |
643 Spaces(in); | 666 Spaces(in); |
644 Expressions exp2 = required(UnaryExpr(in)).toExpressions(); | 667 exp = exp.expr(); |
645 exp = new DivExpr( expr(exp), expr(exp2) ); | 668 ExpString exp2 = required(UnaryExpr(in)).expr(); |
669 String code = "$Luan.div($luan," + exp.code + "," + exp2.code + ")"; | |
670 exp = new ExpString(code,true,false); | |
646 } else if( Mod() ) { | 671 } else if( Mod() ) { |
647 Spaces(in); | 672 Spaces(in); |
648 Expressions exp2 = required(UnaryExpr(in)).toExpressions(); | 673 exp = exp.expr(); |
649 exp = new ModExpr( expr(exp), expr(exp2) ); | 674 ExpString exp2 = required(UnaryExpr(in)).expr(); |
675 String code = "$Luan.mod($luan," + exp.code + "," + exp2.code + ")"; | |
676 exp = new ExpString(code,true,false); | |
650 } else | 677 } else |
651 break; | 678 break; |
652 } | 679 } |
653 return parser.success(exp); | 680 return parser.success(exp); |
654 } | 681 } |
679 ExpString exp = required(UnaryExpr(in)).expr(); | 706 ExpString exp = required(UnaryExpr(in)).expr(); |
680 String code = "$Luan.not(" + exp.code + ")"; | 707 String code = "$Luan.not(" + exp.code + ")"; |
681 exp = new ExpString(code,true,false); | 708 exp = new ExpString(code,true,false); |
682 return parser.success(exp); | 709 return parser.success(exp); |
683 } | 710 } |
684 Expressions exp = PowExpr(in); | 711 ExpString exp = PowExpr(in); |
685 if( exp==null ) | 712 if( exp==null ) |
686 return parser.failure(null); | 713 return parser.failure(null); |
687 return parser.success(new ExpString(exp)); | 714 return parser.success(exp); |
688 } | 715 } |
689 | 716 |
690 private Expressions PowExpr(In in) throws ParseException { | 717 private ExpString PowExpr(In in) throws ParseException { |
691 parser.begin(); | 718 parser.begin(); |
692 Expressions exp = SingleExpr(in); | 719 Expressions exp = SingleExpr(in); |
693 if( exp==null ) | 720 if( exp==null ) |
694 return parser.failure(null); | 721 return parser.failure(null); |
722 ExpString exp1 = new ExpString(exp); | |
695 if( parser.match('^') ) { | 723 if( parser.match('^') ) { |
696 Spaces(in); | 724 Spaces(in); |
697 Expressions exp2 = PowExpr(in); | 725 ExpString exp2 = required(PowExpr(in)); |
698 exp = new PowExpr( expr(exp), required(expr(exp2)) ); | 726 String code = "$Luan.pow($luan," + exp1.code + "," + exp2.code + ")"; |
699 } | 727 exp1 = new ExpString(code,true,false); |
700 return parser.success(exp); | 728 } |
729 return parser.success(exp1); | |
701 } | 730 } |
702 | 731 |
703 private Expressions SingleExpr(In in) throws ParseException { | 732 private Expressions SingleExpr(In in) throws ParseException { |
704 parser.begin(); | 733 parser.begin(); |
705 Expressions exp; | 734 Expressions exp; |
788 Expr exp = SubExpr(In.NOTHING); | 817 Expr exp = SubExpr(In.NOTHING); |
789 if( exp==null ) | 818 if( exp==null ) |
790 exp = NameExpr(In.NOTHING); | 819 exp = NameExpr(In.NOTHING); |
791 if( exp!=null && parser.match('=') ) { | 820 if( exp!=null && parser.match('=') ) { |
792 Spaces(In.NOTHING); | 821 Spaces(In.NOTHING); |
793 fields.add( new TableExpr.Field( exp, required(expr(ExprZ(In.NOTHING))) ) ); | 822 fields.add( new TableExpr.Field( exp, required(expr(exp(ExprZ(In.NOTHING)))) ) ); |
794 return parser.success(); | 823 return parser.success(); |
795 } | 824 } |
796 parser.rollback(); | 825 parser.rollback(); |
797 Expressions exprs = ExprZ(In.NOTHING); | 826 Expressions exprs = exp(ExprZ(In.NOTHING)); |
798 if( exprs != null ) { | 827 if( exprs != null ) { |
799 builder.add(exprs); | 828 builder.add(exprs); |
800 return parser.success(); | 829 return parser.success(); |
801 } | 830 } |
802 return parser.failure(); | 831 return parser.failure(); |
821 | 850 |
822 private Var VarStart(In in) throws ParseException { | 851 private Var VarStart(In in) throws ParseException { |
823 if( parser.match('(') ) { | 852 if( parser.match('(') ) { |
824 In inParens = in.parens(); | 853 In inParens = in.parens(); |
825 Spaces(inParens); | 854 Spaces(inParens); |
826 Expr exp = expr(RequiredExpr(inParens)); | 855 Expr exp = expr(exp(RequiredExpr(inParens))); |
827 RequiredMatch(')'); | 856 RequiredMatch(')'); |
828 Spaces(in); | 857 Spaces(in); |
829 return exprVar(exp); | 858 return exprVar(exp); |
830 } | 859 } |
831 String name = Name(in); | 860 String name = Name(in); |
981 Expressions exp = TemplateExpressions(in); | 1010 Expressions exp = TemplateExpressions(in); |
982 if( exp != null ) { | 1011 if( exp != null ) { |
983 builder.add(exp); | 1012 builder.add(exp); |
984 return parser.success(); | 1013 return parser.success(); |
985 } | 1014 } |
986 exp = ExprZ(in); | 1015 exp = exp(ExprZ(in)); |
987 if( exp==null ) | 1016 if( exp==null ) |
988 return parser.failure(); | 1017 return parser.failure(); |
989 builder.add(exp); | 1018 builder.add(exp); |
990 while( parser.match(',') ) { | 1019 while( parser.match(',') ) { |
991 Spaces(in); | 1020 Spaces(in); |
992 exp = TemplateExpressions(in); | 1021 exp = TemplateExpressions(in); |
993 if( exp != null ) { | 1022 if( exp != null ) { |
994 builder.add(exp); | 1023 builder.add(exp); |
995 return parser.success(); | 1024 return parser.success(); |
996 } | 1025 } |
997 builder.add( RequiredExpr(in) ); | 1026 builder.add( exp(RequiredExpr(in)) ); |
998 } | 1027 } |
999 return parser.success(); | 1028 return parser.success(); |
1000 } | 1029 } |
1001 | 1030 |
1002 private Expr SubExpr(In in) throws ParseException { | 1031 private Expr SubExpr(In in) throws ParseException { |
1003 parser.begin(); | 1032 parser.begin(); |
1004 if( !parser.match('[') || parser.test("[") || parser.test("=") ) | 1033 if( !parser.match('[') || parser.test("[") || parser.test("=") ) |
1005 return parser.failure(null); | 1034 return parser.failure(null); |
1006 Spaces(In.NOTHING); | 1035 Spaces(In.NOTHING); |
1007 Expr exp = expr(RequiredExpr(In.NOTHING)); | 1036 Expr exp = expr(exp(RequiredExpr(In.NOTHING))); |
1008 RequiredMatch(']'); | 1037 RequiredMatch(']'); |
1009 Spaces(in); | 1038 Spaces(in); |
1010 return parser.success(exp); | 1039 return parser.success(exp); |
1011 } | 1040 } |
1012 | 1041 |
1377 this.isExpr = isExpr; | 1406 this.isExpr = isExpr; |
1378 this.isStmt = isStmt; | 1407 this.isStmt = isStmt; |
1379 } | 1408 } |
1380 | 1409 |
1381 ExpString expr() { | 1410 ExpString expr() { |
1382 return isExpr ? this : new ExpString( "$Luan.first(" + code + ")", true, false ); | 1411 return isExpr ? this : new ExpString( "$Luan.first(" + code + ")", true, isStmt ); |
1383 } | 1412 } |
1384 | 1413 |
1385 Expressions toExpressions() { | 1414 Expressions toExpressions() { |
1386 String superClass = isStmt ? "StmtExp" : "Expressions"; | 1415 String superClass = isStmt ? "StmtExp" : "Expressions"; |
1387 String className = "EXP" + ++classCounter; | 1416 String className = "EXP" + ++classCounter; |
1389 +"package luan.impl;\n" | 1418 +"package luan.impl;\n" |
1390 +"import luan.LuanException;\n" | 1419 +"import luan.LuanException;\n" |
1391 +"\n" | 1420 +"\n" |
1392 +"public class " + className +" implements " + superClass + " {\n" | 1421 +"public class " + className +" implements " + superClass + " {\n" |
1393 +" @Override public Object eval(LuanStateImpl $luan) throws LuanException {\n" | 1422 +" @Override public Object eval(LuanStateImpl $luan) throws LuanException {\n" |
1423 +" Object $cnd;\n" | |
1394 +" return " + code + ";\n" | 1424 +" return " + code + ";\n" |
1395 +" }\n" | 1425 +" }\n" |
1396 +"}\n" | 1426 +"}\n" |
1397 ; | 1427 ; |
1398 //System.out.println(code); | 1428 //System.out.println(code); |
1407 throw new RuntimeException(e); | 1437 throw new RuntimeException(e); |
1408 } | 1438 } |
1409 } | 1439 } |
1410 } | 1440 } |
1411 | 1441 |
1442 private static Expressions exp(ExpString expStr) { | |
1443 return expStr==null ? null : expStr.toExpressions(); | |
1444 } | |
1445 | |
1412 } | 1446 } |