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;