changeset 54:f5b27ef14d73

add OutputStmt git-svn-id: https://luan-java.googlecode.com/svn/trunk@55 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Mon, 31 Dec 2012 19:45:06 +0000
parents 54a61d1dc070
children 9381b23ea9e1
files src/luan/interp/LuanParser.java src/luan/interp/OutputStmt.java
diffstat 2 files changed, 56 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
diff -r 54a61d1dc070 -r f5b27ef14d73 src/luan/interp/LuanParser.java
--- a/src/luan/interp/LuanParser.java	Mon Dec 31 07:38:09 2012 +0000
+++ b/src/luan/interp/LuanParser.java	Mon Dec 31 19:45:06 2012 +0000
@@ -221,6 +221,7 @@
 			LocalStmt(stmts),
 			Sequence(
 				FirstOf(
+					OutputStmt(),
 					ReturnStmt(),
 					FunctionStmt(),
 					LocalFunctionStmt(),
@@ -240,6 +241,34 @@
 		);
 	}
 
+	Rule OutputStmt() {
+		Var<Integer> start = new Var<Integer>();
+		Var<ExpList.Builder> builder = new Var<ExpList.Builder>(new ExpList.Builder());
+		return Sequence(
+			start.set(currentIndex()),
+			"%>", Optional( EndOfLine() ),
+			ZeroOrMore(
+				FirstOf(
+					Sequence(
+						OneOrMore(
+							TestNot("<%"),
+							ANY
+						),
+						addToExpList(builder.get(),new ConstExpr(match()))
+					),
+					Sequence(
+						"<%=", Spaces(),
+						Expr(),
+						addToExpList(builder.get()),
+						"%>"
+					)
+				)
+			),
+			"<%", Spaces(),
+			push( new OutputStmt( se(start.get()), builder.get().build() ) )
+		);
+	}
+
 	Rule ReturnStmt() {
 		Var<Integer> start = new Var<Integer>();
 		return Sequence(
@@ -796,6 +825,11 @@
 		return true;
 	}
 
+	boolean addToExpList(ExpList.Builder bld, Expr expr) {
+		bld.add(expr);
+		return true;
+	}
+
 	Rule SubExpr() {
 		return Sequence( '[', incParens(), Spaces(), Expr(), ']', decParens(), Spaces() );
 	}
diff -r 54a61d1dc070 -r f5b27ef14d73 src/luan/interp/OutputStmt.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/interp/OutputStmt.java	Mon Dec 31 19:45:06 2012 +0000
@@ -0,0 +1,22 @@
+package luan.interp;
+
+import luan.Luan;
+import luan.LuanSource;
+import luan.LuanException;
+
+
+final class OutputStmt extends CodeImpl implements Stmt {
+	private final Expressions expressions;
+
+	OutputStmt(LuanSource.Element se,Expressions expressions) {
+		super(se);
+		this.expressions = expressions;
+	}
+
+	@Override public void eval(LuanStateImpl luan) throws LuanException {
+		for( Object obj : expressions.eval(luan) ) {
+			luan.out.print( luan.toString(se,obj) );
+		}
+	}
+
+}