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