Mercurial Hosting > luan
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) { |