comparison core/src/luan/impl/LuanParser.java @ 503:92c3d22745b8

make _ENV optional
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 20 May 2015 23:24:46 -0600
parents b48cfa14ba60
children 8e51d6071b67
comparison
equal deleted inserted replaced
502:d3183a330ff5 503:92c3d22745b8
8 import java.util.Scanner; 8 import java.util.Scanner;
9 import luan.Luan; 9 import luan.Luan;
10 import luan.LuanState; 10 import luan.LuanState;
11 import luan.LuanSource; 11 import luan.LuanSource;
12 import luan.LuanElement; 12 import luan.LuanElement;
13 import luan.LuanTable;
13 import luan.modules.PackageLuan; 14 import luan.modules.PackageLuan;
14 15
15 16
16 final class LuanParser { 17 final class LuanParser {
17 18
22 int loops = 0; 23 int loops = 0;
23 boolean isVarArg = false; 24 boolean isVarArg = false;
24 final List<String> upValueSymbols = new ArrayList<String>(); 25 final List<String> upValueSymbols = new ArrayList<String>();
25 final List<UpValue.Getter> upValueGetters = new ArrayList<UpValue.Getter>(); 26 final List<UpValue.Getter> upValueGetters = new ArrayList<UpValue.Getter>();
26 27
27 Frame(UpValue.Getter envGetter) { 28 Frame() {
28 this.parent = null; 29 this.parent = null;
29 upValueSymbols.add(_ENV); 30 upValueSymbols.add(JAVA);
30 upValueGetters.add(envGetter); 31 upValueGetters.add(new UpValue.ValueGetter(false));
31 } 32 }
32 33
33 Frame(Frame parent) { 34 Frame(Frame parent) {
34 this.parent = parent; 35 this.parent = parent;
35 if( upValueIndex(_ENV) != 0 ) 36 if( upValueIndex(JAVA) != 0 )
36 throw new RuntimeException(); 37 throw new RuntimeException();
37 } 38 }
38 39
39 int stackIndex(String name) { 40 int stackIndex(String name) {
40 int i = symbols.size(); 41 int i = symbols.size();
90 In template() { 91 In template() {
91 return template ? this : new In(false,true); 92 return template ? this : new In(false,true);
92 } 93 }
93 } 94 }
94 95
96 private static final String JAVA = "-JAVA-"; // inaccessible from Luan
95 private static final String _ENV = "_ENV"; 97 private static final String _ENV = "_ENV";
96 private static final UpValue.Getter[] NO_UP_VALUE_GETTERS = new UpValue.Getter[0]; 98 private static final UpValue.Getter[] NO_UP_VALUE_GETTERS = new UpValue.Getter[0];
97 99
98 final LuanSource source; 100 final LuanSource source;
99 private Frame frame; 101 private Frame frame;
100 private final Parser parser; 102 private final Parser parser;
101 private final boolean interactive; 103
102 104 LuanParser(LuanSource source,LuanTable env) {
103 LuanParser(LuanSource source,UpValue.Getter envGetter) {
104 this.source = source; 105 this.source = source;
105 this.frame = new Frame(envGetter); 106 this.frame = new Frame();
106 this.parser = new Parser(source); 107 this.parser = new Parser(source);
107 this.interactive = envGetter instanceof UpValue.ValueGetter; 108 if( env != null )
109 addVar(_ENV,env);
108 } 110 }
109 111
110 void addVar(String name,Object value) { 112 void addVar(String name,Object value) {
111 frame.addUpValueGetter(name,new UpValue.ValueGetter(value)); 113 frame.addUpValueGetter(name,new UpValue.ValueGetter(value));
112 } 114 }
858 if( fnCall != null ) 860 if( fnCall != null )
859 return parser.success(exprVar(fnCall)); 861 return parser.success(exprVar(fnCall));
860 return parser.failure(null); 862 return parser.failure(null);
861 } 863 }
862 864
865 private interface Var {
866 public Expressions expr() throws ParseException;
867 public Settable settable() throws ParseException;
868 }
869
863 private Expr env() { 870 private Expr env() {
864 int index = stackIndex(_ENV); 871 int index = stackIndex(_ENV);
865 if( index != -1 ) 872 if( index != -1 )
866 return new GetLocalVar(null,index); 873 return new GetLocalVar(null,index);
867 index = upValueIndex(_ENV); 874 index = upValueIndex(_ENV);
868 if( index != -1 ) 875 if( index != -1 )
869 return new GetUpVar(null,index); 876 return new GetUpVar(null,index);
870 throw new RuntimeException("_ENV not found"); 877 return null;
871 }
872
873 private interface Var {
874 public Expressions expr();
875 public Settable settable();
876 } 878 }
877 879
878 private Var nameVar(final int start,final String name) { 880 private Var nameVar(final int start,final String name) {
879 return nameVar(se(start,name),name); 881 return nameVar(se(start,name),name);
880 } 882 }
881 883
882 private Var nameVar(final LuanElement se,final String name) { 884 private Var nameVar(final LuanElement se,final String name) {
883 return new Var() { 885 return new Var() {
884 886
885 public Expr expr() { 887 public Expr expr() throws ParseException {
886 int index = stackIndex(name); 888 int index = stackIndex(name);
887 if( index != -1 ) 889 if( index != -1 )
888 return new GetLocalVar(se,index); 890 return new GetLocalVar(se,index);
889 index = upValueIndex(name); 891 index = upValueIndex(name);
890 if( index != -1 ) 892 if( index != -1 )
891 return new GetUpVar(se,index); 893 return new GetUpVar(se,index);
892 return new IndexExpr( se, env(), new ConstExpr(se,name) ); 894 Expr envExpr = env();
893 } 895 if( envExpr != null )
894 896 return new IndexExpr( se, envExpr, new ConstExpr(se,name) );
895 public Settable settable() { 897 parser.failure(null);
898 throw parser.exception("name '"+name+"' not defined");
899 }
900
901 public Settable settable() throws ParseException {
896 int index = stackIndex(name); 902 int index = stackIndex(name);
897 if( index != -1 ) 903 if( index != -1 )
898 return new SetLocalVar(index); 904 return new SetLocalVar(index);
899 index = upValueIndex(name); 905 index = upValueIndex(name);
900 if( index != -1 ) 906 if( index != -1 )
901 return new SetUpVar(index); 907 return new SetUpVar(index);
902 return new SetTableEntry( se, env(), new ConstExpr(se,name) ); 908 Expr envExpr = env();
909 if( envExpr != null )
910 return new SetTableEntry( se, envExpr, new ConstExpr(se,name) );
911 parser.failure(null);
912 throw parser.exception("name '"+name+"' not defined");
903 } 913 }
904 }; 914 };
905 } 915 }
906 916
907 private Var exprVar(final Expressions expr) { 917 private Var exprVar(final Expressions expr) {