Mercurial Hosting > luan
comparison src/luan/interp/LuanParser.java @ 157:1de3e4a6e82d
remove LuanJavaFunction.RTN_NUMBER_ARRAY;
add request.java and response.java;
convert java Object[] members to List;
let LuanState.eval() take env;
improve web_run.luan;
rename LuanParser.JspExpressions to TemplateExpressions and add TemplateStmt;
git-svn-id: https://luan-java.googlecode.com/svn/trunk@158 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Wed, 18 Jun 2014 21:07:11 +0000 |
parents | db7b3902e01c |
children | cced1c4d3575 |
comparison
equal
deleted
inserted
replaced
156:925ba2d59b9d | 157:1de3e4a6e82d |
---|---|
74 | 74 |
75 private static class In { | 75 private static class In { |
76 static final In NOTHING = new In(false,false); | 76 static final In NOTHING = new In(false,false); |
77 | 77 |
78 final boolean parens; | 78 final boolean parens; |
79 final boolean jsp; | 79 final boolean template; |
80 | 80 |
81 private In(boolean parens,boolean jsp) { | 81 private In(boolean parens,boolean template) { |
82 this.parens = parens; | 82 this.parens = parens; |
83 this.jsp = jsp; | 83 this.template = template; |
84 } | 84 } |
85 | 85 |
86 In parens() { | 86 In parens() { |
87 return parens ? this : new In(true,jsp); | 87 return parens ? this : new In(true,template); |
88 } | 88 } |
89 | 89 |
90 In jsp() { | 90 In template() { |
91 return jsp ? this : new In(parens,true); | 91 return template ? this : new In(parens,true); |
92 } | 92 } |
93 } | 93 } |
94 | 94 |
95 private static final String _ENV = "_ENV"; | 95 private static final String _ENV = "_ENV"; |
96 private static final UpValue.Getter[] NO_UP_VALUE_GETTERS = new UpValue.Getter[0]; | 96 private static final UpValue.Getter[] NO_UP_VALUE_GETTERS = new UpValue.Getter[0]; |
223 if( parser.match( ';' ) ) | 223 if( parser.match( ';' ) ) |
224 return parser.success(); | 224 return parser.success(); |
225 if( parser.match( "--" ) ) { | 225 if( parser.match( "--" ) ) { |
226 while( parser.noneOf("\r\n") ); | 226 while( parser.noneOf("\r\n") ); |
227 } | 227 } |
228 return EndOfLine() ? parser.success() : parser.failure(); | 228 if( EndOfLine() ) |
229 return parser.success(); | |
230 parser.rollback(); | |
231 Stmt stmt = TemplateStmt(); | |
232 if( stmt != null ) { | |
233 stmts.add(stmt); | |
234 return parser.success(); | |
235 } | |
236 return parser.failure(); | |
229 } | 237 } |
230 | 238 |
231 private boolean EndOfLine() { | 239 private boolean EndOfLine() { |
232 return parser.match( "\r\n" ) || parser.match( '\r' ) || parser.match( '\n' ); | 240 return parser.match( "\r\n" ) || parser.match( '\r' ) || parser.match( '\n' ); |
233 } | 241 } |
253 ) { | 261 ) { |
254 stmts.add(stmt); | 262 stmts.add(stmt); |
255 } | 263 } |
256 } | 264 } |
257 | 265 |
258 private Expressions JspExpressions(In in) throws ParseException { | 266 private Stmt TemplateStmt() throws ParseException { |
259 if( in.jsp ) | 267 int start = parser.currentIndex(); |
268 Expressions exp = TemplateExpressions(In.NOTHING); | |
269 if( exp == null ) | |
260 return null; | 270 return null; |
271 Expr fnExp = (Expr)nameVar(start,"Io").expr(); | |
272 fnExp = new IndexExpr( se(start), fnExp, new ConstExpr("stdout") ); | |
273 fnExp = new IndexExpr( se(start), fnExp, new ConstExpr("write") ); | |
274 FnCall fnCall = new FnCall( se(start), fnExp, exp ); | |
275 return new FnCallStmt(fnCall); | |
276 } | |
277 | |
278 private Expressions TemplateExpressions(In in) throws ParseException { | |
279 if( in.template ) | |
280 return null; | |
261 int start = parser.begin(); | 281 int start = parser.begin(); |
262 if( !parser.match( "%>" ) ) | 282 if( !parser.match( "%>" ) ) |
263 return parser.failure(null); | 283 return parser.failure(null); |
264 EndOfLine(); | 284 EndOfLine(); |
265 In inJsp = in.jsp(); | 285 In inTemplate = in.template(); |
266 List<Expressions> builder = new ArrayList<Expressions>(); | 286 List<Expressions> builder = new ArrayList<Expressions>(); |
267 while(true) { | 287 while(true) { |
268 if( parser.match( "<%=" ) ) { | 288 if( parser.match( "<%=" ) ) { |
269 Spaces(inJsp); | 289 Spaces(inTemplate); |
270 builder.add( RequiredExpr(inJsp) ); | 290 builder.add( RequiredExpr(inTemplate) ); |
271 RequiredMatch( "%>" ); | 291 RequiredMatch( "%>" ); |
272 } else if( parser.match( "<%" ) ) { | 292 } else if( parser.match( "<%" ) ) { |
273 Spaces(inJsp); | 293 Spaces(inTemplate); |
274 return parser.success(ExpList.build(builder)); | 294 return parser.success(ExpList.build(builder)); |
275 } else { | 295 } else { |
276 int i = parser.currentIndex(); | 296 int i = parser.currentIndex(); |
277 do { | 297 do { |
278 if( parser.match( "%>" ) ) | 298 if( parser.match( "%>" ) ) |
279 throw parser.exception("'%>' unexpected"); | 299 throw parser.exception("'%>' unexpected"); |
280 if( !parser.anyChar() ) | 300 if( !parser.anyChar() ) |
281 throw parser.exception("Unclosed JSP expressions"); | 301 throw parser.exception("Unclosed template expression"); |
282 } while( !parser.test( "<%" ) ); | 302 } while( !parser.test( "<%" ) ); |
283 String match = parser.textFrom(i); | 303 String match = parser.textFrom(i); |
284 builder.add( new ConstExpr(match) ); | 304 builder.add( new ConstExpr(match) ); |
285 } | 305 } |
286 } | 306 } |
334 String varName = modName.substring(modName.lastIndexOf('.')+1); | 354 String varName = modName.substring(modName.lastIndexOf('.')+1); |
335 LuanSource.Element se = se(start); | 355 LuanSource.Element se = se(start); |
336 FnCall require = new FnCall( se, importExpr, new ConstExpr(modName) ); | 356 FnCall require = new FnCall( se, importExpr, new ConstExpr(modName) ); |
337 Settable settable; | 357 Settable settable; |
338 if( interactive ) { | 358 if( interactive ) { |
339 settable = new SetTableEntry( se(start), env(), new ConstExpr(varName) ); | 359 settable = nameVar(se,varName).settable(); |
340 } else { | 360 } else { |
341 addSymbol( varName ); | 361 addSymbol( varName ); |
342 settable = new SetLocalVar(symbolsSize()-1); | 362 settable = new SetLocalVar(symbolsSize()-1); |
343 } | 363 } |
344 return parser.success( new SetStmt( settable, expr(require) ) ); | 364 return parser.success( new SetStmt( settable, expr(require) ) ); |
547 | 567 |
548 private Expressions Expr(In in) throws ParseException { | 568 private Expressions Expr(In in) throws ParseException { |
549 parser.begin(); | 569 parser.begin(); |
550 Expressions exp; | 570 Expressions exp; |
551 return (exp = VarArgs(in)) != null | 571 return (exp = VarArgs(in)) != null |
552 || (exp = JspExpressions(in)) != null | 572 || (exp = TemplateExpressions(in)) != null |
553 || (exp = OrExpr(in)) != null | 573 || (exp = OrExpr(in)) != null |
554 ? parser.success(exp) | 574 ? parser.success(exp) |
555 : parser.failure((Expressions)null) | 575 : parser.failure((Expressions)null) |
556 ; | 576 ; |
557 } | 577 } |
892 public Expressions expr(); | 912 public Expressions expr(); |
893 public Settable settable(); | 913 public Settable settable(); |
894 } | 914 } |
895 | 915 |
896 private Var nameVar(final int start,final String name) { | 916 private Var nameVar(final int start,final String name) { |
917 return nameVar(se(start),name); | |
918 } | |
919 | |
920 private Var nameVar(final LuanSource.Element se,final String name) { | |
897 return new Var() { | 921 return new Var() { |
898 | 922 |
899 public Expr expr() { | 923 public Expr expr() { |
900 int index = stackIndex(name); | 924 int index = stackIndex(name); |
901 if( index != -1 ) | 925 if( index != -1 ) |
902 return new GetLocalVar(se(start),index); | 926 return new GetLocalVar(se,index); |
903 index = upValueIndex(name); | 927 index = upValueIndex(name); |
904 if( index != -1 ) | 928 if( index != -1 ) |
905 return new GetUpVar(se(start),index); | 929 return new GetUpVar(se,index); |
906 return new IndexExpr( se(start), env(), new ConstExpr(name) ); | 930 return new IndexExpr( se, env(), new ConstExpr(name) ); |
907 } | 931 } |
908 | 932 |
909 public Settable settable() { | 933 public Settable settable() { |
910 int index = stackIndex(name); | 934 int index = stackIndex(name); |
911 if( index != -1 ) | 935 if( index != -1 ) |
912 return new SetLocalVar(index); | 936 return new SetLocalVar(index); |
913 index = upValueIndex(name); | 937 index = upValueIndex(name); |
914 if( index != -1 ) | 938 if( index != -1 ) |
915 return new SetUpVar(index); | 939 return new SetUpVar(index); |
916 return new SetTableEntry( se(start), env(), new ConstExpr(name) ); | 940 return new SetTableEntry( se, env(), new ConstExpr(name) ); |
917 } | 941 } |
918 }; | 942 }; |
919 } | 943 } |
920 | 944 |
921 private Var exprVar(final Expressions expr) { | 945 private Var exprVar(final Expressions expr) { |
969 String s = StringLiteral(in); | 993 String s = StringLiteral(in); |
970 if( s != null ) { | 994 if( s != null ) { |
971 builder.add( new ConstExpr(s) ); | 995 builder.add( new ConstExpr(s) ); |
972 return true; | 996 return true; |
973 } | 997 } |
974 Expressions exps = JspExpressions(in); | 998 Expressions exps = TemplateExpressions(in); |
975 if( exps != null ) { | 999 if( exps != null ) { |
976 builder.add(exps); | 1000 builder.add(exps); |
977 return true; | 1001 return true; |
978 } | 1002 } |
979 return false; | 1003 return false; |