changeset 593:92c9fa5e39e6

remove theme "Get" and "Set", and add "define"
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 31 Aug 2015 10:16:57 -0600
parents 1c64b1fd882b
children e91e476186c7
files core/src/luan/impl/ThemeParser.java
diffstat 1 files changed, 31 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
diff -r 1c64b1fd882b -r 92c9fa5e39e6 core/src/luan/impl/ThemeParser.java
--- a/core/src/luan/impl/ThemeParser.java	Mon Aug 31 08:03:58 2015 -0600
+++ b/core/src/luan/impl/ThemeParser.java	Mon Aug 31 10:16:57 2015 -0600
@@ -178,43 +178,27 @@
 
 	private Stmt parseDef() throws ParseException {
 		int start = parser.begin();
+		if( !parser.match("{define:") )
+			return parser.failure(null);
 		Tag tag = parseBlockTag();
 		if( tag == null )
 			return parser.failure(null);
 		parser.match('\r');  parser.match('\n');  // ignore newline
-		Stmt rtn = null;
-		if( tag.name.equals("Set") ) {
-			String name = tag.attrs.remove("name");
-			if( name == null )
-				throw exception("block:Set missing required attribute 'name'");
-			if( !tag.attrs.isEmpty() )
-				throw exception("block:Set has unrecognized attributes: "+tag.attrs);
-			if( !validateName(name) )
-				throw exception("invalid Set name: "+name);
-			addSymbol( name );
-			frame = new Frame(frame);
-			addSymbol(ENV);
-			Stmt block = parseBody(tag);
-			FnDef fnDef = newFnDef(start,block);
-			frame = frame.parent;
-			rtn = new SetStmt( new SetLocalVar(symbolsSize()-1), fnDef );
-		} else {
-			if( !tag.attrs.isEmpty() )
-				throw exception("this block should have no attributes");
-			Expr table = new GetLocalVar(null,stackIndex(MOD));
-			Settable fnName = new SetTableEntry(se(start),table,new ConstExpr(null,tag.name));
-			frame = new Frame(frame);
-			addSymbol(ENV);
-			Stmt block = parseBody(tag);
-			FnDef fnDef = newFnDef(start,block);
-			frame = frame.parent;
-			rtn = new SetStmt(fnName,fnDef);
-		}
+		if( !tag.attrs.isEmpty() )
+			throw exception("this block should have no attributes");
+		Expr table = new GetLocalVar(null,stackIndex(MOD));
+		Settable fnName = new SetTableEntry(se(start),table,new ConstExpr(null,tag.name));
+		frame = new Frame(frame);
+		addSymbol(ENV);
+		Stmt block = parseBody("define",tag);
+		FnDef fnDef = newFnDef(start,block);
+		frame = frame.parent;
+		Stmt rtn = new SetStmt(fnName,fnDef);
 		return parser.success(rtn);
 	}
 
-	private Stmt parseBody(Tag tag) throws ParseException {
-		String endTag = "{/block:" + tag.name + "}";
+	private Stmt parseBody(String type,Tag tag) throws ParseException {
+		String endTag = "{/"+type+":" + tag.name + "}";
 		List<Stmt> stmts = new ArrayList<Stmt>();
 		int stackStart = symbolsSize();
 		StringBuilder sb = new StringBuilder();
@@ -257,6 +241,8 @@
 
 	private Stmt parseBlock() throws ParseException {
 		int start = parser.begin();
+		if( !parser.match("{block:") )
+			return parser.failure(null);
 		Tag tag = parseBlockTag();
 		if( tag == null )
 			return parser.failure(null);
@@ -264,15 +250,15 @@
 			throw exception("block:Set not allowed here");
 		frame = new Frame(frame);
 		addSymbol(ENV);
-		Stmt block = parseBody(tag);
+		Stmt block = parseBody("block",tag);
 		FnDef fnDef = newFnDef(start,block);
 		frame = frame.parent;
 //		String rtn = "<% env." + tag.name + "(" + (tag.attrs.isEmpty() ? "nil" : table(tag.attrs)) + ",env,function(env) %>" + block + "<% end) %>";
 		Expr env = env();
 		Expr fn = new IndexExpr( se(start,"block:"+tag.name), env, new ConstExpr(null,tag.name) );
 		List<Expressions> args = new ArrayList<Expressions>();
+		args.add( env );
 		args.add( tag.attrs.isEmpty() ? new ConstExpr(null,null) : table(tag.attrs) );
-		args.add( env );
 		args.add( fnDef );
 		FnCall fnCall = new FnCall( se(start), fn, ExpList.build(args) );
 		Stmt rtn = new ExpressionsStmt(fnCall);
@@ -280,17 +266,14 @@
 	}
 
 	private Tag parseBlockTag() throws ParseException {
-		parser.begin();
-		if( !parser.match("{block:") )
-			return parser.failure(null);
 		String name = parseName();
 		if( name==null )
 			throw exception("invalid block name");
 		Map<String,String> attrs = parseAttrs();
 		if( !parser.match("}") )
-			return parser.failure(null);
+			return null;
 		Tag tag = new Tag(name,attrs);
-		return parser.success(tag);
+		return tag;
 	}
 
 	private Stmt parseSimpleTag() throws ParseException {
@@ -303,27 +286,14 @@
 		Map<String,String> attrs = parseAttrs();
 		if( !parser.match("}") )
 			return parser.failure(null);
-		FnCall fnCall;
-		if( name.equals("Get") ) {
-			name = attrs.remove("name");
-			if( name == null )
-				throw exception("Get missing required attribute 'name'");
-			if( !attrs.isEmpty() )
-				throw exception("Get has unrecognized attributes: "+attrs);
-			if( !validateName(name) )
-				throw exception("invalid Get name: "+name);
-//			rtn = "<% " + name + "(env) %>";
-			int index = upValueIndex(name);
-			if( index == -1 )
-				throw exception("name '"+name+"' not defined");
-			Expr fn = new GetUpVar(se(start,name),index);
-			fnCall = new FnCall( se(start), fn, env() );
-		} else {
-//			rtn = "<% env." + name + (attrs.isEmpty() ? "()" : table(attrs)) + " %>";
-			Expr fn = new IndexExpr( se(start,name), env(), new ConstExpr(null,name) );
-			Expressions args = attrs.isEmpty() ? ExpList.emptyExpList : table(attrs);
-			fnCall = new FnCall( se(start), fn, args );
-		}
+//		rtn = "<% env." + name + (attrs.isEmpty() ? "()" : table(attrs)) + " %>";
+		Expr env = env();
+		Expr fn = new IndexExpr( se(start,name), env, new ConstExpr(null,name) );
+		List<Expressions> args = new ArrayList<Expressions>();
+		args.add( env );
+		if( !attrs.isEmpty() )
+			args.add( table(attrs) );
+		FnCall fnCall = new FnCall( se(start), fn, ExpList.build(args) );
 		Stmt rtn = new ExpressionsStmt(fnCall);
 		return parser.success(rtn);
 	}
@@ -371,23 +341,15 @@
 	}
 
 	private String parseName() {
-		return parseName(parser);
-	}
-
-	private static boolean validateName(String name) {
-		return name.equals(parseName(new Parser(new LuanSource("NAME",name))));
-	}
-
-	private static String parseName(Parser parser) {
 		int start = parser.begin();
-		if( !NameChar(parser) )
+		if( !NameChar() )
 			return parser.failure(null);
-		while( NameChar(parser) );
+		while( NameChar() );
 		String match = parser.textFrom(start);
 		return parser.success(match);
 	}
 
-	private static boolean NameChar(Parser parser) {
+	private boolean NameChar() {
 		return parser.inCharRange('a', 'z') || parser.inCharRange('A', 'Z')
 			|| parser.inCharRange('0', '9') || parser.anyOf("-_");
 	}