Mercurial Hosting > luan
annotate src/luan/impl/LuanParser.java @ 1810:3c43b07e12b7 default tip
minor
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 12 May 2024 22:00:42 -0600 |
parents | d1dd61e6dd84 |
children |
rev | line source |
---|---|
166
4eaee12f6c65
move luan/interp to impl
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
165
diff
changeset
|
1 package luan.impl; |
5
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
3 //import java.io.StringWriter; |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
4 //import java.io.PrintWriter; |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
5 import java.util.Set; |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
6 import java.util.HashSet; |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
7 import java.util.Arrays; |
9
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
8 import java.util.List; |
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
9 import java.util.ArrayList; |
676 | 10 import java.util.concurrent.atomic.AtomicInteger; |
48
64ecb7a3aad7
rename Lua to Luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
46
diff
changeset
|
11 import luan.Luan; |
503 | 12 import luan.LuanTable; |
186
cf939124461a
don't import modules by default
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
181
diff
changeset
|
13 import luan.modules.PackageLuan; |
5
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
14 |
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
15 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
16 final class LuanParser { |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
17 |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
18 private interface Sym { |
674 | 19 public Expr exp(); |
1561 | 20 public Stmts set(Expr val); |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
21 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
22 |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
23 private int symCounter = 0; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
24 |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
25 private class LocalSym implements Sym { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
26 final String name; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
27 final String javaName; |
671 | 28 boolean isPointer = false; |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
29 |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
30 LocalSym(String name) { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
31 this.name = name; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
32 this.javaName = name + "_" + (++symCounter); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
33 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
34 |
674 | 35 Stmts declaration(Expr value) { |
36 Stmts stmt = new Stmts(); | |
671 | 37 if( value==null ) { |
677 | 38 stmt.add( new Object() { |
671 | 39 @Override public String toString() { |
40 if( !isPointer ) | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
41 return "Object " + javaName + "; "; |
671 | 42 else |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
43 return "final Pointer " + javaName + " = new Pointer(); "; |
671 | 44 } |
45 } ); | |
46 } else { | |
674 | 47 if( value.valType != Val.SINGLE ) throw new RuntimeException(); |
677 | 48 stmt.add( new Object() { |
671 | 49 @Override public String toString() { |
50 if( !isPointer ) | |
51 return "Object " + javaName + " = "; | |
52 else | |
53 return "final Pointer " + javaName + " = new Pointer("; | |
54 } | |
55 } ); | |
677 | 56 stmt.addAll(value); |
57 stmt.add( new Object() { | |
671 | 58 @Override public String toString() { |
59 if( !isPointer ) | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
60 return "; "; |
671 | 61 else |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
62 return "); "; |
671 | 63 } |
64 } ); | |
65 } | |
66 return stmt; | |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
67 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
68 |
674 | 69 @Override public Expr exp() { |
70 Expr exp = new Expr(Val.SINGLE,false); | |
677 | 71 exp.add( new Object() { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
72 @Override public String toString() { |
671 | 73 if( !isPointer ) |
74 return javaName; | |
75 else | |
1561 | 76 return javaName + ".get()"; |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
77 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
78 } ); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
79 return exp; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
80 } |
1561 | 81 |
82 @Override public Stmts set(Expr val) { | |
83 Stmts stmt = new Stmts(); | |
84 stmt.add( new Object() { | |
85 @Override public String toString() { | |
86 if( !isPointer ) | |
87 return javaName + " = "; | |
88 else | |
89 return javaName + ".set("; | |
90 } | |
91 } ); | |
92 stmt.addAll( val.single() ); | |
93 stmt.add( new Object() { | |
94 @Override public String toString() { | |
95 if( !isPointer ) | |
96 return "; "; | |
97 else | |
98 return "); "; | |
99 } | |
100 } ); | |
101 return stmt; | |
102 } | |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
103 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
104 |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
105 private class UpSym implements Sym { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
106 final String name; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
107 final int i; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
108 final String value; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
109 |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
110 UpSym(String name,int i,String value) { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
111 this.name = name; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
112 this.i = i; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
113 this.value = value; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
114 } |
1561 | 115 |
674 | 116 @Override public Expr exp() { |
117 Expr exp = new Expr(Val.SINGLE,false); | |
677 | 118 exp.add( new Object() { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
119 @Override public String toString() { |
1561 | 120 return "upValues[" + i + "].get()"; |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
121 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
122 } ); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
123 return exp; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
124 } |
1561 | 125 |
126 @Override public Stmts set(Expr val) { | |
127 Stmts stmt = new Stmts(); | |
128 stmt.add( new Object() { | |
129 @Override public String toString() { | |
130 return "upValues[" + i + "].set("; | |
131 } | |
132 } ); | |
133 stmt.addAll( val.single() ); | |
134 stmt.add( "); " ); | |
135 return stmt; | |
136 } | |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
137 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
138 |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
139 private final class Frame { |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
140 final Frame parent; |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
141 final List<LocalSym> symbols = new ArrayList<LocalSym>(); |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
142 int loops = 0; |
24
7ee247560db5
add VarArgs
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
21
diff
changeset
|
143 boolean isVarArg = false; |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
144 final List<UpSym> upValueSymbols = new ArrayList<UpSym>(); |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
145 |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
146 Frame() { |
34
0cdc1da466ee
implement _G and _ENV
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
33
diff
changeset
|
147 this.parent = null; |
0cdc1da466ee
implement _G and _ENV
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
33
diff
changeset
|
148 } |
0cdc1da466ee
implement _G and _ENV
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
33
diff
changeset
|
149 |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
150 Frame(Frame parent) { |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
151 this.parent = parent; |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
152 } |
32
c3eab5a3ce3c
implement closures
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
31
diff
changeset
|
153 |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
154 LocalSym addLocalSym(String name) { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
155 LocalSym sym = new LocalSym(name); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
156 symbols.add(sym); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
157 return sym; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
158 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
159 |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
160 UpSym addUpSym(String name,String value) { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
161 UpSym sym = new UpSym( name, upValueSymbols.size(), value ); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
162 upValueSymbols.add(sym); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
163 return sym; |
32
c3eab5a3ce3c
implement closures
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
31
diff
changeset
|
164 } |
c3eab5a3ce3c
implement closures
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
31
diff
changeset
|
165 |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
166 LocalSym getLocalSym(String name) { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
167 int i = symbols.size(); |
32
c3eab5a3ce3c
implement closures
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
31
diff
changeset
|
168 while( --i >= 0 ) { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
169 LocalSym sym = symbols.get(i); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
170 if( sym.name.equals(name) ) |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
171 return sym; |
32
c3eab5a3ce3c
implement closures
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
31
diff
changeset
|
172 } |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
173 return null; |
32
c3eab5a3ce3c
implement closures
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
31
diff
changeset
|
174 } |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
107
diff
changeset
|
175 |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
176 UpSym getUpSym(String name) { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
177 for( UpSym upSym : upValueSymbols ) { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
178 if( upSym.name.equals(name) ) |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
179 return upSym; |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
180 } |
688 | 181 if( parent != null ) { |
182 LocalSym sym = parent.getLocalSym(name); | |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
183 if( sym != null ) { |
671 | 184 sym.isPointer = true; |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
185 return addUpSym(name,sym.javaName); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
186 } |
688 | 187 UpSym upSym = parent.getUpSym(name); |
188 if( upSym != null ) { | |
189 return addUpSym(name,"parentUpValues["+upSym.i+"]"); | |
190 } | |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
191 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
192 return null; |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
107
diff
changeset
|
193 } |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
194 |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
195 Sym getSym(String name) { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
196 Sym sym = getLocalSym(name); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
197 return sym != null ? sym : getUpSym(name); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
198 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
199 |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
200 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
201 |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
202 private int innerCounter = 0; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
203 private final List<Inner> inners = new ArrayList<Inner>(); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
204 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
205 private Frame frame; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
206 private final Parser parser; |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
207 private final Stmts top; |
86
6db8f286fa6c
_ENV is per module, not global
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
83
diff
changeset
|
208 |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
209 LuanParser(String sourceText,String sourceName) { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
210 this.frame = new Frame(); |
694
b620b8e1010f
remove Luan.load() allow_expression param and add Luan.eval()
Franklin Schmidt <fschmidt@gmail.com>
parents:
693
diff
changeset
|
211 this.parser = new Parser(sourceText,sourceName); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
212 this.top = new Stmts(); |
108
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
107
diff
changeset
|
213 } |
3c404a296995
make Package module more standard;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
107
diff
changeset
|
214 |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
215 void addVar(String name) { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
216 UpSym upSym = frame.addUpSym( "-ADDED-" ,"new Pointer()"); |
687 | 217 LocalSym sym = frame.addLocalSym( name ); |
218 sym.isPointer = true; | |
219 top.add( "final Pointer " + sym.javaName + " = upValues[" + upSym.i + "]; " ); | |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
220 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
221 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
222 private int symbolsSize() { |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
223 return frame.symbols.size(); |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
224 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
225 |
674 | 226 private Stmts addSymbol(String name,Expr value) { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
227 final LocalSym sym = frame.addLocalSym(name); |
671 | 228 return sym.declaration(value); |
28
df923e5835b2
fix local initial assignment
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
26
diff
changeset
|
229 } |
df923e5835b2
fix local initial assignment
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
26
diff
changeset
|
230 |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
231 private Sym getSym(String name) { |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
232 return frame.getSym(name); |
17
09d41f7490a8
add local variables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
16
diff
changeset
|
233 } |
09d41f7490a8
add local variables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
16
diff
changeset
|
234 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
235 private void popSymbols(int n) { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
236 List<LocalSym> symbols = frame.symbols; |
19
a7c13c6017f7
add GenericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
18
diff
changeset
|
237 while( n-- > 0 ) { |
a7c13c6017f7
add GenericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
18
diff
changeset
|
238 symbols.remove(symbols.size()-1); |
a7c13c6017f7
add GenericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
18
diff
changeset
|
239 } |
a7c13c6017f7
add GenericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
18
diff
changeset
|
240 } |
a7c13c6017f7
add GenericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
18
diff
changeset
|
241 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
242 private void incLoops() { |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
243 frame.loops++; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
244 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
245 |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
246 private void decLoops() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
247 frame.loops--; |
20
d85510d92eee
add BreakStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
248 } |
d85510d92eee
add BreakStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
249 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
250 private <T> T required(T t) throws ParseException { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
251 if( t==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
252 throw parser.exception(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
253 return t; |
20
d85510d92eee
add BreakStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
254 } |
d85510d92eee
add BreakStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
255 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
256 private <T> T required(T t,String msg) throws ParseException { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
257 if( t==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
258 throw parser.exception(msg); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
259 return t; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
260 } |
674 | 261 |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
262 private Expr newFnExp(Stmts stmt,String name) { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
263 String className = "INNER" + ++innerCounter; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
264 Inner inner = new Inner( stmt, name, className ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
265 inners.add(inner); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
266 return inner.toInnerFnExp( frame.upValueSymbols ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
267 // return toFnExp( stmt, frame.upValueSymbols, name ); |
32
c3eab5a3ce3c
implement closures
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
31
diff
changeset
|
268 } |
20
d85510d92eee
add BreakStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
269 |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
1413
diff
changeset
|
270 Compiled RequiredModule() throws ParseException { |
678 | 271 GetRequiredModule(); |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
1413
diff
changeset
|
272 String className = "EXP"; |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
273 String classCode = toFnString( top, frame.upValueSymbols, className, inners ); |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
1413
diff
changeset
|
274 return Compiled.compile("luan.impl."+className,parser.sourceName,classCode); |
678 | 275 } |
276 | |
277 String RequiredModuleSource() throws ParseException { | |
278 GetRequiredModule(); | |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
1413
diff
changeset
|
279 String className = "EXP"; |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
280 return toFnString( top, frame.upValueSymbols, className, inners ); |
678 | 281 } |
282 | |
283 void GetRequiredModule() throws ParseException { | |
1413 | 284 //Spaces(); |
678 | 285 parser.begin(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
286 frame.isVarArg = true; |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
287 top.add( "final Object[] varArgs = LuanImpl.varArgs(args,0); " ); |
674 | 288 Stmts block = RequiredBlock(); |
677 | 289 top.addAll( block ); |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
290 top.hasReturn = block.hasReturn; |
678 | 291 if( !parser.endOfInput() ) |
292 throw parser.exception(); | |
293 parser.success(); | |
11
b7d7069fee58
add assignment statement and CmdLine
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
9
diff
changeset
|
294 } |
b7d7069fee58
add assignment statement and CmdLine
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
9
diff
changeset
|
295 |
674 | 296 private Stmts RequiredBlock() throws ParseException { |
1665
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
297 int stackStart = symbolsSize(); |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
298 Stmts stmts = RequiredStmts(); |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
299 int stackEnd = symbolsSize(); |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
300 popSymbols( stackEnd - stackStart ); |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
301 return stmts; |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
302 } |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
303 |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
304 private Stmts RequiredStmts() throws ParseException { |
674 | 305 Stmts stmts = new Stmts(); |
684 | 306 do { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
307 Spaces(); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
308 stmts.addNewLines(); |
684 | 309 Stmts stmt = Stmt(); |
310 if( stmt != null ) { | |
311 stmts.addAll(stmt); | |
312 stmts.hasReturn = stmt.hasReturn; | |
313 } | |
314 } while( !stmts.hasReturn && (StmtSep() || TemplateSep(stmts)) ); | |
315 Spaces(); | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
316 while( StmtSep() ) |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
317 Spaces(); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
318 stmts.addNewLines(); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
319 return stmts; |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
320 } |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
321 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
322 private boolean StmtSep() throws ParseException { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
323 return parser.match( ';' ) || EndOfLine(); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
324 } |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
325 |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
326 private boolean TemplateSep(Stmts stmts) throws ParseException { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
327 Stmts stmt = TemplateStmt(); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
328 if( stmt != null ) { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
329 stmts.addAll(stmt); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
330 return true; |
157
1de3e4a6e82d
remove LuanJavaFunction.RTN_NUMBER_ARRAY;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
155
diff
changeset
|
331 } |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
332 return false; |
14
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
333 } |
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
334 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
335 private boolean EndOfLine() { |
684 | 336 if( MatchEndOfLine() ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
337 parser.sb().append('\n'); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
338 return true; |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
339 } else { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
340 return false; |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
341 } |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
342 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
343 |
684 | 344 private boolean MatchEndOfLine() { |
345 return parser.match( "\r\n" ) || parser.match( '\r' ) || parser.match( '\n' ); | |
346 } | |
347 | |
348 private Stmts Stmt() throws ParseException { | |
674 | 349 Stmts stmt; |
684 | 350 if( (stmt=ReturnStmt()) != null |
351 || (stmt=FunctionStmt()) != null | |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
352 || (stmt=LocalStmt()) != null |
661
1bbb08c0d8f1
compile LocalFunctionStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
660
diff
changeset
|
353 || (stmt=LocalFunctionStmt()) != null |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
354 || (stmt=BreakStmt()) != null |
1131
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
355 || (stmt=ContinueStmt()) != null |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
356 || (stmt=ForStmt()) != null |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
357 || (stmt=DoStmt()) != null |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
358 || (stmt=WhileStmt()) != null |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
359 || (stmt=RepeatStmt()) != null |
653
538b0ae08faa
compile IfStmt and BreakStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
652
diff
changeset
|
360 || (stmt=IfStmt()) != null |
1520 | 361 || (stmt=TryStmt()) != null |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
362 || (stmt=SetStmt()) != null |
159
0abc9181061a
revert rev 154 but only allow FnCall, AndExpr, or OrExpr in ExpressionsStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
158
diff
changeset
|
363 || (stmt=ExpressionsStmt()) != null |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
364 ) { |
684 | 365 return stmt; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
366 } |
684 | 367 return null; |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
368 } |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
369 |
674 | 370 private Expr indexExpStr(Expr exp1,Expr exp2) { |
371 Expr exp = new Expr(Val.SINGLE,false); | |
677 | 372 exp.add( "luan.index(" ); |
373 exp.addAll( exp1.single() ); | |
374 exp.add( "," ); | |
375 exp.addAll( exp2.single() ); | |
376 exp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
377 return exp; |
654 | 378 } |
379 | |
674 | 380 private Expr callExpStr(Expr fn,Expr args) { |
381 Expr exp = new Expr(null,true); | |
677 | 382 exp.add( "Luan.checkFunction(" ); |
383 exp.addAll( fn.single() ); | |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
384 exp.add( ").call(luan," ); |
677 | 385 exp.addAll( args.array() ); |
386 exp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
387 return exp; |
654 | 388 } |
389 | |
674 | 390 private Stmts TemplateStmt() throws ParseException { |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
391 Expr exprs = TemplateExpressions(); |
369
85bf9f0379aa
template statements no longer depend on 'Io' being defined
Franklin Schmidt <fschmidt@gmail.com>
parents:
356
diff
changeset
|
392 if( exprs == null ) |
157
1de3e4a6e82d
remove LuanJavaFunction.RTN_NUMBER_ARRAY;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
155
diff
changeset
|
393 return null; |
674 | 394 Stmts stmt = new Stmts(); |
1580 | 395 stmt.add( "Luan.checkFunction(luan.index(luan.require(\"luan:Io.luan\"),\"template_write\")).call(luan," ); |
680
ecd436959855
improve template statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
679
diff
changeset
|
396 stmt.addAll( exprs.array() ); |
ecd436959855
improve template statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
679
diff
changeset
|
397 stmt.add( "); " ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
398 return stmt; |
157
1de3e4a6e82d
remove LuanJavaFunction.RTN_NUMBER_ARRAY;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
155
diff
changeset
|
399 } |
1de3e4a6e82d
remove LuanJavaFunction.RTN_NUMBER_ARRAY;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
155
diff
changeset
|
400 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
401 private Expr TemplateExpressions() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
402 int start = parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
403 if( !parser.match( "%>" ) ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
404 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
405 EndOfLine(); |
674 | 406 List<Expr> builder = new ArrayList<Expr>(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
407 while(true) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
408 if( parser.match( "<%=" ) ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
409 Spaces(); |
708
77e0c859c8a3
fix luan_to_java and fix line numbers
Franklin Schmidt <fschmidt@gmail.com>
parents:
700
diff
changeset
|
410 Expr exp = new Expr(Val.SINGLE,false); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
411 exp.addAll( RequiredExpr().single() ); |
708
77e0c859c8a3
fix luan_to_java and fix line numbers
Franklin Schmidt <fschmidt@gmail.com>
parents:
700
diff
changeset
|
412 builder.add(exp); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
413 RequiredMatch( "%>" ); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
414 } else if( parser.match( "<%" ) ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
415 Spaces(); |
654 | 416 return parser.success(expString(builder)); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
417 } else { |
714 | 418 Expr exp = new Expr(Val.SINGLE,false); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
419 int i = parser.currentIndex(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
420 do { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
421 if( parser.match( "%>" ) ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
422 throw parser.exception("'%>' unexpected"); |
714 | 423 if( !(EndOfLine() || parser.anyChar()) ) |
157
1de3e4a6e82d
remove LuanJavaFunction.RTN_NUMBER_ARRAY;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
155
diff
changeset
|
424 throw parser.exception("Unclosed template expression"); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
425 } while( !parser.test( "<%" ) ); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
426 String match = parser.textFrom(i); |
714 | 427 String rtns = parser.sb().toString(); |
428 parser.sb().setLength(0); | |
429 exp.addAll( constExpStr(match) ); | |
430 if( rtns.length() > 0 ) | |
431 exp.add(rtns); | |
432 builder.add(exp); | |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
433 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
434 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
435 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
436 |
674 | 437 private Stmts ReturnStmt() throws ParseException { |
645 | 438 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
439 if( !Keyword("return") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
440 return parser.failure(null); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
441 Expr exprs = ExpStringList(); |
674 | 442 Stmts stmt = new Stmts(); |
677 | 443 stmt.add( "return " ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
444 if( exprs != null ) |
677 | 445 stmt.addAll( exprs ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
446 else |
677 | 447 stmt.add( "LuanFunction.NOTHING" ); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
448 stmt.add( "; " ); |
684 | 449 stmt.hasReturn = true; |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
450 return parser.success( stmt ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
451 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
452 |
674 | 453 private Stmts FunctionStmt() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
454 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
455 if( !Keyword("function") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
456 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
457 |
645 | 458 parser.currentIndex(); |
681 | 459 String name = RequiredName(); |
460 Var var = nameVar(name); | |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
461 while( parser.match( '.' ) ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
462 Spaces(); |
681 | 463 // Expr exp = NameExpr(); |
464 name = Name(); | |
465 if( name==null ) | |
636 | 466 return parser.failure(null); |
681 | 467 var = indexVar( var.exp(), constExpStr(name) ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
468 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
469 |
681 | 470 Expr fnDef = RequiredFunction(name); |
665 | 471 return parser.success( var.set(fnDef) ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
472 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
473 |
674 | 474 private Stmts LocalFunctionStmt() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
475 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
476 if( !(Keyword("local") && Keyword("function")) ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
477 return parser.failure(null); |
674 | 478 Stmts stmt = new Stmts(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
479 String name = RequiredName(); |
677 | 480 stmt.addAll( addSymbol(name,null) ); |
681 | 481 Expr fnDef = RequiredFunction(name); |
677 | 482 stmt.addAll( nameVar(name).set(fnDef) ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
483 return parser.success( stmt ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
484 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
485 |
674 | 486 private Stmts BreakStmt() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
487 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
488 if( !Keyword("break") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
489 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
490 if( frame.loops <= 0 ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
491 throw parser.exception("'break' outside of loop"); |
674 | 492 Stmts stmt = new Stmts(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
493 stmt.add( "break; " ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
494 return parser.success( stmt ); |
17
09d41f7490a8
add local variables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
16
diff
changeset
|
495 } |
09d41f7490a8
add local variables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
16
diff
changeset
|
496 |
1131
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
497 private Stmts ContinueStmt() throws ParseException { |
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
498 parser.begin(); |
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
499 if( !Keyword("continue") ) |
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
500 return parser.failure(null); |
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
501 if( frame.loops <= 0 ) |
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
502 throw parser.exception("'continue' outside of loop"); |
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
503 Stmts stmt = new Stmts(); |
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
504 stmt.add( "continue; " ); |
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
505 return parser.success( stmt ); |
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
506 } |
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
507 |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
508 int forCounter = 0; |
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
509 |
674 | 510 private Stmts ForStmt() throws ParseException { |
645 | 511 parser.begin(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
512 int stackStart = symbolsSize(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
513 if( !Keyword("for") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
514 return parser.failure(null); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
515 List<String> names = RequiredNameList(); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
516 if( !Keyword("in") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
517 return parser.failure(null); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
518 Expr expr = RequiredExpr().single(); |
681 | 519 RequiredKeyword("do"); |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
520 |
1520 | 521 String fnVar = "fn" + ++forCounter; |
674 | 522 Expr fnExp = new Expr(null,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
523 fnExp.add( fnVar + ".call(luan)" ); |
674 | 524 Stmts stmt = new Stmts(); |
1665
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
525 stmt.add( "LuanFunction "+fnVar+" = Luan.checkFunction(" ); |
677 | 526 stmt.addAll( expr ); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
527 stmt.add( "); " ); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
528 stmt.add( "while(true) { " ); |
677 | 529 stmt.addAll( makeLocalSetStmt(names,fnExp) ); |
530 stmt.add( "if( " ); | |
531 stmt.addAll( nameVar(names.get(0)).exp() ); | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
532 stmt.add( "==null ) break; " ); |
674 | 533 Stmts loop = RequiredLoopBlock(); |
1091
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
534 RequiredEnd("end_for"); |
677 | 535 stmt.addAll( loop ); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
536 stmt.add( "} " ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
537 popSymbols( symbolsSize() - stackStart ); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
538 return parser.success(stmt); |
54
f5b27ef14d73
add OutputStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
51
diff
changeset
|
539 } |
f5b27ef14d73
add OutputStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
51
diff
changeset
|
540 |
674 | 541 private Stmts DoStmt() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
542 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
543 if( !Keyword("do") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
544 return parser.failure(null); |
674 | 545 Stmts stmt = RequiredBlock(); |
1091
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
546 RequiredEnd("end_do"); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
547 return parser.success(stmt); |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
548 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
549 |
674 | 550 private Stmts LocalStmt() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
551 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
552 if( !Keyword("local") ) |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
553 return parser.failure(null); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
554 List<String> names = NameList(); |
356
5e34702423a0
better parser error message
Franklin Schmidt <fschmidt@gmail.com>
parents:
326
diff
changeset
|
555 if( names==null ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
556 if( Keyword("function") ) |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
557 return parser.failure(null); // handled later |
356
5e34702423a0
better parser error message
Franklin Schmidt <fschmidt@gmail.com>
parents:
326
diff
changeset
|
558 throw parser.exception("Invalid local statement"); |
5e34702423a0
better parser error message
Franklin Schmidt <fschmidt@gmail.com>
parents:
326
diff
changeset
|
559 } |
674 | 560 Stmts stmt = new Stmts(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
561 if( parser.match( '=' ) ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
562 Spaces(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
563 Expr values = ExpStringList(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
564 if( values==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
565 throw parser.exception("Expressions expected"); |
677 | 566 stmt.addAll( makeLocalSetStmt(names,values) ); |
671 | 567 } else { |
674 | 568 Expr value = new Expr(Val.SINGLE,false); |
677 | 569 value.add( "null" ); |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
570 for( String name : names ) { |
677 | 571 stmt.addAll( addSymbol(name,value) ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
572 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
573 } |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
574 return parser.success(stmt); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
575 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
576 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
577 private List<String> RequiredNameList() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
578 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
579 List<String> names = NameList(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
580 if( names==null ) |
139
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
581 throw parser.exception("Name expected"); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
582 return parser.success(names); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
583 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
584 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
585 private List<String> NameList() throws ParseException { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
586 String name = Name(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
587 if( name==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
588 return null; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
589 List<String> names = new ArrayList<String>(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
590 names.add(name); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
591 while( (name=anotherName()) != null ) { |
139
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
592 names.add(name); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
593 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
594 return names; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
595 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
596 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
597 private String anotherName() throws ParseException { |
139
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
598 parser.begin(); |
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
599 if( !parser.match( ',' ) ) |
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
600 return parser.failure(null); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
601 Spaces(); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
602 String name = Name(); |
139
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
603 if( name==null ) |
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
604 return parser.failure(null); |
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
605 return parser.success(name); |
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
606 } |
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
607 |
674 | 608 private Stmts WhileStmt() throws ParseException { |
645 | 609 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
610 if( !Keyword("while") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
611 return parser.failure(null); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
612 Expr cnd = RequiredExpr().single(); |
681 | 613 RequiredKeyword("do"); |
674 | 614 Stmts loop = RequiredLoopBlock(); |
1091
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
615 RequiredEnd("end_while"); |
674 | 616 Stmts stmt = new Stmts(); |
677 | 617 stmt.add( "while( Luan.checkBoolean(" ); |
618 stmt.addAll( cnd ); | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
619 stmt.add( ") ) { " ); |
677 | 620 stmt.addAll( loop ); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
621 stmt.add( "} " ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
622 return parser.success( stmt ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
623 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
624 |
1665
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
625 int repeatCounter = 0; |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
626 |
674 | 627 private Stmts RepeatStmt() throws ParseException { |
645 | 628 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
629 if( !Keyword("repeat") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
630 return parser.failure(null); |
1665
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
631 int stackStart = symbolsSize(); |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
632 incLoops(); |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
633 Stmts loop = RequiredStmts(); |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
634 decLoops(); |
681 | 635 RequiredKeyword("until"); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
636 Expr cnd = RequiredExpr().single(); |
1665
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
637 int stackEnd = symbolsSize(); |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
638 popSymbols( stackEnd - stackStart ); |
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
639 String repeatVar = "repeat" + ++repeatCounter; |
674 | 640 Stmts stmt = new Stmts(); |
1665
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
641 stmt.add( "boolean "+repeatVar+"; " ); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
642 stmt.add( "do { " ); |
677 | 643 stmt.addAll( loop ); |
1731 | 644 stmt.add( repeatVar+" = Luan.checkBoolean(" ); |
1665
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
645 stmt.addAll( cnd ); |
1731 | 646 stmt.add( "); " ); |
647 stmt.add( "} while( !" ); | |
1665
eb89db694225
fix repeat-until scoping
Franklin Schmidt <fschmidt@gmail.com>
parents:
1645
diff
changeset
|
648 stmt.add( repeatVar ); |
1731 | 649 stmt.add( " ); " ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
650 return parser.success( stmt ); |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
651 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
652 |
674 | 653 private Stmts RequiredLoopBlock() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
654 incLoops(); |
674 | 655 Stmts stmt = RequiredBlock(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
656 decLoops(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
657 return stmt; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
658 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
659 |
674 | 660 private Stmts IfStmt() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
661 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
662 if( !Keyword("if") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
663 return parser.failure(null); |
674 | 664 Stmts stmt = new Stmts(); |
665 Expr cnd; | |
666 Stmts block; | |
684 | 667 boolean hasReturn = true; |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
668 cnd = RequiredExpr().single(); |
681 | 669 RequiredKeyword("then"); |
653
538b0ae08faa
compile IfStmt and BreakStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
652
diff
changeset
|
670 block = RequiredBlock(); |
677 | 671 stmt.add( "if( Luan.checkBoolean(" ); |
672 stmt.addAll( cnd ); | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
673 stmt.add( ") ) { " ); |
677 | 674 stmt.addAll( block ); |
684 | 675 if( !block.hasReturn ) |
676 hasReturn = false; | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
677 while( Keyword("elseif") ) { |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
678 cnd = RequiredExpr().single(); |
681 | 679 RequiredKeyword("then"); |
653
538b0ae08faa
compile IfStmt and BreakStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
652
diff
changeset
|
680 block = RequiredBlock(); |
677 | 681 stmt.add( "} else if( Luan.checkBoolean(" ); |
682 stmt.addAll( cnd ); | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
683 stmt.add( ") ) { " ); |
677 | 684 stmt.addAll( block ); |
684 | 685 if( !block.hasReturn ) |
686 hasReturn = false; | |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
687 } |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
688 if( Keyword("else") ) { |
653
538b0ae08faa
compile IfStmt and BreakStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
652
diff
changeset
|
689 block = RequiredBlock(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
690 stmt.add( "} else { " ); |
677 | 691 stmt.addAll( block ); |
684 | 692 if( !block.hasReturn ) |
693 hasReturn = false; | |
694 } else { | |
695 hasReturn = false; | |
653
538b0ae08faa
compile IfStmt and BreakStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
652
diff
changeset
|
696 } |
1091
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
697 RequiredEnd("end_if"); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
698 stmt.add( "} " ); |
684 | 699 stmt.hasReturn = hasReturn; |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
700 return parser.success( stmt ); |
20
d85510d92eee
add BreakStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
701 } |
d85510d92eee
add BreakStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
702 |
1520 | 703 int catchCounter = 0; |
704 | |
705 private Stmts TryStmt() throws ParseException { | |
706 parser.begin(); | |
707 if( !Keyword("try") ) | |
708 return parser.failure(null); | |
709 Stmts tryBlock = RequiredBlock(); | |
710 Stmts catchBlock = null; | |
711 Stmts finallyBlock = null; | |
712 Stmts stmt = new Stmts(); | |
713 stmt.add( "try { LuanImpl.nopTry(); " ); | |
714 stmt.addAll( tryBlock ); | |
715 if( Keyword("catch") ) { | |
716 String name = Name(); | |
717 Expr exp = new Expr(Val.SINGLE,false); | |
718 String var = "e" + ++catchCounter; | |
719 exp.add( var+".table(luan)" ); | |
720 stmt.add( "} catch(LuanException "+var+") { " ); | |
721 stmt.addAll( addSymbol(name,exp) ); | |
722 catchBlock = RequiredBlock(); | |
723 stmt.addAll( catchBlock ); | |
724 popSymbols(1); | |
725 } | |
726 if( Keyword("finally") ) { | |
727 finallyBlock = RequiredBlock(); | |
728 stmt.add( "} finally { " ); | |
729 stmt.addAll( finallyBlock ); | |
730 } | |
731 RequiredEnd("end_try"); | |
732 if( catchBlock==null && finallyBlock==null ) | |
733 stmt.add( "} finally { " ); | |
734 stmt.add( "} " ); | |
735 stmt.hasReturn = finallyBlock!=null && finallyBlock.hasReturn || tryBlock.hasReturn && (catchBlock==null || catchBlock.hasReturn); | |
736 return parser.success( stmt ); | |
737 } | |
738 | |
674 | 739 private Stmts SetStmt() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
740 parser.begin(); |
660 | 741 List<Var> vars = new ArrayList<Var>(); |
742 Var v = SettableVar(); | |
743 if( v == null ) | |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
744 return parser.failure(null); |
660 | 745 vars.add(v); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
746 while( parser.match( ',' ) ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
747 Spaces(); |
660 | 748 v = SettableVar(); |
749 if( v == null ) | |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
750 return parser.failure(null); |
660 | 751 vars.add(v); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
752 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
753 if( !parser.match( '=' ) ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
754 return parser.failure(null); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
755 Spaces(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
756 Expr values = ExpStringList(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
757 if( values==null ) |
274
8afe9f2fdfec
AB testing, not fully tested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
271
diff
changeset
|
758 // throw parser.exception("Expressions expected"); |
8afe9f2fdfec
AB testing, not fully tested
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
271
diff
changeset
|
759 return parser.failure(null); |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
760 return parser.success( makeSetStmt(vars,values) ); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
761 } |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
762 |
674 | 763 private Stmts makeSetStmt(List<Var> vars,Expr values) throws ParseException { |
660 | 764 int n = vars.size(); |
765 if( n == 1 ) | |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
766 return vars.get(0).set(values); |
674 | 767 Stmts stmt = new Stmts(); |
768 String varName = values.valType==Val.ARRAY ? "a" : "t"; | |
677 | 769 stmt.add( varName + " = " ); |
770 stmt.addAll( values ); | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
771 stmt.add( "; " ); |
674 | 772 Expr t = new Expr(values.valType,false); |
677 | 773 t.add( varName ); |
674 | 774 t = t.single(); |
677 | 775 stmt.addAll( vars.get(0).set(t) ); |
660 | 776 for( int i=1; i<n; i++ ) { |
677 | 777 t.clear(); |
778 t.add( "LuanImpl.pick(" + varName + ","+i+")" ); | |
779 stmt.addAll( vars.get(i).set(t) ); | |
660 | 780 } |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
781 return stmt; |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
782 } |
671 | 783 |
674 | 784 private Stmts makeLocalSetStmt(List<String> names,Expr values) throws ParseException { |
671 | 785 int n = names.size(); |
786 if( n == 1 ) | |
674 | 787 return addSymbol(names.get(0),values.single()); |
788 Stmts stmt = new Stmts(); | |
789 String varName = values.valType==Val.ARRAY ? "a" : "t"; | |
677 | 790 stmt.add( varName + " = " ); |
791 stmt.addAll( values ); | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
792 stmt.add( "; " ); |
674 | 793 Expr t = new Expr(values.valType,false); |
677 | 794 t.add( varName ); |
674 | 795 t = t.single(); |
677 | 796 stmt.addAll( addSymbol(names.get(0),t) ); |
671 | 797 for( int i=1; i<n; i++ ) { |
677 | 798 t.clear(); |
799 t.add( "LuanImpl.pick(" + varName + ","+i+")" ); | |
800 stmt.addAll( addSymbol(names.get(i),t) ); | |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
801 } |
671 | 802 return stmt; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
803 } |
671 | 804 |
674 | 805 private Stmts ExpressionsStmt() throws ParseException { |
1796 | 806 if( parser.test('`') ) |
807 return null; | |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
808 parser.begin(); |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
809 Expr exp = Expression(); |
651
140cc5191b7a
start compiling statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
650
diff
changeset
|
810 if( exp != null && exp.isStmt ) { |
674 | 811 Stmts stmt = new Stmts(); |
812 if( exp.valType==Val.SINGLE ) { | |
677 | 813 stmt.add( "LuanImpl.nop(" ); |
814 stmt.addAll( exp ); | |
815 stmt.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
816 } else { |
677 | 817 stmt.addAll( exp ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
818 } |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
819 stmt.add( "; " ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
820 return parser.success( stmt ); |
651
140cc5191b7a
start compiling statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
650
diff
changeset
|
821 } |
159
0abc9181061a
revert rev 154 but only allow FnCall, AndExpr, or OrExpr in ExpressionsStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
158
diff
changeset
|
822 return parser.failure(null); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
823 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
824 |
660 | 825 private Var SettableVar() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
826 int start = parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
827 Var var = VarZ(); |
660 | 828 if( var==null || !var.isSettable() ) |
155
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
829 return parser.failure(null); |
660 | 830 return parser.success( var ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
831 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
832 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
833 private Expr RequiredExpr() throws ParseException { |
129
486a0641bca4
add pickle client/server;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
128
diff
changeset
|
834 parser.begin(); |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
835 return parser.success(required(Expression(),"Bad expression")); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
836 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
837 |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
838 private Expr Expression() throws ParseException { |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
839 return OrExpr(); |
19
a7c13c6017f7
add GenericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
18
diff
changeset
|
840 } |
a7c13c6017f7
add GenericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
18
diff
changeset
|
841 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
842 private Expr OrExpr() throws ParseException { |
645 | 843 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
844 Expr exp = AndExpr(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
845 if( exp==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
846 return parser.failure(null); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
847 while( Keyword("or") ) { |
674 | 848 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
849 Expr exp2 = required(AndExpr()).single(); |
674 | 850 Expr newExp = new Expr(Val.SINGLE,true); |
677 | 851 newExp.add( "(LuanImpl.cnd(t = " ); |
852 newExp.addAll( exp ); | |
853 newExp.add( ") ? t : (" ); | |
854 newExp.addAll( exp2 ); | |
855 newExp.add( "))" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
856 exp = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
857 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
858 return parser.success(exp); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
859 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
860 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
861 private Expr AndExpr() throws ParseException { |
645 | 862 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
863 Expr exp = RelExpr(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
864 if( exp==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
865 return parser.failure(null); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
866 while( Keyword("and") ) { |
674 | 867 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
868 Expr exp2 = required(RelExpr()).single(); |
674 | 869 Expr newExp = new Expr(Val.SINGLE,true); |
677 | 870 newExp.add( "(LuanImpl.cnd(t = " ); |
871 newExp.addAll( exp ); | |
872 newExp.add( ") ? (" ); | |
873 newExp.addAll( exp2 ); | |
874 newExp.add( ") : t)" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
875 exp = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
876 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
877 return parser.success(exp); |
18
3971113699b8
add NumericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
17
diff
changeset
|
878 } |
3971113699b8
add NumericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
17
diff
changeset
|
879 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
880 private Expr RelExpr() throws ParseException { |
645 | 881 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
882 Expr exp = ConcatExpr(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
883 if( exp==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
884 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
885 while(true) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
886 if( parser.match("==") ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
887 Spaces(); |
674 | 888 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
889 Expr exp2 = required(ConcatExpr()).single(); |
674 | 890 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
891 newExp.add( "LuanImpl.eq(luan," ); |
677 | 892 newExp.addAll( exp ); |
893 newExp.add( "," ); | |
894 newExp.addAll( exp2 ); | |
895 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
896 exp = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
897 } else if( parser.match("~=") ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
898 Spaces(); |
674 | 899 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
900 Expr exp2 = required(ConcatExpr()).single(); |
674 | 901 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
902 newExp.add( "!LuanImpl.eq(luan," ); |
677 | 903 newExp.addAll( exp ); |
904 newExp.add( "," ); | |
905 newExp.addAll( exp2 ); | |
906 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
907 exp = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
908 } else if( parser.match("<=") ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
909 Spaces(); |
674 | 910 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
911 Expr exp2 = required(ConcatExpr()).single(); |
674 | 912 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
913 newExp.add( "LuanImpl.le(luan," ); |
677 | 914 newExp.addAll( exp ); |
915 newExp.add( "," ); | |
916 newExp.addAll( exp2 ); | |
917 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
918 exp = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
919 } else if( parser.match(">=") ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
920 Spaces(); |
674 | 921 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
922 Expr exp2 = required(ConcatExpr()).single(); |
674 | 923 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
924 newExp.add( "LuanImpl.le(luan," ); |
677 | 925 newExp.addAll( exp2 ); |
926 newExp.add( "," ); | |
927 newExp.addAll( exp ); | |
928 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
929 exp = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
930 } else if( parser.match("<") ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
931 Spaces(); |
674 | 932 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
933 Expr exp2 = required(ConcatExpr()).single(); |
674 | 934 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
935 newExp.add( "LuanImpl.lt(luan," ); |
677 | 936 newExp.addAll( exp ); |
937 newExp.add( "," ); | |
938 newExp.addAll( exp2 ); | |
939 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
940 exp = newExp; |
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
941 } else if( parser.match(">") ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
942 Spaces(); |
674 | 943 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
944 Expr exp2 = required(ConcatExpr()).single(); |
674 | 945 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
946 newExp.add( "LuanImpl.lt(luan," ); |
677 | 947 newExp.addAll( exp2 ); |
948 newExp.add( "," ); | |
949 newExp.addAll( exp ); | |
950 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
951 exp = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
952 } else |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
953 break; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
954 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
955 return parser.success(exp); |
42
786699c78837
implement try-catch
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
40
diff
changeset
|
956 } |
786699c78837
implement try-catch
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
40
diff
changeset
|
957 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
958 private Expr ConcatExpr() throws ParseException { |
645 | 959 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
960 Expr exp = SumExpr(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
961 if( exp==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
962 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
963 if( parser.match("..") ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
964 Spaces(); |
674 | 965 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
966 Expr exp2 = required(ConcatExpr()).single(); |
674 | 967 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
968 newExp.add( "LuanImpl.concat(luan," ); |
677 | 969 newExp.addAll( exp ); |
970 newExp.add( "," ); | |
971 newExp.addAll( exp2 ); | |
972 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
973 exp = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
974 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
975 return parser.success(exp); |
28
df923e5835b2
fix local initial assignment
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
26
diff
changeset
|
976 } |
df923e5835b2
fix local initial assignment
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
26
diff
changeset
|
977 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
978 private Expr SumExpr() throws ParseException { |
645 | 979 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
980 Expr exp = TermExpr(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
981 if( exp==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
982 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
983 while(true) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
984 if( parser.match('+') ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
985 Spaces(); |
674 | 986 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
987 Expr exp2 = required(TermExpr()).single(); |
674 | 988 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
989 newExp.add( "LuanImpl.add(luan," ); |
677 | 990 newExp.addAll( exp ); |
991 newExp.add( "," ); | |
992 newExp.addAll( exp2 ); | |
993 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
994 exp = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
995 } else if( Minus() ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
996 Spaces(); |
674 | 997 exp = exp.single(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
998 Expr exp2 = required(TermExpr()).single(); |
674 | 999 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
1000 newExp.add( "LuanImpl.sub(luan," ); |
677 | 1001 newExp.addAll( exp ); |
1002 newExp.add( "," ); | |
1003 newExp.addAll( exp2 ); | |
1004 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1005 exp = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1006 } else |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1007 break; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1008 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1009 return parser.success(exp); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1010 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1011 |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1012 private boolean Minus() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1013 parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1014 return parser.match('-') && !parser.match('-') ? parser.success() : parser.failure(); |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1015 } |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1016 |
1681 | 1017 private Expr TermExpr(Expr exp,String op) throws ParseException { |
1018 Spaces(); | |
1019 exp = exp.single(); | |
1020 Expr exp2 = required(UnaryExpr()).single(); | |
1021 Expr newExp = new Expr(Val.SINGLE,false); | |
1022 newExp.add( "LuanImpl." + op + "(luan," ); | |
1023 newExp.addAll( exp ); | |
1024 newExp.add( "," ); | |
1025 newExp.addAll( exp2 ); | |
1026 newExp.add( ")" ); | |
1027 return newExp; | |
1028 } | |
1029 | |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1030 private Expr TermExpr() throws ParseException { |
645 | 1031 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1032 Expr exp = UnaryExpr(); |
650
d658eab7bf4c
finish compiling operators
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
1033 if( exp==null ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1034 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1035 while(true) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1036 if( parser.match('*') ) { |
1681 | 1037 exp = TermExpr(exp,"mul"); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1038 } else if( parser.match('/') ) { |
1680 | 1039 if( parser.match('/') ) { |
1681 | 1040 exp = TermExpr(exp,"idiv"); |
1680 | 1041 } else { |
1681 | 1042 exp = TermExpr(exp,"div"); |
1680 | 1043 } |
107
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1044 } else if( Mod() ) { |
1681 | 1045 exp = TermExpr(exp,"mod"); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1046 } else |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1047 break; |
17
09d41f7490a8
add local variables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
16
diff
changeset
|
1048 } |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1049 return parser.success(exp); |
17
09d41f7490a8
add local variables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
16
diff
changeset
|
1050 } |
09d41f7490a8
add local variables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
16
diff
changeset
|
1051 |
107
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1052 private boolean Mod() { |
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1053 parser.begin(); |
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1054 return parser.match('%') && !parser.match('>') ? parser.success() : parser.failure(); |
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1055 } |
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1056 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1057 private Expr UnaryExpr() throws ParseException { |
645 | 1058 parser.begin(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1059 if( parser.match('#') ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1060 Spaces(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1061 Expr exp = required(UnaryExpr()).single(); |
674 | 1062 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
1063 newExp.add( "LuanImpl.len(luan," ); |
677 | 1064 newExp.addAll( exp ); |
1065 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1066 return parser.success(newExp); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1067 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1068 if( Minus() ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1069 Spaces(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1070 Expr exp = required(UnaryExpr()).single(); |
674 | 1071 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
1072 newExp.add( "LuanImpl.unm(luan," ); |
677 | 1073 newExp.addAll( exp ); |
1074 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1075 return parser.success(newExp); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1076 } |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1077 if( Keyword("not") ) { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1078 Spaces(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1079 Expr exp = required(UnaryExpr()).single(); |
674 | 1080 Expr newExp = new Expr(Val.SINGLE,false); |
677 | 1081 newExp.add( "!Luan.checkBoolean(" ); |
1082 newExp.addAll( exp ); | |
1083 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1084 return parser.success(newExp); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1085 } |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1086 Expr exp = PowExpr(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1087 if( exp==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1088 return parser.failure(null); |
650
d658eab7bf4c
finish compiling operators
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
1089 return parser.success(exp); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1090 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1091 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1092 private Expr PowExpr() throws ParseException { |
645 | 1093 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1094 Expr exp1 = SingleExpr(); |
657 | 1095 if( exp1==null ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1096 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1097 if( parser.match('^') ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1098 Spaces(); |
1496 | 1099 Expr exp2 = required(UnaryExpr()); |
674 | 1100 Expr newExp = new Expr(Val.SINGLE,false); |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
1101 newExp.add( "LuanImpl.pow(luan," ); |
677 | 1102 newExp.addAll( exp1.single() ); |
1103 newExp.add( "," ); | |
1104 newExp.addAll( exp2.single() ); | |
1105 newExp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1106 exp1 = newExp; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1107 } |
650
d658eab7bf4c
finish compiling operators
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
1108 return parser.success(exp1); |
14
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
1109 } |
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
1110 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1111 private Expr SingleExpr() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1112 parser.begin(); |
681 | 1113 Expr exp = FunctionExpr(); |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1114 if( exp != null ) |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1115 return parser.success(exp); |
1796 | 1116 exp = BacktickExpr(); |
1117 if( exp != null ) | |
1118 return parser.success(exp); | |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1119 exp = VarExp(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1120 if( exp != null ) |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1121 return parser.success(exp); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1122 exp = VarArgs(); |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1123 if( exp != null ) |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1124 return parser.success(exp); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1125 return parser.failure(null); |
14
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
1126 } |
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
1127 |
1796 | 1128 private Expr BacktickExpr() throws ParseException { |
1129 if( !parser.match('`') ) | |
1130 return null; | |
1131 Spaces(); | |
1132 frame = new Frame(frame); | |
1133 Stmts stmt = new Stmts(); | |
1134 stmt.add( "LuanTable Io = (LuanTable)luan.require(\"luan:Io.luan\"); " ); | |
1135 stmt.add( "Object stdout = Io.get(luan,\"stdout\"); " ); | |
1136 stmt.add( "LuanStringWriter lsw = new LuanStringWriter(); " ); | |
1137 stmt.add( "Io.put(luan,\"stdout\",lsw); " ); | |
1138 stmt.add( "try { " ); | |
1139 Stmts block = RequiredBlock(); | |
1140 stmt.addAll( block ); | |
1141 RequiredMatch('`'); | |
1142 stmt.add( "} finally { " ); | |
1143 stmt.add( "Io.put(luan,\"stdout\",stdout); " ); | |
1144 stmt.add( "} " ); | |
1145 stmt.add( "return lsw.out().toString(); " ); | |
1146 stmt.hasReturn = true; | |
1147 Expr fnDef = newFnExp(stmt,null); | |
1148 Expr exp = new Expr(Val.SINGLE,true); | |
1149 exp.addAll( fnDef ); | |
1150 exp.add( ".call(luan)" ); | |
1151 frame = frame.parent; | |
1803 | 1152 Spaces(); |
1796 | 1153 return exp; |
1154 } | |
1155 | |
681 | 1156 private Expr FunctionExpr() throws ParseException { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1157 if( !Keyword("function") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1158 return null; |
681 | 1159 return RequiredFunction(null); |
20
d85510d92eee
add BreakStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
1160 } |
d85510d92eee
add BreakStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
19
diff
changeset
|
1161 |
681 | 1162 private Expr RequiredFunction(String name) throws ParseException { |
678 | 1163 parser.begin(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1164 RequiredMatch('('); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1165 Spaces(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1166 frame = new Frame(frame); |
674 | 1167 Stmts stmt = new Stmts(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1168 List<String> names = NameList(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1169 if( names != null ) { |
1089
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1170 /* |
674 | 1171 Expr args = new Expr(Val.ARRAY,false); |
677 | 1172 args.add( "args" ); |
1173 stmt.addAll( makeLocalSetStmt(names,args) ); | |
1089
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1174 */ |
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1175 int n = names.size(); |
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1176 Expr t = new Expr(Val.SINGLE,false); |
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1177 for( int i=0; i<n; i++ ) { |
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1178 t.clear(); |
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1179 t.add( "LuanImpl.pick(args,"+i+")" ); |
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1180 stmt.addAll( addSymbol(names.get(i),t) ); |
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1181 } |
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1182 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1183 if( parser.match(',') ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1184 Spaces(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1185 if( !parser.match("...") ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1186 throw parser.exception(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1187 Spaces(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1188 frame.isVarArg = true; |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1189 stmt.add( "final Object[] varArgs = LuanImpl.varArgs(args," + names.size() + "); " ); |
1089
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1190 } else { |
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1191 stmt.add( "LuanImpl.noMore(args,"+n+"); " ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1192 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1193 } else if( parser.match("...") ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1194 Spaces(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1195 frame.isVarArg = true; |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1196 stmt.add( "final Object[] varArgs = LuanImpl.varArgs(args,0); " ); |
1089
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1197 } else { |
894786a03d22
check for too many arguments
Franklin Schmidt <fschmidt@gmail.com>
parents:
785
diff
changeset
|
1198 stmt.add( "LuanImpl.noMore(args,0); " ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1199 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1200 RequiredMatch(')'); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1201 Spaces(); |
674 | 1202 Stmts block = RequiredBlock(); |
677 | 1203 stmt.addAll( block ); |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1204 stmt.hasReturn = block.hasReturn; |
681 | 1205 Expr fnDef = newFnExp(stmt,name); |
1560
33a53c43e2f7
handle unreachable statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1542
diff
changeset
|
1206 if( !Keyword("end") && !Keyword("end_function") ) { |
33a53c43e2f7
handle unreachable statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1542
diff
changeset
|
1207 if( stmt.hasReturn && !parser.endOfInput() ) { |
33a53c43e2f7
handle unreachable statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1542
diff
changeset
|
1208 throw parser.exception("unreachable statement"); |
33a53c43e2f7
handle unreachable statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1542
diff
changeset
|
1209 } else { |
33a53c43e2f7
handle unreachable statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1542
diff
changeset
|
1210 throw parser.exception("'end_function' or 'end' expected"); |
33a53c43e2f7
handle unreachable statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1542
diff
changeset
|
1211 } |
33a53c43e2f7
handle unreachable statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1542
diff
changeset
|
1212 } |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1213 frame = frame.parent; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1214 return parser.success(fnDef); |
11
b7d7069fee58
add assignment statement and CmdLine
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
9
diff
changeset
|
1215 } |
b7d7069fee58
add assignment statement and CmdLine
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
9
diff
changeset
|
1216 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1217 private Expr VarArgs() throws ParseException { |
645 | 1218 parser.begin(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1219 if( !frame.isVarArg || !parser.match("...") ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1220 return parser.failure(null); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1221 Spaces(); |
674 | 1222 Expr exp = new Expr(Val.ARRAY,false); |
677 | 1223 exp.add("varArgs"); |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1224 return parser.success(exp); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1225 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1226 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1227 private Expr TableExpr() throws ParseException { |
645 | 1228 parser.begin(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1229 if( !parser.match('{') ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1230 return parser.failure(null); |
682 | 1231 Expr tblExp = new Expr(Val.SINGLE,false); |
1562 | 1232 tblExp.add( "LuanImpl.table(" ); |
682 | 1233 Expr lastExp = tblExp; |
1234 List<Expr> builder = new ArrayList<Expr>(); | |
1235 do { | |
1236 Spaces(); lastExp.addNewLines(); | |
1237 Expr exp = Field(); | |
1238 if( exp != null ) { | |
1239 builder.add(exp); | |
1240 lastExp = exp; | |
1241 Spaces(); lastExp.addNewLines(); | |
1242 } | |
1243 } while( FieldSep() ); | |
107
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1244 if( !parser.match('}') ) |
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1245 throw parser.exception("Expected table element or '}'"); |
682 | 1246 tblExp.addAll( expString(builder).array() ); |
1247 tblExp.add( ")" ); | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1248 Spaces(); |
682 | 1249 tblExp.addNewLines(); |
1250 return parser.success( tblExp ); | |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1251 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1252 |
604
b73f005f3735
table constructor now uses end_of_line as a delimiter
Franklin Schmidt <fschmidt@gmail.com>
parents:
584
diff
changeset
|
1253 private boolean FieldSep() throws ParseException { |
b73f005f3735
table constructor now uses end_of_line as a delimiter
Franklin Schmidt <fschmidt@gmail.com>
parents:
584
diff
changeset
|
1254 return parser.anyOf(",;") || EndOfLine(); |
14
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
1255 } |
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
1256 |
682 | 1257 private Expr Field() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1258 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1259 Expr exp = SubExpr(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1260 if( exp==null ) |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1261 exp = NameExpr(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1262 if( exp!=null && parser.match('=') ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1263 Spaces(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1264 Expr val = RequiredExpr().single(); |
674 | 1265 Expr newExp = new Expr(Val.SINGLE,false); |
677 | 1266 newExp.add( "new TableField(" ); |
1267 newExp.addAll( exp ); | |
1268 newExp.add( "," ); | |
1269 newExp.addAll( val ); | |
1270 newExp.add( ")" ); | |
682 | 1271 return parser.success(newExp); |
17
09d41f7490a8
add local variables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
16
diff
changeset
|
1272 } |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1273 parser.rollback(); |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
1274 Expr exprs = Expression(); |
154
c2e5101682ae
Expr extends Expressions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
153
diff
changeset
|
1275 if( exprs != null ) { |
682 | 1276 return parser.success(exprs); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1277 } |
682 | 1278 return parser.failure(null); |
7
bca8fc5d928b
work on expressions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
6
diff
changeset
|
1279 } |
bca8fc5d928b
work on expressions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
6
diff
changeset
|
1280 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1281 private Expr VarExp() throws ParseException { |
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1282 Var var = VarZ(); |
656 | 1283 return var==null ? null : var.exp(); |
8
8896068e0a4b
finish operators
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
7
diff
changeset
|
1284 } |
8896068e0a4b
finish operators
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
7
diff
changeset
|
1285 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1286 private Var VarZ() throws ParseException { |
645 | 1287 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1288 Var var = VarStart(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1289 if( var==null ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1290 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1291 Var var2; |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1292 while( (var2=Var2(var.exp())) != null ) { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1293 var = var2; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1294 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1295 return parser.success(var); |
7
bca8fc5d928b
work on expressions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
6
diff
changeset
|
1296 } |
bca8fc5d928b
work on expressions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
6
diff
changeset
|
1297 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1298 private Var VarStart() throws ParseException { |
206
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1299 if( parser.match('(') ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1300 Spaces(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1301 Expr exp = RequiredExpr().single(); |
206
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1302 RequiredMatch(')'); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1303 Spaces(); |
206
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1304 return exprVar(exp); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1305 } |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1306 String name = Name(); |
206
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1307 if( name != null ) |
645 | 1308 return nameVar(name); |
674 | 1309 Expr exp; |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1310 exp = TableExpr(); |
206
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1311 if( exp != null ) |
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1312 return exprVar(exp); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1313 exp = Literal(); |
206
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1314 if( exp != null ) |
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1315 return exprVar(exp); |
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1316 return null; |
21
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
1317 } |
c93d8c781853
add functions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
20
diff
changeset
|
1318 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1319 private Var Var2(Expr exp1) throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1320 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1321 Expr exp2 = SubExpr(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1322 if( exp2 != null ) |
656 | 1323 return parser.success(indexVar(exp1,exp2)); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1324 if( parser.match('.') ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1325 Spaces(); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1326 exp2 = NameExpr(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1327 if( exp2!=null ) |
656 | 1328 return parser.success(indexVar(exp1,exp2)); |
636 | 1329 return parser.failure(null); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1330 } |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1331 Expr fnCall = Args( exp1, new ArrayList<Expr>() ); |
206
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1332 if( fnCall != null ) |
77365c9fdfe4
remove -> operator
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
203
diff
changeset
|
1333 return parser.success(exprVar(fnCall)); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1334 return parser.failure(null); |
9
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
1335 } |
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
1336 |
503 | 1337 private interface Var { |
674 | 1338 public Expr exp() throws ParseException; |
660 | 1339 // public Settable settable() throws ParseException; |
1340 public boolean isSettable(); | |
674 | 1341 public Stmts set(Expr val) throws ParseException; |
503 | 1342 } |
1343 | |
674 | 1344 private Expr env() { |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1345 Sym sym = getSym("_ENV"); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1346 if( sym != null ) |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1347 return sym.exp(); |
503 | 1348 return null; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1349 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1350 |
645 | 1351 private Var nameVar(final String name) { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1352 return new Var() { |
1096 | 1353 private Expr exp = null; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1354 |
674 | 1355 public Expr exp() throws ParseException { |
1096 | 1356 if( exp == null ) { |
1357 String sp = parser.sb().toString(); | |
1358 parser.sb().setLength(0); | |
1359 exp = calcExp(); | |
1360 if( sp.length() > 0 ) | |
1361 exp.add(sp); | |
1362 } | |
1363 return exp; | |
1364 } | |
1365 | |
1366 private Expr calcExp() throws ParseException { | |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1367 Sym sym = getSym(name); |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1368 if( sym != null ) |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1369 return sym.exp(); |
674 | 1370 Expr envExpr = env(); |
503 | 1371 if( envExpr != null ) |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1372 return indexExpStr( envExpr, constExpStr(name) ); |
503 | 1373 parser.failure(null); |
1374 throw parser.exception("name '"+name+"' not defined"); | |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1375 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1376 |
660 | 1377 public boolean isSettable() { |
1378 return true; | |
1379 } | |
674 | 1380 |
1381 public Stmts set(Expr val) throws ParseException { | |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1382 Sym sym = getSym(name); |
1561 | 1383 if( sym != null ) |
1384 return sym.set(val); | |
1385 Expr envExpr = env(); | |
670
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1386 if( envExpr != null ) |
58ebfec6178b
all luan now compiles
Franklin Schmidt <fschmidt@gmail.com>
parents:
669
diff
changeset
|
1387 return indexVar( envExpr, constExpStr(name) ).set(val); |
687 | 1388 parser.failure(null); |
1389 throw parser.exception("name '"+name+"' not defined"); | |
660 | 1390 } |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1391 }; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1392 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1393 |
674 | 1394 private Var exprVar(final Expr expr) { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1395 return new Var() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1396 |
674 | 1397 public Expr exp() { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1398 return expr; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1399 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1400 |
660 | 1401 public boolean isSettable() { |
1402 return false; | |
1403 } | |
1404 | |
674 | 1405 public Stmts set(Expr val) { |
660 | 1406 throw new RuntimeException(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1407 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1408 }; |
11
b7d7069fee58
add assignment statement and CmdLine
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
9
diff
changeset
|
1409 } |
b7d7069fee58
add assignment statement and CmdLine
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
9
diff
changeset
|
1410 |
674 | 1411 private Var indexVar(final Expr table,final Expr key) { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1412 return new Var() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1413 |
674 | 1414 public Expr exp() { |
656 | 1415 return indexExpStr( table, key ); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1416 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1417 |
660 | 1418 public boolean isSettable() { |
1419 return true; | |
1420 } | |
674 | 1421 |
1422 public Stmts set(Expr val) { | |
1423 Stmts stmt = new Stmts(); | |
677 | 1424 stmt.add( "LuanImpl.put(luan," ); |
1425 stmt.addAll( table.single() ); | |
1426 stmt.add( "," ); | |
1427 stmt.addAll( key.single() ); | |
1428 stmt.add( "," ); | |
1429 stmt.addAll( val.single() ); | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1430 stmt.add( "); " ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1431 return stmt; |
660 | 1432 } |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1433 }; |
9
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
1434 } |
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
1435 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1436 private Expr Args(Expr fn,List<Expr> builder) throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1437 parser.begin(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1438 return args(builder) |
656 | 1439 ? parser.success( callExpStr( fn, expString(builder) ) ) |
674 | 1440 : parser.failure((Expr)null); |
107
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1441 } |
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1442 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1443 private boolean args(List<Expr> builder) throws ParseException { |
645 | 1444 parser.begin(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1445 if( parser.match('(') ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1446 Spaces(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1447 ExpList(builder); // optional |
107
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1448 if( !parser.match(')') ) |
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1449 throw parser.exception("Expression or ')' expected"); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1450 Spaces(); |
1093
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1451 parser.upSb(); |
195
24ede40ee0aa
make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
193
diff
changeset
|
1452 return parser.success(); |
107
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1453 } |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1454 Expr exp = TableExpr(); |
107
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1455 if( exp != null ) { |
655 | 1456 builder.add(exp); |
195
24ede40ee0aa
make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
193
diff
changeset
|
1457 return parser.success(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1458 } |
714 | 1459 exp = StringLiteral(); |
1460 if( exp != null ) { | |
1461 builder.add(exp); | |
195
24ede40ee0aa
make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
193
diff
changeset
|
1462 return parser.success(); |
107
dbf459397217
change OutputStatement to JspExpressions;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
106
diff
changeset
|
1463 } |
195
24ede40ee0aa
make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
193
diff
changeset
|
1464 return parser.failure(); |
11
b7d7069fee58
add assignment statement and CmdLine
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
9
diff
changeset
|
1465 } |
b7d7069fee58
add assignment statement and CmdLine
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
9
diff
changeset
|
1466 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1467 private Expr ExpStringList() throws ParseException { |
674 | 1468 List<Expr> builder = new ArrayList<Expr>(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1469 return ExpList(builder) ? expString(builder) : null; |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
1470 } |
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
1471 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1472 private boolean ExpList(List<Expr> builder) throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1473 parser.begin(); |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
1474 Expr exp = Expression(); |
654 | 1475 if( exp==null ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1476 return parser.failure(); |
700 | 1477 exp.addNewLines(); |
654 | 1478 builder.add(exp); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1479 while( parser.match(',') ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1480 Spaces(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1481 exp = RequiredExpr(); |
1093
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1482 exp.prependNewLines(); |
700 | 1483 builder.add(exp); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1484 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1485 return parser.success(); |
9
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
1486 } |
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
1487 |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1488 private Expr SubExpr() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1489 parser.begin(); |
1796 | 1490 if( !parser.match('[') || parser.test('[') || parser.test('=') ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1491 return parser.failure(null); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1492 Spaces(); |
1384
f5368cd8c056
remove template expressions and String.concat
Franklin Schmidt <fschmidt@gmail.com>
parents:
1335
diff
changeset
|
1493 Expr exp = RequiredExpr().single(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1494 RequiredMatch(']'); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1495 Spaces(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1496 return parser.success(exp); |
11
b7d7069fee58
add assignment statement and CmdLine
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
9
diff
changeset
|
1497 } |
b7d7069fee58
add assignment statement and CmdLine
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
9
diff
changeset
|
1498 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1499 private Expr NameExpr() throws ParseException { |
645 | 1500 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1501 String name = Name(); |
195
24ede40ee0aa
make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
193
diff
changeset
|
1502 if( name==null ) |
24ede40ee0aa
make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
193
diff
changeset
|
1503 return parser.failure(null); |
656 | 1504 return parser.success(constExpStr(name)); |
54
f5b27ef14d73
add OutputStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
51
diff
changeset
|
1505 } |
f5b27ef14d73
add OutputStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
51
diff
changeset
|
1506 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1507 private String RequiredName() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1508 parser.begin(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1509 String name = Name(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1510 if( name==null ) |
139
3b384dc5ca91
replace WebShell.java with web_shell.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
137
diff
changeset
|
1511 throw parser.exception("Name expected"); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1512 return parser.success(name); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1513 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1514 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1515 private String Name() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1516 int start = parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1517 if( !NameFirstChar() ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1518 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1519 while( NameChar() ); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1520 String match = parser.textFrom(start); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1521 if( keywords.contains(match) ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1522 return parser.failure(null); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1523 Spaces(); |
1096 | 1524 parser.upSb(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1525 return parser.success(match); |
17
09d41f7490a8
add local variables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
16
diff
changeset
|
1526 } |
09d41f7490a8
add local variables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
16
diff
changeset
|
1527 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1528 private boolean NameChar() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1529 return NameFirstChar() || Digit(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1530 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1531 |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1532 private boolean NameFirstChar() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1533 return parser.inCharRange('a', 'z') || parser.inCharRange('A', 'Z') || parser.match('_'); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1534 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1535 |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1536 private void RequiredMatch(char c) throws ParseException { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1537 if( !parser.match(c) ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1538 throw parser.exception("'"+c+"' expected"); |
9
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
1539 } |
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
1540 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1541 private void RequiredMatch(String s) throws ParseException { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1542 if( !parser.match(s) ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1543 throw parser.exception("'"+s+"' expected"); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1544 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1545 |
1091
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
1546 private void RequiredEnd(String keyword) throws ParseException { |
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
1547 if( !Keyword("end") && !Keyword(keyword) ) |
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
1548 throw parser.exception("'"+keyword+"' or 'end' expected"); |
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
1549 } |
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
1550 |
681 | 1551 private void RequiredKeyword(String keyword) throws ParseException { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1552 if( !Keyword(keyword) ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1553 throw parser.exception("'"+keyword+"' expected"); |
9
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
1554 } |
600676034a1a
add variables and tables
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
8
diff
changeset
|
1555 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1556 private boolean Keyword(String keyword) throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1557 parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1558 if( !parser.match(keyword) || NameChar() ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1559 return parser.failure(); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1560 Spaces(); |
1093
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1561 parser.upSb(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1562 return parser.success(); |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1563 } |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1564 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1565 private static final Set<String> keywords = new HashSet<String>(Arrays.asList( |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1566 "and", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1567 "break", |
1520 | 1568 "catch", |
1131
46732cc0ab87
add continue statement
Franklin Schmidt <fschmidt@gmail.com>
parents:
1096
diff
changeset
|
1569 "continue", |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1570 "do", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1571 "else", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1572 "elseif", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1573 "end", |
1091
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
1574 "end_do", |
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
1575 "end_for", |
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
1576 "end_function", |
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
1577 "end_if", |
1520 | 1578 "end_try", |
1091
20d5968e65cc
add end_do, end_for, end_function, end_if, end_while
Franklin Schmidt <fschmidt@gmail.com>
parents:
1089
diff
changeset
|
1579 "end_while", |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1580 "false", |
1520 | 1581 "finally", |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1582 "for", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1583 "function", |
1645 | 1584 // "goto", |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1585 "if", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1586 "in", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1587 "local", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1588 "nil", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1589 "not", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1590 "or", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1591 "repeat", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1592 "return", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1593 "then", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1594 "true", |
1645 | 1595 "try", |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1596 "until", |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1597 "while" |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1598 )); |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1599 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1600 private Expr Literal() throws ParseException { |
645 | 1601 parser.begin(); |
1093
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1602 Expr exp = new Expr(Val.SINGLE,false); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1603 if( NilLiteral() ) { |
677 | 1604 exp.add( "null" ); |
1093
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1605 exp.addNewLines(); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1606 return parser.success(exp); |
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1607 } |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1608 Boolean b = BooleanLiteral(); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1609 if( b != null ) { |
677 | 1610 exp.add( b.toString() ); |
1093
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1611 exp.addNewLines(); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1612 return parser.success(exp); |
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1613 } |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1614 Number n = NumberLiteral(); |
657 | 1615 if( n != null ) { |
1616 String s = n.toString(); | |
1617 if( n instanceof Long ) | |
1618 s += "L"; | |
677 | 1619 exp.add( s ); |
1093
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1620 exp.addNewLines(); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1621 return parser.success(exp); |
657 | 1622 } |
714 | 1623 Expr s = StringLiteral(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1624 if( s != null ) |
714 | 1625 return parser.success(s); |
195
24ede40ee0aa
make MetatableGetter DeepCloneable, scoped, and secure
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
193
diff
changeset
|
1626 return parser.failure(null); |
5
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1627 } |
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1628 |
684 | 1629 private static int STR_LIM = 65000; |
1630 | |
674 | 1631 private Expr constExpStr(String s) { |
664 | 1632 s = s |
1633 .replace("\\","\\\\") | |
1634 .replace("\"","\\\"") | |
1635 .replace("\n","\\n") | |
1636 .replace("\r","\\r") | |
1637 .replace("\t","\\t") | |
1638 .replace("\b","\\b") | |
1639 ; | |
684 | 1640 if( s.length() > STR_LIM ) { |
1641 int len = s.length(); | |
1642 StringBuilder sb = new StringBuilder(); | |
1643 sb.append( "LuanImpl.strconcat(" ); | |
1644 int start = 0; | |
1645 while(true) { | |
1646 int end = start + STR_LIM; | |
1647 if( end >= len ) | |
1648 break; | |
1649 sb.append( "\"" ).append( s.substring(start,end) ).append( "\"," ); | |
1650 start = end; | |
1651 } | |
1652 sb.append( "\"" ).append( s.substring(start) ).append( "\")" ); | |
1653 s = sb.toString(); | |
1654 } else | |
1655 s = "\"" + s + "\""; | |
674 | 1656 Expr exp = new Expr(Val.SINGLE,false); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1657 exp.add( s ); |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1658 return exp; |
664 | 1659 } |
1660 | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1661 private boolean NilLiteral() throws ParseException { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1662 return Keyword("nil"); |
65
1ff53a88579a
multi-line statements
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
60
diff
changeset
|
1663 } |
1ff53a88579a
multi-line statements
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
60
diff
changeset
|
1664 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1665 private Boolean BooleanLiteral() throws ParseException { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1666 if( Keyword("true") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1667 return true; |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1668 if( Keyword("false") ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1669 return false; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1670 return null; |
5
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1671 } |
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1672 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1673 private Number NumberLiteral() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1674 parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1675 Number n; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1676 if( parser.matchIgnoreCase("0x") ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1677 n = HexNumber(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1678 } else { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1679 n = DecNumber(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1680 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1681 if( n==null || NameChar() ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1682 return parser.failure(null); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1683 Spaces(); |
1093
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1684 parser.upSb(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1685 return parser.success(n); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1686 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1687 |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1688 private Number DecNumber() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1689 int start = parser.begin(); |
535
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1690 boolean isInt = true; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1691 if( Int() ) { |
535
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1692 if( parser.match('.') ) { |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1693 isInt = false; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1694 Int(); // optional |
535
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1695 } |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1696 } else if( parser.match('.') && Int() ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1697 // ok |
535
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1698 isInt = false; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1699 } else |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1700 return parser.failure(null); |
535
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1701 if( Exponent() ) // optional |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1702 isInt = false; |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1703 String s = parser.textFrom(start); |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1704 if( isInt ) { |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1705 try { |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1706 return parser.success(Integer.valueOf(s)); |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1707 } catch(NumberFormatException e) {} |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1708 try { |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1709 return parser.success(Long.valueOf(s)); |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1710 } catch(NumberFormatException e) {} |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1711 } |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1712 return parser.success(Double.valueOf(s)); |
5
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1713 } |
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1714 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1715 private boolean Exponent() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1716 parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1717 if( !parser.matchIgnoreCase("e") ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1718 return parser.failure(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1719 parser.anyOf("+-"); // optional |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1720 if( !Int() ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1721 return parser.failure(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1722 return parser.success(); |
5
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1723 } |
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1724 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1725 private boolean Int() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1726 if( !Digit() ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1727 return false; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1728 while( Digit() ); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1729 return true; |
5
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1730 } |
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
1731 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1732 private boolean Digit() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1733 return parser.inCharRange('0', '9'); |
16
2a30281ef47c
finish number literals;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
15
diff
changeset
|
1734 } |
2a30281ef47c
finish number literals;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
15
diff
changeset
|
1735 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1736 private Number HexNumber() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1737 int start = parser.begin(); |
535
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1738 long nLong = 0; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1739 double n; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1740 if( HexInt() ) { |
535
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1741 nLong = Long.parseLong(parser.textFrom(start),16); |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1742 n = (double)nLong; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1743 if( parser.match('.') ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1744 start = parser.currentIndex(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1745 if( HexInt() ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1746 String dec = parser.textFrom(start); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1747 n += (double)Long.parseLong(dec,16) / Math.pow(16,dec.length()); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1748 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1749 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1750 } else if( parser.match('.') && HexInt() ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1751 String dec = parser.textFrom(start+1); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1752 n = (double)Long.parseLong(dec,16) / Math.pow(16,dec.length()); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1753 } else { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1754 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1755 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1756 if( parser.matchIgnoreCase("p") ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1757 parser.anyOf("+-"); // optional |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1758 start = parser.currentIndex(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1759 if( !HexInt() ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1760 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1761 n *= Math.pow(2,(double)Long.parseLong(parser.textFrom(start))); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1762 } |
535
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1763 if( nLong == n ) { |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1764 int nInt = (int)nLong; |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1765 if( nInt == nLong ) |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1766 return parser.success(Integer.valueOf(nInt)); |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1767 return parser.success(Long.valueOf(nLong)); |
289908469e02
parse numeric constants to ints or longs if possible
Franklin Schmidt <fschmidt@gmail.com>
parents:
534
diff
changeset
|
1768 } |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1769 return parser.success(Double.valueOf(n)); |
16
2a30281ef47c
finish number literals;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
15
diff
changeset
|
1770 } |
2a30281ef47c
finish number literals;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
15
diff
changeset
|
1771 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1772 private boolean HexInt() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1773 if( !HexDigit() ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1774 return false; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1775 while( HexDigit() ); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1776 return true; |
16
2a30281ef47c
finish number literals;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
15
diff
changeset
|
1777 } |
2a30281ef47c
finish number literals;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
15
diff
changeset
|
1778 |
2a30281ef47c
finish number literals;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
15
diff
changeset
|
1779 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1780 private boolean HexDigit() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1781 return Digit() || parser.anyOf("abcdefABCDEF"); |
6
a315783c9524
more parsing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
5
diff
changeset
|
1782 } |
a315783c9524
more parsing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
5
diff
changeset
|
1783 |
714 | 1784 private Expr StringLiteral() throws ParseException { |
1785 Expr s; | |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1786 if( (s=QuotedString('"'))==null |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1787 && (s=QuotedString('\''))==null |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1788 && (s=LongString())==null |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1789 ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1790 return null; |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1791 Spaces(); |
1093
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1792 s.addNewLines(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1793 return s; |
16
2a30281ef47c
finish number literals;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
15
diff
changeset
|
1794 } |
2a30281ef47c
finish number literals;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
15
diff
changeset
|
1795 |
714 | 1796 private Expr LongString() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1797 parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1798 if( !parser.match('[') ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1799 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1800 int start = parser.currentIndex(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1801 while( parser.match('=') ); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1802 int nEquals = parser.currentIndex() - start; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1803 if( !parser.match('[') ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1804 return parser.failure(null); |
714 | 1805 EndOfLine(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1806 start = parser.currentIndex(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1807 while( !LongBracketsEnd(nEquals) ) { |
714 | 1808 if( !(EndOfLine() || parser.anyChar()) ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1809 throw parser.exception("Unclosed long string"); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1810 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1811 String s = parser.text.substring( start, parser.currentIndex() - nEquals - 2 ); |
714 | 1812 String rtns = parser.sb().toString(); |
1813 parser.sb().setLength(0); | |
1814 Expr exp = constExpStr(s); | |
1815 if( rtns.length() > 0 ) | |
1816 exp.add(rtns); | |
1817 return parser.success(exp); | |
6
a315783c9524
more parsing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
5
diff
changeset
|
1818 } |
a315783c9524
more parsing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
5
diff
changeset
|
1819 |
714 | 1820 private Expr QuotedString(char quote) throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1821 parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1822 if( !parser.match(quote) ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1823 return parser.failure(null); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1824 StringBuilder buf = new StringBuilder(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1825 while( !parser.match(quote) ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1826 Character c = EscSeq(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1827 if( c != null ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1828 buf.append(c); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1829 } else { |
271
82a3ebcfbafa
add internal tests
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
260
diff
changeset
|
1830 if( parser.test('\r') || parser.test('\n') || !parser.anyChar() ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1831 throw parser.exception("Unclosed string"); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1832 buf.append(parser.lastChar()); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1833 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1834 } |
714 | 1835 return parser.success(constExpStr(buf.toString())); |
6
a315783c9524
more parsing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
5
diff
changeset
|
1836 } |
a315783c9524
more parsing
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
5
diff
changeset
|
1837 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1838 private Character EscSeq() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1839 parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1840 if( !parser.match('\\') ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1841 return parser.failure(null); |
155
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1842 if( parser.match('a') ) return parser.success('\u0007'); |
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1843 if( parser.match('b') ) return parser.success('\b'); |
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1844 if( parser.match('f') ) return parser.success('\f'); |
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1845 if( parser.match('n') ) return parser.success('\n'); |
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1846 if( parser.match('r') ) return parser.success('\r'); |
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1847 if( parser.match('t') ) return parser.success('\t'); |
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1848 if( parser.match('v') ) return parser.success('\u000b'); |
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1849 if( parser.match('\\') ) return parser.success('\\'); |
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1850 if( parser.match('"') ) return parser.success('"'); |
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1851 if( parser.match('\'') ) return parser.success('\''); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1852 int start = parser.currentIndex(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1853 if( parser.match('x') && HexDigit() && HexDigit() ) |
155
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1854 return parser.success((char)Integer.parseInt(parser.textFrom(start+1),16)); |
763 | 1855 if( parser.match('u') && HexDigit() && HexDigit() && HexDigit() && HexDigit() ) |
1856 return parser.success((char)Integer.parseInt(parser.textFrom(start+1),16)); | |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1857 if( Digit() ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1858 if( Digit() ) Digit(); // optional |
155
db7b3902e01c
fix parsing problems
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
154
diff
changeset
|
1859 return parser.success((char)Integer.parseInt(parser.textFrom(start))); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1860 } |
684 | 1861 if( MatchEndOfLine() ) { |
271
82a3ebcfbafa
add internal tests
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
260
diff
changeset
|
1862 return parser.success('\n'); |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1863 } |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1864 return parser.failure(null); |
14
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
1865 } |
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
1866 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1867 private void Spaces() throws ParseException { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1868 while( parser.anyOf(" \t") || Comment() || ContinueOnNextLine() ); |
14
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
1869 } |
2ddf85634d20
whitespace handling;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
12
diff
changeset
|
1870 |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1871 private boolean ContinueOnNextLine() { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1872 parser.begin(); |
700 | 1873 if( parser.match('\\') && EndOfLine() ) { |
1874 parser.upSb(); | |
1875 return parser.success(); | |
1876 } else | |
1877 return parser.failure(); | |
7
bca8fc5d928b
work on expressions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
6
diff
changeset
|
1878 } |
bca8fc5d928b
work on expressions
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
6
diff
changeset
|
1879 |
247
b5995d77878a
fix parsing of comments
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
245
diff
changeset
|
1880 private boolean Comment() throws ParseException { |
b5995d77878a
fix parsing of comments
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
245
diff
changeset
|
1881 if( LongComment() ) |
b5995d77878a
fix parsing of comments
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
245
diff
changeset
|
1882 return true; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1883 if( parser.match("--") ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1884 while( parser.noneOf("\r\n") ); |
247
b5995d77878a
fix parsing of comments
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
245
diff
changeset
|
1885 return true; |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1886 } |
247
b5995d77878a
fix parsing of comments
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
245
diff
changeset
|
1887 return false; |
18
3971113699b8
add NumericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
17
diff
changeset
|
1888 } |
3971113699b8
add NumericForStmt
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
17
diff
changeset
|
1889 |
247
b5995d77878a
fix parsing of comments
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
245
diff
changeset
|
1890 private boolean LongComment() throws ParseException { |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1891 parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1892 if( !parser.match("--[") ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1893 return parser.failure(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1894 int start = parser.currentIndex(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1895 while( parser.match('=') ); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1896 int nEquals = parser.currentIndex() - start; |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1897 if( !parser.match('[') ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1898 return parser.failure(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1899 while( !LongBracketsEnd(nEquals) ) { |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1900 if( !(EndOfLine() || parser.anyChar()) ) |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1901 throw parser.exception("Unclosed comment"); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1902 } |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1903 parser.upSb(); |
104
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1904 return parser.success(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1905 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1906 |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1907 private boolean LongBracketsEnd(int nEquals) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1908 parser.begin(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1909 if( !parser.match(']') ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1910 return parser.failure(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1911 while( nEquals-- > 0 ) { |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1912 if( !parser.match('=') ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1913 return parser.failure(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1914 } |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1915 if( !parser.match(']') ) |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1916 return parser.failure(); |
754e6030c029
remove parboiled and rewrite parser;
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
99
diff
changeset
|
1917 return parser.success(); |
12
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1918 } |
9cea1aea5eef
CmdLine can run files
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
11
diff
changeset
|
1919 |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
1920 |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
1921 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1922 private class ParseList extends ArrayList { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1923 |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1924 void addNewLines() { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1925 if( parser.sb().length() > 0 ) { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1926 add( parser.sb().toString() ); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1927 parser.sb().setLength(0); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1928 /* |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1929 if( parser.sourceName.equals("stdin") ) { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1930 StringWriter sw = new StringWriter(); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1931 new Throwable().printStackTrace(new PrintWriter(sw,true)); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1932 // add(sw.toString()); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1933 } |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1934 */ |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1935 } |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1936 } |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1937 |
1093
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1938 void prependNewLines() { |
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1939 if( parser.sb().length() > 0 ) { |
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1940 add( 0, parser.sb().toString() ); |
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1941 parser.sb().setLength(0); |
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1942 } |
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1943 } |
a656fa45e315
fix multiline statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
1091
diff
changeset
|
1944 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1945 ParseList() { |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1946 addNewLines(); |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1947 } |
677 | 1948 |
1949 @Override public boolean add(Object obj) { | |
1950 if( obj instanceof List ) throw new RuntimeException(); | |
1951 return super.add(obj); | |
1952 } | |
1953 | |
1954 @Override public void add(int index,Object obj) { | |
1955 if( obj instanceof List ) throw new RuntimeException(); | |
1956 super.add(index,obj); | |
1957 } | |
1958 | |
1959 @Override public String toString() { | |
1960 StringBuilder sb = new StringBuilder(); | |
1961 for( Object o : this ) { | |
1962 sb.append( o.toString() ); | |
1963 } | |
1964 return sb.toString(); | |
1965 } | |
1966 } | |
1967 | |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
645
diff
changeset
|
1968 |
674 | 1969 private enum Val { SINGLE, ARRAY } |
1970 | |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
1971 private class Expr extends ParseList { |
674 | 1972 final Val valType; |
649
37f0cf43f191
UnaryExpr now compiled
Franklin Schmidt <fschmidt@gmail.com>
parents:
648
diff
changeset
|
1973 final boolean isStmt; |
674 | 1974 |
1975 Expr(Val valType,boolean isStmt) { | |
1976 this.valType = valType; | |
649
37f0cf43f191
UnaryExpr now compiled
Franklin Schmidt <fschmidt@gmail.com>
parents:
648
diff
changeset
|
1977 this.isStmt = isStmt; |
37f0cf43f191
UnaryExpr now compiled
Franklin Schmidt <fschmidt@gmail.com>
parents:
648
diff
changeset
|
1978 } |
37f0cf43f191
UnaryExpr now compiled
Franklin Schmidt <fschmidt@gmail.com>
parents:
648
diff
changeset
|
1979 |
674 | 1980 Expr single() { |
1981 if( valType==Val.SINGLE ) | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1982 return this; |
674 | 1983 Expr exp = new Expr(Val.SINGLE,isStmt); |
677 | 1984 exp.add( valType==Val.ARRAY ? "LuanImpl.first(" : "Luan.first(" ); |
1985 exp.addAll( this ); | |
1986 exp.add( ")" ); | |
666
2f449ccf54d2
use lists to assemble source
Franklin Schmidt <fschmidt@gmail.com>
parents:
665
diff
changeset
|
1987 return exp; |
649
37f0cf43f191
UnaryExpr now compiled
Franklin Schmidt <fschmidt@gmail.com>
parents:
648
diff
changeset
|
1988 } |
674 | 1989 |
1990 Expr array() { | |
1991 if( valType==Val.ARRAY ) | |
1992 return this; | |
1993 Expr exp = new Expr(Val.ARRAY,isStmt); | |
1994 if( valType==Val.SINGLE ) { | |
677 | 1995 exp.add( "new Object[]{" ); |
1996 exp.addAll( this ); | |
1997 exp.add( "}" ); | |
674 | 1998 } else { |
677 | 1999 exp.add( "Luan.array(" ); |
2000 exp.addAll( this ); | |
2001 exp.add( ")" ); | |
674 | 2002 } |
2003 return exp; | |
2004 } | |
2005 | |
650
d658eab7bf4c
finish compiling operators
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
2006 } |
d658eab7bf4c
finish compiling operators
Franklin Schmidt <fschmidt@gmail.com>
parents:
649
diff
changeset
|
2007 |
674 | 2008 private Expr expString(List<Expr> list) { |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
2009 switch(list.size()) { |
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
2010 case 0: |
1096 | 2011 { |
2012 Expr exp = new Expr(Val.ARRAY,false); | |
2013 exp.add("LuanFunction.NOTHING"); | |
2014 return exp; | |
2015 } | |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
2016 case 1: |
1096 | 2017 { |
2018 Expr exp = list.get(0); | |
2019 exp.prependNewLines(); | |
2020 return exp; | |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
2021 } |
1096 | 2022 default: |
2023 { | |
2024 Expr exp = new Expr(Val.ARRAY,false); | |
2025 int lastI = list.size() - 1; | |
2026 exp.add( "new Object[]{" ); | |
2027 for( int i=0; i<lastI; i++ ) { | |
2028 exp.addAll( list.get(i).single() ); | |
2029 exp.add( "," ); | |
2030 } | |
2031 Expr last = list.get(lastI); | |
2032 if( last.valType==Val.SINGLE ) { | |
2033 exp.addAll( last ); | |
2034 exp.add( "}" ); | |
2035 } else { | |
2036 exp.add( "}" ); | |
2037 exp.add( 0, "LuanImpl.concatArgs(" ); | |
2038 exp.add( "," ); | |
2039 exp.addAll( last ); | |
2040 exp.add( ")" ); | |
2041 } | |
2042 return exp; | |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
2043 } |
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
2044 } |
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
651
diff
changeset
|
2045 } |
657 | 2046 |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2047 private class Stmts extends ParseList { |
663
b438a47196bc
finish compiling function blocks
Franklin Schmidt <fschmidt@gmail.com>
parents:
662
diff
changeset
|
2048 boolean hasReturn = false; |
651
140cc5191b7a
start compiling statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
650
diff
changeset
|
2049 } |
140cc5191b7a
start compiling statements
Franklin Schmidt <fschmidt@gmail.com>
parents:
650
diff
changeset
|
2050 |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2051 private static String toFnString(Stmts stmts,List<UpSym> upValueSymbols,String className,List<Inner> inners) { |
678 | 2052 if( !stmts.hasReturn ) |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2053 stmts.add( "\nreturn LuanFunction.NOTHING;" ); |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2054 StringBuilder sb = new StringBuilder(); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2055 sb.append( "" |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2056 +"package luan.impl; " |
1796 | 2057 +"import luan.Luan; " |
1330 | 2058 +"import luan.LuanClosure; " |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2059 +"import luan.LuanFunction; " |
1796 | 2060 +"import luan.LuanTable; " |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2061 +"import luan.LuanException; " |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2062 +"import luan.modules.PackageLuan; " |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2063 |
1330 | 2064 +"public class " + className +" extends LuanClosure { " |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
2065 +"public "+className+"(boolean javaOk,String sourceName) throws LuanException { " |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
2066 +"super("+toUpValues(upValueSymbols)+",javaOk,sourceName); " |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2067 +"} " |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2068 |
1333
25746915a241
merge Luan and LuanState
Franklin Schmidt <fschmidt@gmail.com>
parents:
1330
diff
changeset
|
2069 +"@Override public Object doCall(Luan luan,Object[] args) throws LuanException { " |
688 | 2070 +"final Pointer[] parentUpValues = upValues; " |
679
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2071 +"Object t; " |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2072 +"Object[] a; " |
43522473599d
make java line numbers match
Franklin Schmidt <fschmidt@gmail.com>
parents:
678
diff
changeset
|
2073 + stmts |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2074 +"\n}\n" |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2075 ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2076 for( Inner inner : inners ) { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2077 sb.append( '\n' ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2078 sb.append( inner.toInnerFnString(lines(sb.toString())) + '\n' ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2079 } |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2080 sb.append( "" |
663
b438a47196bc
finish compiling function blocks
Franklin Schmidt <fschmidt@gmail.com>
parents:
662
diff
changeset
|
2081 +"}\n" |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2082 ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2083 return sb.toString(); |
663
b438a47196bc
finish compiling function blocks
Franklin Schmidt <fschmidt@gmail.com>
parents:
662
diff
changeset
|
2084 } |
b438a47196bc
finish compiling function blocks
Franklin Schmidt <fschmidt@gmail.com>
parents:
662
diff
changeset
|
2085 |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2086 private class Inner { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2087 private final Stmts stmts; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2088 private final String name; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2089 private final String className; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2090 private final int lines; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2091 private final int endLine; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2092 |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2093 Inner(Stmts stmts,String name,String className) { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2094 this.stmts = stmts; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2095 this.name = name; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2096 this.className = className; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2097 |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2098 stmts.addNewLines(); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2099 if( !stmts.hasReturn ) |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2100 stmts.add( "return LuanFunction.NOTHING; " ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2101 this.lines = lines( stmts.toString() ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2102 this.endLine = lines( parser.textFrom(0) ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2103 } |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2104 |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2105 Expr toInnerFnExp(List<UpSym> upValueSymbols) { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2106 StringBuilder sb = new StringBuilder(); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2107 sb.append( |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
2108 "new "+className+"("+toUpValues(upValueSymbols)+",javaOk,sourceName)" |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2109 ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2110 for( int i=0; i<lines; i++ ) { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2111 sb.append('\n'); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2112 } |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2113 |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2114 Expr exp = new Expr(Val.SINGLE,false); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2115 exp.add( sb.toString() ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2116 return exp; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2117 } |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2118 |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2119 String toInnerFnString(int line) { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2120 int diff = line + lines - endLine; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2121 String name = this.name!=null ? this.name : ""; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2122 name += "$" + diff; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2123 //name += "_" + lines + "_" + endLine + "_" + line; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2124 StringBuilder sb = new StringBuilder(); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2125 sb.append( "" |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2126 +"private static class " + className +" extends LuanClosure { " |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
2127 +className+"(Pointer[] upValues,boolean javaOk,String sourceName) throws LuanException { " |
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
2128 +"super(upValues,javaOk,sourceName); " |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2129 +"} " |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2130 +"@Override public Object doCall(Luan luan,Object[] args) throws LuanException { " |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2131 +"return _" + name + "(luan,args); " |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2132 +"} " |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2133 +"private Object _" + name + "(Luan luan,Object[] args) throws LuanException { " |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2134 +"final Pointer[] parentUpValues = upValues; " |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2135 +"Object t; " |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2136 +"Object[] a; " |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2137 + stmts |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2138 +"} " |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2139 +"} " |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2140 ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2141 return sb.toString(); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2142 } |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2143 } |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2144 |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2145 private static int lines(String s) { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2146 int lines = 0; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2147 final int n = s.length(); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2148 for( int i=0; i<n; i++ ) { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2149 if( s.charAt(i) == '\n' ) |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2150 lines++; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2151 } |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2152 return lines; |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2153 } |
665 | 2154 |
1400
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2155 private static String toUpValues(List<UpSym> upValueSymbols) { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2156 StringBuilder sb = new StringBuilder(); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2157 sb.append( "new Pointer[]{ " ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2158 for( UpSym upSym : upValueSymbols ) { |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2159 sb.append( upSym.value + ", " ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2160 } |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2161 sb.append( "}" ); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2162 return sb.toString(); |
221eedb0f54e
fix inner class gc bug
Franklin Schmidt <fschmidt@gmail.com>
parents:
1384
diff
changeset
|
2163 } |
663
b438a47196bc
finish compiling function blocks
Franklin Schmidt <fschmidt@gmail.com>
parents:
662
diff
changeset
|
2164 |
5
9ef0fd711101
start LuaParser
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
2165 } |