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 }