diff src/luan/impl/LuanParser.java @ 1796:383703b581bc

add backtick
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 31 Jan 2024 19:13:05 -0700
parents 842a0e0fd8c5
children d1dd61e6dd84
line wrap: on
line diff
--- a/src/luan/impl/LuanParser.java	Tue Jan 02 21:49:54 2024 -0700
+++ b/src/luan/impl/LuanParser.java	Wed Jan 31 19:13:05 2024 -0700
@@ -803,6 +803,8 @@
 	}
 
 	private Stmts ExpressionsStmt() throws ParseException {
+		if( parser.test('`') )
+			return null;
 		parser.begin();
 		Expr exp = Expression();
 		if( exp != null && exp.isStmt ) {
@@ -1111,6 +1113,9 @@
 		Expr exp = FunctionExpr();
 		if( exp != null )
 			return parser.success(exp);
+		exp = BacktickExpr();
+		if( exp != null )
+			return parser.success(exp);
 		exp = VarExp();
 		if( exp != null )
 			return parser.success(exp);
@@ -1120,6 +1125,33 @@
 		return parser.failure(null);
 	}
 
+	private Expr BacktickExpr() throws ParseException {
+		if( !parser.match('`') )
+			return null;
+		Spaces();
+		frame = new Frame(frame);
+		Stmts stmt = new Stmts();
+		stmt.add( "LuanTable Io = (LuanTable)luan.require(\"luan:Io.luan\");  " );
+		stmt.add( "Object stdout = Io.get(luan,\"stdout\");  " );
+		stmt.add( "LuanStringWriter lsw = new LuanStringWriter();  " );
+		stmt.add( "Io.put(luan,\"stdout\",lsw);  " );
+		stmt.add( "try {  " );
+		Stmts block = RequiredBlock();
+		stmt.addAll( block );
+		RequiredMatch('`');
+		stmt.add( "} finally {  " );
+		stmt.add( "Io.put(luan,\"stdout\",stdout);  " );
+		stmt.add( "}  " );
+		stmt.add( "return lsw.out().toString();  " );
+		stmt.hasReturn = true;
+		Expr fnDef = newFnExp(stmt,null);
+		Expr exp = new Expr(Val.SINGLE,true);
+		exp.addAll( fnDef );
+		exp.add( ".call(luan)" );
+		frame = frame.parent;
+		return exp;
+	}
+
 	private Expr FunctionExpr() throws ParseException {
 		if( !Keyword("function") )
 			return null;
@@ -1170,7 +1202,6 @@
 		stmt.addAll( block );
 		stmt.hasReturn = block.hasReturn;
 		Expr fnDef = newFnExp(stmt,name);
-//		RequiredEnd("end_function");
 		if( !Keyword("end") && !Keyword("end_function") ) {
 			if( stmt.hasReturn && !parser.endOfInput() ) {
 				throw parser.exception("unreachable statement");
@@ -1455,7 +1486,7 @@
 
 	private Expr SubExpr() throws ParseException {
 		parser.begin();
-		if( !parser.match('[') || parser.test("[") || parser.test("=") )
+		if( !parser.match('[') || parser.test('[') || parser.test('=') )
 			return parser.failure(null);
 		Spaces();
 		Expr exp = RequiredExpr().single();
@@ -2022,9 +2053,10 @@
 		StringBuilder sb = new StringBuilder();
 		sb.append( ""
 			+"package luan.impl;  "
+			+"import luan.Luan;  "
 			+"import luan.LuanClosure;  "
-			+"import luan.Luan;  "
 			+"import luan.LuanFunction;  "
+			+"import luan.LuanTable;  "
 			+"import luan.LuanException;  "
 			+"import luan.modules.PackageLuan;  "