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