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