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