diff 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
line wrap: on
line diff
--- a/src/luan/interp/LuanParser.java	Wed Jun 18 08:16:50 2014 +0000
+++ b/src/luan/interp/LuanParser.java	Wed Jun 18 21:07:11 2014 +0000
@@ -76,19 +76,19 @@
 		static final In NOTHING = new In(false,false);
 
 		final boolean parens;
-		final boolean jsp;
+		final boolean template;
 
-		private In(boolean parens,boolean jsp) {
+		private In(boolean parens,boolean template) {
 			this.parens = parens;
-			this.jsp = jsp;
+			this.template = template;
 		}
 
 		In parens() {
-			return parens ? this : new In(true,jsp);
+			return parens ? this : new In(true,template);
 		}
 
-		In jsp() {
-			return jsp ? this : new In(parens,true);
+		In template() {
+			return template ? this : new In(parens,true);
 		}
 	}
 
@@ -225,7 +225,15 @@
 		if( parser.match( "--" ) ) {
 			while( parser.noneOf("\r\n") );
 		}
-		return EndOfLine() ? parser.success() : parser.failure();
+		if( EndOfLine() )
+			return parser.success();
+		parser.rollback();
+		Stmt stmt = TemplateStmt();
+		if( stmt != null ) {
+			stmts.add(stmt);
+			return parser.success();
+		}
+		return parser.failure();
 	}
 
 	private boolean EndOfLine() {
@@ -255,22 +263,34 @@
 		}
 	}
 
-	private Expressions JspExpressions(In in) throws ParseException {
-		if( in.jsp )
+	private Stmt TemplateStmt() throws ParseException {
+		int start = parser.currentIndex();
+		Expressions exp = TemplateExpressions(In.NOTHING);
+		if( exp == null )
+			return null;
+		Expr fnExp = (Expr)nameVar(start,"Io").expr();
+		fnExp = new IndexExpr( se(start), fnExp, new ConstExpr("stdout") );
+		fnExp = new IndexExpr( se(start), fnExp, new ConstExpr("write") );
+		FnCall fnCall = new FnCall( se(start), fnExp, exp );
+		return new FnCallStmt(fnCall);
+	}
+
+	private Expressions TemplateExpressions(In in) throws ParseException {
+		if( in.template )
 			return null;
 		int start = parser.begin();
 		if( !parser.match( "%>" ) )
 			return parser.failure(null);
 		EndOfLine();
-		In inJsp = in.jsp();
+		In inTemplate = in.template();
 		List<Expressions> builder = new ArrayList<Expressions>();
 		while(true) {
 			if( parser.match( "<%=" ) ) {
-				Spaces(inJsp);
-				builder.add( RequiredExpr(inJsp) );
+				Spaces(inTemplate);
+				builder.add( RequiredExpr(inTemplate) );
 				RequiredMatch( "%>" );
 			} else if( parser.match( "<%" ) ) {
-				Spaces(inJsp);
+				Spaces(inTemplate);
 				return parser.success(ExpList.build(builder));
 			} else {
 				int i = parser.currentIndex();
@@ -278,7 +298,7 @@
 					if( parser.match( "%>" ) )
 						throw parser.exception("'%>' unexpected");
 					if( !parser.anyChar() )
-						throw parser.exception("Unclosed JSP expressions");
+						throw parser.exception("Unclosed template expression");
 				} while( !parser.test( "<%" ) );
 				String match = parser.textFrom(i);
 				builder.add( new ConstExpr(match) );
@@ -336,7 +356,7 @@
 		FnCall require = new FnCall( se, importExpr, new ConstExpr(modName) );
 		Settable settable;
 		if( interactive ) {
-			settable = new SetTableEntry( se(start), env(), new ConstExpr(varName) );
+			settable = nameVar(se,varName).settable();
 		} else {
 			addSymbol( varName );
 			settable = new SetLocalVar(symbolsSize()-1);
@@ -549,7 +569,7 @@
 		parser.begin();
 		Expressions exp;
 		return (exp = VarArgs(in)) != null
-			|| (exp = JspExpressions(in)) != null
+			|| (exp = TemplateExpressions(in)) != null
 			|| (exp = OrExpr(in)) != null
 			? parser.success(exp)
 			: parser.failure((Expressions)null)
@@ -894,16 +914,20 @@
 	}
 
 	private Var nameVar(final int start,final String name) {
+		return nameVar(se(start),name);
+	}
+
+	private Var nameVar(final LuanSource.Element se,final String name) {
 		return new Var() {
 
 			public Expr expr() {
 				int index = stackIndex(name);
 				if( index != -1 )
-					return new GetLocalVar(se(start),index);
+					return new GetLocalVar(se,index);
 				index = upValueIndex(name);
 				if( index != -1 )
-					return new GetUpVar(se(start),index);
-				return new IndexExpr( se(start), env(), new ConstExpr(name) );
+					return new GetUpVar(se,index);
+				return new IndexExpr( se, env(), new ConstExpr(name) );
 			}
 
 			public Settable settable() {
@@ -913,7 +937,7 @@
 				index = upValueIndex(name);
 				if( index != -1 )
 					return new SetUpVar(index);
-				return new SetTableEntry( se(start), env(), new ConstExpr(name) );
+				return new SetTableEntry( se, env(), new ConstExpr(name) );
 			}
 		};
 	}
@@ -971,7 +995,7 @@
 			builder.add( new ConstExpr(s) );
 			return true;
 		}
-		Expressions exps = JspExpressions(in);
+		Expressions exps = TemplateExpressions(in);
 		if( exps != null ) {
 			builder.add(exps);
 			return true;