Mercurial Hosting > luan
comparison src/luan/interp/LuanParser.java @ 155:db7b3902e01c
fix parsing problems
git-svn-id: https://luan-java.googlecode.com/svn/trunk@156 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Wed, 18 Jun 2014 07:38:46 +0000 |
parents | c2e5101682ae |
children | 1de3e4a6e82d |
comparison
equal
deleted
inserted
replaced
154:c2e5101682ae | 155:db7b3902e01c |
---|---|
523 return parser.success( new SetStmt( vars.toArray(new Settable[0]), values ) ); | 523 return parser.success( new SetStmt( vars.toArray(new Settable[0]), values ) ); |
524 } | 524 } |
525 | 525 |
526 private Stmt FnCallStmt() throws ParseException { | 526 private Stmt FnCallStmt() throws ParseException { |
527 parser.begin(); | 527 parser.begin(); |
528 Code code = VarExp(In.NOTHING); | 528 Expressions exp = VarExp(In.NOTHING); |
529 if( !(code instanceof FnCall) ) | 529 if( !(exp instanceof FnCall) ) |
530 return parser.failure(null); | 530 return parser.failure(null); |
531 FnCall fnCall = (FnCall)code; | 531 FnCall fnCall = (FnCall)exp; |
532 return parser.success( new FnCallStmt(fnCall) ); | 532 return parser.success( new FnCallStmt(fnCall) ); |
533 } | 533 } |
534 | 534 |
535 private Settable SettableVar() throws ParseException { | 535 private Settable SettableVar() throws ParseException { |
536 int start = parser.begin(); | 536 int start = parser.begin(); |
537 Var var = VarZ(In.NOTHING); | 537 Var var = VarZ(In.NOTHING); |
538 if( var==null ) | 538 if( var==null ) |
539 return null; | 539 return parser.failure(null); |
540 return var.settable(); | 540 return parser.success( var.settable() ); |
541 } | 541 } |
542 | 542 |
543 private Expressions RequiredExpr(In in) throws ParseException { | 543 private Expressions RequiredExpr(In in) throws ParseException { |
544 parser.begin(); | 544 parser.begin(); |
545 return parser.success(required(Expr(in),"Bad expression")); | 545 return parser.success(required(Expr(in),"Bad expression")); |
818 } | 818 } |
819 return parser.success(var); | 819 return parser.success(var); |
820 } | 820 } |
821 | 821 |
822 private Var Var2(In in,int start,Expressions exp1) throws ParseException { | 822 private Var Var2(In in,int start,Expressions exp1) throws ParseException { |
823 parser.begin(); | |
823 Var var = VarExt(in,start,exp1); | 824 Var var = VarExt(in,start,exp1); |
824 if( var != null ) | 825 if( var != null ) |
825 return var; | 826 return parser.success(var); |
826 if( parser.match("->") ) { | 827 if( parser.match("->") ) { |
827 Spaces(in); | 828 Spaces(in); |
828 List<Expressions> builder = new ArrayList<Expressions>(); | 829 List<Expressions> builder = new ArrayList<Expressions>(); |
829 builder.add(exp1); | 830 builder.add(exp1); |
830 Expr exp2 = expr(RequiredVarExpB(in)); | 831 Expr exp2 = expr(RequiredVarExpB(in)); |
831 FnCall fnCall = required(Args( in, start, exp2, builder )); | 832 FnCall fnCall = required(Args( in, start, exp2, builder )); |
832 return exprVar(fnCall); | 833 return parser.success(exprVar(fnCall)); |
833 } | 834 } |
834 FnCall fnCall = Args( in, start, expr(exp1), new ArrayList<Expressions>() ); | 835 FnCall fnCall = Args( in, start, expr(exp1), new ArrayList<Expressions>() ); |
835 if( fnCall != null ) | 836 if( fnCall != null ) |
836 return exprVar(fnCall); | 837 return parser.success(exprVar(fnCall)); |
837 return null; | 838 return parser.failure(null); |
838 } | 839 } |
839 | 840 |
840 private Expressions RequiredVarExpB(In in) throws ParseException { | 841 private Expressions RequiredVarExpB(In in) throws ParseException { |
841 int start = parser.begin(); | 842 int start = parser.begin(); |
842 Var var = required(VarStart(in)); | 843 Var var = required(VarStart(in)); |
1257 | 1258 |
1258 private Character EscSeq() { | 1259 private Character EscSeq() { |
1259 parser.begin(); | 1260 parser.begin(); |
1260 if( !parser.match('\\') ) | 1261 if( !parser.match('\\') ) |
1261 return parser.failure(null); | 1262 return parser.failure(null); |
1262 if( parser.match('a') ) return '\u0007'; | 1263 if( parser.match('a') ) return parser.success('\u0007'); |
1263 if( parser.match('b') ) return '\b'; | 1264 if( parser.match('b') ) return parser.success('\b'); |
1264 if( parser.match('f') ) return '\f'; | 1265 if( parser.match('f') ) return parser.success('\f'); |
1265 if( parser.match('n') ) return '\n'; | 1266 if( parser.match('n') ) return parser.success('\n'); |
1266 if( parser.match('r') ) return '\r'; | 1267 if( parser.match('r') ) return parser.success('\r'); |
1267 if( parser.match('t') ) return '\t'; | 1268 if( parser.match('t') ) return parser.success('\t'); |
1268 if( parser.match('v') ) return '\u000b'; | 1269 if( parser.match('v') ) return parser.success('\u000b'); |
1269 if( parser.match('\\') ) return '\\'; | 1270 if( parser.match('\\') ) return parser.success('\\'); |
1270 if( parser.match('"') ) return '"'; | 1271 if( parser.match('"') ) return parser.success('"'); |
1271 if( parser.match('\'') ) return '\''; | 1272 if( parser.match('\'') ) return parser.success('\''); |
1272 int start = parser.currentIndex(); | 1273 int start = parser.currentIndex(); |
1273 if( parser.match('x') && HexDigit() && HexDigit() ) | 1274 if( parser.match('x') && HexDigit() && HexDigit() ) |
1274 return (char)Integer.parseInt(parser.textFrom(start+1),16); | 1275 return parser.success((char)Integer.parseInt(parser.textFrom(start+1),16)); |
1275 if( Digit() ) { | 1276 if( Digit() ) { |
1276 if( Digit() ) Digit(); // optional | 1277 if( Digit() ) Digit(); // optional |
1277 return (char)Integer.parseInt(parser.textFrom(start)); | 1278 return parser.success((char)Integer.parseInt(parser.textFrom(start))); |
1278 } | 1279 } |
1279 return parser.failure(null); | 1280 return parser.failure(null); |
1280 } | 1281 } |
1281 | 1282 |
1282 private void Spaces(In in) throws ParseException { | 1283 private void Spaces(In in) throws ParseException { |