diff core/src/luan/impl/LuanParser.java @ 645:859c0dedc8b6

remove LuanSource
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 29 Mar 2016 18:09:51 -0600
parents 13b390bfed32
children e387e4021afe
line wrap: on
line diff
--- a/core/src/luan/impl/LuanParser.java	Tue Mar 29 13:53:01 2016 -0600
+++ b/core/src/luan/impl/LuanParser.java	Tue Mar 29 18:09:51 2016 -0600
@@ -8,8 +8,6 @@
 import java.util.Scanner;
 import luan.Luan;
 import luan.LuanState;
-import luan.LuanSource;
-import luan.LuanElement;
 import luan.LuanTable;
 import luan.modules.PackageLuan;
 
@@ -97,14 +95,14 @@
 	private static final String _ENV = "_ENV";
 	private static final UpValue.Getter[] NO_UP_VALUE_GETTERS = new UpValue.Getter[0];
 
-	final LuanSource source;
+//	final LuanSource source;
 	private Frame frame;
 	private final Parser parser;
 
-	LuanParser(LuanSource source,LuanTable env) {
-		this.source = source;
+	LuanParser(String sourceName,String sourceText,LuanTable env) {
+//		this.source = source;
 		this.frame = new Frame( env!=null ? env : new LuanTable() );
-		this.parser = new Parser(source);
+		this.parser = new Parser(sourceName,sourceText);
 		if( env != null )
 			addVar(_ENV,env);
 	}
@@ -113,14 +111,6 @@
 		frame.addUpValueGetter(name,new UpValue.ValueGetter(value));
 	}
 
-	private LuanElement se(int start) {
-		return se(start,null);
-	}
-
-	private LuanElement se(int start,String text) {
-		return new LuanElement(source,start,parser.currentIndex(),text);
-	}
-
 	private List<String> symbols() {
 		return frame.symbols;
 	}
@@ -185,7 +175,7 @@
 	}
 
 	private FnDef newFnDef(int start,Stmt stmt) {
-		return new FnDef( se(start), stmt, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
+		return new FnDef( stmt, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
 	}
 
 	FnDef Expression() throws ParseException {
@@ -193,7 +183,7 @@
 		int start = parser.begin();
 		Expressions expr = ExprZ(In.NOTHING);
 		if( expr != null && parser.endOfInput() ) {
-			Stmt stmt = new ReturnStmt( se(start), expr );
+			Stmt stmt = new ReturnStmt( expr );
 			return parser.success(newFnDef(start,stmt));
 		}
 		return parser.failure(null);
@@ -266,17 +256,14 @@
 	}
 
 	private Stmt TemplateStmt() throws ParseException {
-		int start = parser.currentIndex();
+		parser.currentIndex();
 		Expressions exprs = TemplateExpressions(In.NOTHING);
 		if( exprs == null )
 			return null;
-		LuanElement se = se(start,"require 'luan:Io'");
-		FnCall requireCall = new FnCall( se, new ConstExpr(se,PackageLuan.requireFn), new ConstExpr(se,"luan:Io") );
-		se = se(start,"stdout");
-		Expr stdoutExp = new IndexExpr( se, expr(requireCall), new ConstExpr(se,"stdout") );
-		se = se(start,"write");
-		Expr writeExp = new IndexExpr( se, stdoutExp, new ConstExpr(se,"write") );
-		FnCall writeCall = new FnCall( se(start), writeExp, exprs );
+		FnCall requireCall = new FnCall( new ConstExpr(PackageLuan.requireFn), new ConstExpr("luan:Io") );
+		Expr stdoutExp = new IndexExpr( expr(requireCall), new ConstExpr("stdout") );
+		Expr writeExp = new IndexExpr( stdoutExp, new ConstExpr("write") );
+		FnCall writeCall = new FnCall( writeExp, exprs );
 		return new ExpressionsStmt(writeCall);
 	}
 
@@ -306,19 +293,19 @@
 						throw parser.exception("Unclosed template expression");
 				} while( !parser.test( "<%" ) );
 				String match = parser.textFrom(i);
-				builder.add( new ConstExpr(se(i),match) );
+				builder.add( new ConstExpr(match) );
 			}
 		}
 	}
 
 	private Stmt ReturnStmt() throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		if( !Keyword("return",In.NOTHING) )
 			return parser.failure(null);
 		Expressions exprs = ExpList(In.NOTHING);
 		if( exprs==null )
 			exprs = ExpList.emptyExpList;
-		return parser.success( new ReturnStmt(se(start),exprs) );
+		return parser.success( new ReturnStmt(exprs) );
 	}
 
 	private Stmt FunctionStmt() throws ParseException {
@@ -326,14 +313,14 @@
 		if( !Keyword("function",In.NOTHING) )
 			return parser.failure(null);
 
-		int start = parser.currentIndex();
-		Var var = nameVar(start,RequiredName(In.NOTHING));
+		parser.currentIndex();
+		Var var = nameVar(RequiredName(In.NOTHING));
 		while( parser.match( '.' ) ) {
 			Spaces(In.NOTHING);
 			Expr exp = NameExpr(In.NOTHING);
 			if( exp==null )
 				return parser.failure(null);
-			var = indexVar( start, expr(var.expr()), exp );
+			var = indexVar( expr(var.expr()), exp );
 		}
 		Settable fnName = var.settable();
 
@@ -361,7 +348,7 @@
 	}
 
 	private Stmt ForStmt() throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		int stackStart = symbolsSize();
 		if( !Keyword("for",In.NOTHING) )
 			return parser.failure(null);
@@ -373,7 +360,7 @@
 		addSymbols(names);
 		Stmt loop = RequiredLoopBlock();
 		RequiredKeyword("end",In.NOTHING);
-		Stmt stmt = new ForStmt( se(start), stackStart, symbolsSize() - stackStart, expr, loop );
+		Stmt stmt = new ForStmt( stackStart, symbolsSize() - stackStart, expr, loop );
 		popSymbols( symbolsSize() - stackStart );
 		return parser.success(stmt);
 	}
@@ -445,24 +432,24 @@
 	}
 
 	private Stmt WhileStmt() throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		if( !Keyword("while",In.NOTHING) )
 			return parser.failure(null);
 		Expr cnd = expr(RequiredExpr(In.NOTHING));
 		RequiredKeyword("do",In.NOTHING);
 		Stmt loop = RequiredLoopBlock();
 		RequiredKeyword("end",In.NOTHING);
-		return parser.success( new WhileStmt(se(start),cnd,loop) );
+		return parser.success( new WhileStmt(cnd,loop) );
 	}
 
 	private Stmt RepeatStmt() throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		if( !Keyword("repeat",In.NOTHING) )
 			return parser.failure(null);
 		Stmt loop = RequiredLoopBlock();
 		RequiredKeyword("until",In.NOTHING);
 		Expr cnd = expr(RequiredExpr(In.NOTHING));
-		return parser.success( new RepeatStmt(se(start),loop,cnd) );
+		return parser.success( new RepeatStmt(loop,cnd) );
 	}
 
 	private Stmt RequiredLoopBlock() throws ParseException {
@@ -480,7 +467,7 @@
 	}
 
 	private Stmt IfStmt2() throws ParseException {
-		int start = parser.currentIndex();
+		parser.currentIndex();
 		Expr cnd = expr(RequiredExpr(In.NOTHING));
 		RequiredKeyword("then",In.NOTHING);
 		Stmt thenBlock = RequiredBlock();
@@ -491,7 +478,7 @@
 			elseBlock = Keyword("else",In.NOTHING) ? RequiredBlock() : Stmt.EMPTY;
 			RequiredKeyword("end",In.NOTHING);
 		}
-		return new IfStmt(se(start),cnd,thenBlock,elseBlock);
+		return new IfStmt(cnd,thenBlock,elseBlock);
 	}
 
 	private Stmt SetStmt() throws ParseException {
@@ -544,31 +531,31 @@
 	}
 
 	private Expressions OrExpr(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		Expressions exp = AndExpr(in);
 		if( exp==null )
 			return parser.failure(null);
 		while( Keyword("or",in) ) {
 			Expressions exp2 = AndExpr(in);
-			exp = new OrExpr( se(start), expr(exp), required(expr(exp2)) );
+			exp = new OrExpr( expr(exp), required(expr(exp2)) );
 		}
 		return parser.success(exp);
 	}
 
 	private Expressions AndExpr(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		Expressions exp = RelExpr(in);
 		if( exp==null )
 			return parser.failure(null);
 		while( Keyword("and",in) ) {
 			Expressions exp2 = RelExpr(in);
-			exp = new AndExpr( se(start), expr(exp), required(expr(exp2)) );
+			exp = new AndExpr( expr(exp), required(expr(exp2)) );
 		}
 		return parser.success(exp);
 	}
 
 	private Expressions RelExpr(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		Expressions exp = ConcatExpr(in);
 		if( exp==null )
 			return parser.failure(null);
@@ -576,27 +563,27 @@
 			if( parser.match("==") ) {
 				Spaces(in);
 				Expressions exp2 = ConcatExpr(in);
-				exp = new EqExpr( se(start), expr(exp), required(expr(exp2)) );
+				exp = new EqExpr( expr(exp), required(expr(exp2)) );
 			} else if( parser.match("~=") ) {
 				Spaces(in);
 				Expressions exp2 = ConcatExpr(in);
-				exp = new NotExpr( se(start), new EqExpr( se(start), expr(exp), required(expr(exp2)) ) );
+				exp = new NotExpr( new EqExpr( expr(exp), required(expr(exp2)) ) );
 			} else if( parser.match("<=") ) {
 				Spaces(in);
 				Expressions exp2 = ConcatExpr(in);
-				exp = new LeExpr( se(start), expr(exp), required(expr(exp2)) );
+				exp = new LeExpr( expr(exp), required(expr(exp2)) );
 			} else if( parser.match(">=") ) {
 				Spaces(in);
 				Expressions exp2 = ConcatExpr(in);
-				exp = new LeExpr( se(start), required(expr(exp2)), expr(exp) );
+				exp = new LeExpr( required(expr(exp2)), expr(exp) );
 			} else if( parser.match("<") ) {
 				Spaces(in);
 				Expressions exp2 = ConcatExpr(in);
-				exp = new LtExpr( se(start), expr(exp), required(expr(exp2)) );
+				exp = new LtExpr( expr(exp), required(expr(exp2)) );
 			} else if( parser.match(">") ) {
 				Spaces(in);
 				Expressions exp2 = ConcatExpr(in);
-				exp = new LtExpr( se(start), required(expr(exp2)), expr(exp) );
+				exp = new LtExpr( required(expr(exp2)), expr(exp) );
 			} else
 				break;
 		}
@@ -604,20 +591,20 @@
 	}
 
 	private Expressions ConcatExpr(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		Expressions exp = SumExpr(in);
 		if( exp==null )
 			return parser.failure(null);
 		if( parser.match("..") ) {
 			Spaces(in);
 			Expressions exp2 = ConcatExpr(in);
-			exp = new ConcatExpr( se(start), expr(exp), required(expr(exp2)) );
+			exp = new ConcatExpr( expr(exp), required(expr(exp2)) );
 		}
 		return parser.success(exp);
 	}
 
 	private Expressions SumExpr(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		Expressions exp = TermExpr(in);
 		if( exp==null )
 			return parser.failure(null);
@@ -625,11 +612,11 @@
 			if( parser.match('+') ) {
 				Spaces(in);
 				Expressions exp2 = TermExpr(in);
-				exp = new AddExpr( se(start), expr(exp), required(expr(exp2)) );
+				exp = new AddExpr( expr(exp), required(expr(exp2)) );
 			} else if( Minus() ) {
 				Spaces(in);
 				Expressions exp2 = TermExpr(in);
-				exp = new SubExpr( se(start), expr(exp), required(expr(exp2)) );
+				exp = new SubExpr( expr(exp), required(expr(exp2)) );
 			} else
 				break;
 		}
@@ -642,7 +629,7 @@
 	}
 
 	private Expressions TermExpr(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		Expressions exp = UnaryExpr(in);
 		if( exp==null )
 			return parser.failure(null);
@@ -650,15 +637,15 @@
 			if( parser.match('*') ) {
 				Spaces(in);
 				Expressions exp2 = UnaryExpr(in);
-				exp = new MulExpr( se(start), expr(exp), required(expr(exp2)) );
+				exp = new MulExpr( expr(exp), required(expr(exp2)) );
 			} else if( parser.match('/') ) {
 				Spaces(in);
 				Expressions exp2 = UnaryExpr(in);
-				exp = new DivExpr( se(start), expr(exp), required(expr(exp2)) );
+				exp = new DivExpr( expr(exp), required(expr(exp2)) );
 			} else if( Mod() ) {
 				Spaces(in);
 				Expressions exp2 = UnaryExpr(in);
-				exp = new ModExpr( se(start), expr(exp), required(expr(exp2)) );
+				exp = new ModExpr( expr(exp), required(expr(exp2)) );
 			} else
 				break;
 		}
@@ -671,21 +658,21 @@
 	}
 
 	private Expressions UnaryExpr(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		if( parser.match('#') ) {
 			Spaces(in);
 			Expressions exp = UnaryExpr(in);
-			return parser.success( new LenExpr( se(start), required(expr(exp)) ) );
+			return parser.success( new LenExpr( required(expr(exp)) ) );
 		}
 		if( Minus() ) {
 			Spaces(in);
 			Expressions exp = UnaryExpr(in);
-			return parser.success( new UnmExpr( se(start), required(expr(exp)) ) );
+			return parser.success( new UnmExpr( required(expr(exp)) ) );
 		}
 		if( Keyword("not",in) ) {
 			Spaces(in);
 			Expressions exp = UnaryExpr(in);
-			return parser.success( new NotExpr( se(start), required(expr(exp)) ) );
+			return parser.success( new NotExpr( required(expr(exp)) ) );
 		}
 		Expressions exp = PowExpr(in);
 		if( exp==null )
@@ -694,14 +681,14 @@
 	}
 
 	private Expressions PowExpr(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		Expressions exp = SingleExpr(in);
 		if( exp==null )
 			return parser.failure(null);
 		if( parser.match('^') ) {
 			Spaces(in);
 			Expressions exp2 = PowExpr(in);
-			exp = new PowExpr( se(start), expr(exp), required(expr(exp2)) );
+			exp = new PowExpr( expr(exp), required(expr(exp2)) );
 		}
 		return parser.success(exp);
 	}
@@ -757,15 +744,15 @@
 	}
 
 	private VarArgs VarArgs(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		if( !frame.isVarArg || !parser.match("...") )
 			return parser.failure(null);
 		Spaces(in);
-		return parser.success( new VarArgs(se(start)) );
+		return parser.success( new VarArgs() );
 	}
 
 	private Expr TableExpr(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		if( !parser.match('{') )
 			return parser.failure(null);
 		Spaces(In.NOTHING);
@@ -782,7 +769,7 @@
 		if( !parser.match('}') )
 			throw parser.exception("Expected table element or '}'");
 		Spaces(in);
-		return parser.success( new TableExpr( se(start), fields.toArray(new TableExpr.Field[0]), ExpList.build(builder) ) );
+		return parser.success( new TableExpr( fields.toArray(new TableExpr.Field[0]), ExpList.build(builder) ) );
 	}
 
 	private boolean FieldSep() throws ParseException {
@@ -814,18 +801,18 @@
 	}
 
 	private Var VarZ(In in) throws ParseException {
-		int start = parser.begin();
-		Var var = VarStart(in,start);
+		parser.begin();
+		Var var = VarStart(in);
 		if( var==null )
 			return parser.failure(null);
 		Var var2;
-		while( (var2=Var2(in,start,var.expr())) != null ) {
+		while( (var2=Var2(in,var.expr())) != null ) {
 			var = var2;
 		}
 		return parser.success(var);
 	}
 
-	private Var VarStart(In in,int start) throws ParseException {
+	private Var VarStart(In in) throws ParseException {
 		if( parser.match('(') ) {
 			In inParens = in.parens();
 			Spaces(inParens);
@@ -836,7 +823,7 @@
 		}
 		String name = Name(in);
 		if( name != null )
-			return nameVar(start,name);
+			return nameVar(name);
 		Expressions exp;
 		exp = TableExpr(in);
 		if( exp != null )
@@ -847,19 +834,19 @@
 		return null;
 	}
 
-	private Var Var2(In in,int start,Expressions exp1) throws ParseException {
+	private Var Var2(In in,Expressions exp1) throws ParseException {
 		parser.begin();
 		Expr exp2 = SubExpr(in);
 		if( exp2 != null )
-			return parser.success(indexVar(start,expr(exp1),exp2));
+			return parser.success(indexVar(expr(exp1),exp2));
 		if( parser.match('.') ) {
 			Spaces(in);
 			exp2 = NameExpr(in);
 			if( exp2!=null )
-				return parser.success(indexVar(start,expr(exp1),exp2));
+				return parser.success(indexVar(expr(exp1),exp2));
 			return parser.failure(null);
 		}
-		FnCall fnCall = Args( in, start, expr(exp1), new ArrayList<Expressions>() );
+		FnCall fnCall = Args( in, expr(exp1), new ArrayList<Expressions>() );
 		if( fnCall != null )
 			return parser.success(exprVar(fnCall));
 		return parser.failure(null);
@@ -873,30 +860,26 @@
 	private Expr env() {
 		int index = stackIndex(_ENV);
 		if( index != -1 )
-			return new GetLocalVar(null,index);
+			return new GetLocalVar(index);
 		index = upValueIndex(_ENV);
 		if( index != -1 )
-			return new GetUpVar(null,index);
+			return new GetUpVar(index);
 		return null;
 	}
 
-	private Var nameVar(final int start,final String name) {
-		return nameVar(se(start,name),name);
-	}
-
-	private Var nameVar(final LuanElement se,final String name) {
+	private Var nameVar(final String name) {
 		return new Var() {
 
 			public Expr expr() throws ParseException {
 				int index = stackIndex(name);
 				if( index != -1 )
-					return new GetLocalVar(se,index);
+					return new GetLocalVar(index);
 				index = upValueIndex(name);
 				if( index != -1 )
-					return new GetUpVar(se,index);
+					return new GetUpVar(index);
 				Expr envExpr = env();
 				if( envExpr != null )
-					return new IndexExpr( se, envExpr, new ConstExpr(se,name) );
+					return new IndexExpr( envExpr, new ConstExpr(name) );
 				parser.failure(null);
 				throw parser.exception("name '"+name+"' not defined");
 			}
@@ -910,7 +893,7 @@
 					return new SetUpVar(index);
 				Expr envExpr = env();
 				if( envExpr != null )
-					return new SetTableEntry( se, envExpr, new ConstExpr(se,name) );
+					return new SetTableEntry( envExpr, new ConstExpr(name) );
 				parser.failure(null);
 				throw parser.exception("name '"+name+"' not defined");
 			}
@@ -930,28 +913,28 @@
 		};
 	}
 
-	private Var indexVar(final int start,final Expr table,final Expr key) {
+	private Var indexVar(final Expr table,final Expr key) {
 		return new Var() {
 
 			public Expr expr() {
-				return new IndexExpr( se(start), table, key );
+				return new IndexExpr( table, key );
 			}
 
 			public Settable settable() {
-				return new SetTableEntry(se(start),table,key);
+				return new SetTableEntry(table,key);
 			}
 		};
 	}
 
-	private FnCall Args(In in,int start,Expr fn,List<Expressions> builder) throws ParseException {
+	private FnCall Args(In in,Expr fn,List<Expressions> builder) throws ParseException {
 		parser.begin();
 		return args(in,builder)
-			? parser.success( new FnCall( se(start), fn, ExpList.build(builder) ) )
+			? parser.success( new FnCall( fn, ExpList.build(builder) ) )
 			: parser.failure((FnCall)null);
 	}
 
 	private boolean args(In in,List<Expressions> builder) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		if( parser.match('(') ) {
 			In inParens = in.parens();
 			Spaces(inParens);
@@ -968,7 +951,7 @@
 		}
 		String s = StringLiteral(in);
 		if( s != null ) {
-			builder.add( new ConstExpr(se(start),s) );
+			builder.add( new ConstExpr(s) );
 			return parser.success();
 		}
 /*
@@ -1021,11 +1004,11 @@
 	}
 
 	private Expr NameExpr(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		String name = Name(in);
 		if( name==null )
 			return parser.failure(null);
-		return parser.success(new ConstExpr(se(start),name));
+		return parser.success(new ConstExpr(name));
 	}
 
 	private String RequiredName(In in) throws ParseException {
@@ -1105,18 +1088,18 @@
 	));
 
 	private Expr Literal(In in) throws ParseException {
-		int start = parser.begin();
+		parser.begin();
 		if( NilLiteral(in) )
-			return parser.success(new ConstExpr(se(start),null));
+			return parser.success(new ConstExpr(null));
 		Boolean b = BooleanLiteral(in);
 		if( b != null )
-			return parser.success(new ConstExpr(se(start),b));
+			return parser.success(new ConstExpr(b));
 		Number n = NumberLiteral(in);
 		if( n != null )
-			return parser.success(new ConstExpr(se(start),n));
+			return parser.success(new ConstExpr(n));
 		String s = StringLiteral(in);
 		if( s != null )
-			return parser.success(new ConstExpr(se(start),s));
+			return parser.success(new ConstExpr(s));
 		return parser.failure(null);
 	}