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 {