Mercurial Hosting > luan
comparison core/src/luan/impl/LuanParser.java @ 211:284eddd599b1
fix parsing bug
git-svn-id: https://luan-java.googlecode.com/svn/trunk@212 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Tue, 08 Jul 2014 19:31:05 +0000 |
parents | 239c8d650028 |
children | 2ed8465a9d62 |
comparison
equal
deleted
inserted
replaced
210:e84655b4c45e | 211:284eddd599b1 |
---|---|
186 } | 186 } |
187 | 187 |
188 FnDef Expression() throws ParseException { | 188 FnDef Expression() throws ParseException { |
189 Spaces(In.NOTHING); | 189 Spaces(In.NOTHING); |
190 int start = parser.begin(); | 190 int start = parser.begin(); |
191 Expressions expr = Expr(In.NOTHING); | 191 Expressions expr = ExprZ(In.NOTHING); |
192 if( expr != null && parser.endOfInput() ) { | 192 if( expr != null && parser.endOfInput() ) { |
193 Stmt stmt = new ReturnStmt( se(start), expr ); | 193 Stmt stmt = new ReturnStmt( se(start), expr ); |
194 return parser.success(newFnDef(start,stmt)); | 194 return parser.success(newFnDef(start,stmt)); |
195 } | 195 } |
196 return parser.failure(null); | 196 return parser.failure(null); |
567 return parser.success( new SetStmt( vars.toArray(new Settable[0]), values ) ); | 567 return parser.success( new SetStmt( vars.toArray(new Settable[0]), values ) ); |
568 } | 568 } |
569 | 569 |
570 private Stmt ExpressionsStmt() throws ParseException { | 570 private Stmt ExpressionsStmt() throws ParseException { |
571 parser.begin(); | 571 parser.begin(); |
572 Expressions exp = Expr(In.NOTHING); | 572 Expressions exp = ExprZ(In.NOTHING); |
573 if( exp instanceof FnCall || exp instanceof AndExpr || exp instanceof OrExpr ) | 573 if( exp instanceof FnCall || exp instanceof AndExpr || exp instanceof OrExpr ) |
574 return parser.success( new ExpressionsStmt(exp) ); | 574 return parser.success( new ExpressionsStmt(exp) ); |
575 return parser.failure(null); | 575 return parser.failure(null); |
576 } | 576 } |
577 | 577 |
583 return parser.success( var.settable() ); | 583 return parser.success( var.settable() ); |
584 } | 584 } |
585 | 585 |
586 private Expressions RequiredExpr(In in) throws ParseException { | 586 private Expressions RequiredExpr(In in) throws ParseException { |
587 parser.begin(); | 587 parser.begin(); |
588 return parser.success(required(Expr(in),"Bad expression")); | 588 return parser.success(required(ExprZ(in),"Bad expression")); |
589 } | 589 } |
590 | 590 |
591 private Expressions Expr(In in) throws ParseException { | 591 private Expressions ExprZ(In in) throws ParseException { |
592 parser.begin(); | 592 parser.begin(); |
593 Expressions exp; | 593 Expressions exp; |
594 return (exp = VarArgs(in)) != null | 594 return (exp = VarArgs(in)) != null |
595 || (exp = OrExpr(in)) != null | 595 || (exp = OrExpr(in)) != null |
596 ? parser.success(exp) | 596 ? parser.success(exp) |
831 return parser.failure(null); | 831 return parser.failure(null); |
832 In inParens = in.parens(); | 832 In inParens = in.parens(); |
833 Spaces(inParens); | 833 Spaces(inParens); |
834 List<TableExpr.Field> fields = new ArrayList<TableExpr.Field>(); | 834 List<TableExpr.Field> fields = new ArrayList<TableExpr.Field>(); |
835 List<Expressions> builder = new ArrayList<Expressions>(); | 835 List<Expressions> builder = new ArrayList<Expressions>(); |
836 while( Field(fields,builder,in) && FieldSep(inParens) ); | 836 while( Field(fields,builder,inParens) && FieldSep(inParens) ); |
837 if( !parser.match('}') ) | 837 if( !parser.match('}') ) |
838 throw parser.exception("Expected table element or '}'"); | 838 throw parser.exception("Expected table element or '}'"); |
839 Spaces(in); | 839 Spaces(in); |
840 return parser.success( new TableExpr( se(start), fields.toArray(new TableExpr.Field[0]), ExpList.build(builder) ) ); | 840 return parser.success( new TableExpr( se(start), fields.toArray(new TableExpr.Field[0]), ExpList.build(builder) ) ); |
841 } | 841 } |
852 Expr exp = SubExpr(in); | 852 Expr exp = SubExpr(in); |
853 if( exp==null ) | 853 if( exp==null ) |
854 exp = NameExpr(in); | 854 exp = NameExpr(in); |
855 if( exp!=null && parser.match('=') ) { | 855 if( exp!=null && parser.match('=') ) { |
856 Spaces(in); | 856 Spaces(in); |
857 fields.add( new TableExpr.Field( exp, required(expr(Expr(in))) ) ); | 857 fields.add( new TableExpr.Field( exp, required(expr(ExprZ(in))) ) ); |
858 return parser.success(); | 858 return parser.success(); |
859 } | 859 } |
860 parser.rollback(); | 860 parser.rollback(); |
861 Expressions exprs = Expr(in); | 861 Expressions exprs = ExprZ(in); |
862 if( exprs != null ) { | 862 if( exprs != null ) { |
863 builder.add(exprs); | 863 builder.add(exprs); |
864 return parser.success(); | 864 return parser.success(); |
865 } | 865 } |
866 return parser.failure(); | 866 return parser.failure(); |
1040 Expressions exp = TemplateExpressions(in); | 1040 Expressions exp = TemplateExpressions(in); |
1041 if( exp != null ) { | 1041 if( exp != null ) { |
1042 builder.add(exp); | 1042 builder.add(exp); |
1043 return parser.success(); | 1043 return parser.success(); |
1044 } | 1044 } |
1045 exp = Expr(in); | 1045 exp = ExprZ(in); |
1046 if( exp==null ) | 1046 if( exp==null ) |
1047 return parser.failure(); | 1047 return parser.failure(); |
1048 builder.add(exp); | 1048 builder.add(exp); |
1049 while( parser.match(',') ) { | 1049 while( parser.match(',') ) { |
1050 Spaces(in); | 1050 Spaces(in); |