Mercurial Hosting > luan
comparison src/luan/interp/LuaParser.java @ 9:600676034a1a
add variables and tables
git-svn-id: https://luan-java.googlecode.com/svn/trunk@10 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Wed, 21 Nov 2012 09:40:33 +0000 |
parents | 8896068e0a4b |
children | b7d7069fee58 |
comparison
equal
deleted
inserted
replaced
8:8896068e0a4b | 9:600676034a1a |
---|---|
1 package luan.interp; | 1 package luan.interp; |
2 | 2 |
3 import java.util.List; | |
4 import java.util.ArrayList; | |
3 import java.util.Scanner; | 5 import java.util.Scanner; |
4 import org.parboiled.BaseParser; | 6 import org.parboiled.BaseParser; |
5 import org.parboiled.Parboiled; | 7 import org.parboiled.Parboiled; |
6 import org.parboiled.Rule; | 8 import org.parboiled.Rule; |
7 import org.parboiled.parserunners.ReportingParseRunner; | 9 import org.parboiled.parserunners.ReportingParseRunner; |
100 ); | 102 ); |
101 } | 103 } |
102 | 104 |
103 Rule SingleExpr() { | 105 Rule SingleExpr() { |
104 return FirstOf( | 106 return FirstOf( |
105 Sequence( '(', Spaces(), Expr(), ')', Spaces() ), | 107 TableExpr(), |
108 PrefixExpr(), | |
106 LiteralExpr() | 109 LiteralExpr() |
110 ); | |
111 } | |
112 | |
113 Rule TableExpr() { | |
114 return Sequence( | |
115 '{', Spaces(), | |
116 push( new ArrayList<TableExpr.Field>() ), | |
117 push( 1.0 ), // counter | |
118 Optional( | |
119 Field(), | |
120 ZeroOrMore( | |
121 FieldSep(), | |
122 Field() | |
123 ), | |
124 Optional( FieldSep() ) | |
125 ), | |
126 '}', Spaces(), | |
127 push( newTableExpr() ) | |
128 ); | |
129 } | |
130 | |
131 TableExpr newTableExpr() { | |
132 pop(); // counter | |
133 @SuppressWarnings("unchecked") | |
134 List<TableExpr.Field> list = (List<TableExpr.Field>)pop(); | |
135 return new TableExpr(list.toArray(new TableExpr.Field[0])); | |
136 } | |
137 | |
138 Rule FieldSep() { | |
139 return Sequence( AnyOf(",;"), Spaces() ); | |
140 } | |
141 | |
142 Rule Field() { | |
143 return FirstOf( | |
144 Sequence( | |
145 FirstOf( SubExpr(), Name() ), | |
146 '=', Spaces(), Expr(), | |
147 addField() | |
148 ), | |
149 Sequence( | |
150 Expr(), | |
151 addIndexedField() | |
152 ) | |
153 ); | |
154 } | |
155 | |
156 boolean addField() { | |
157 TableExpr.Field field = new TableExpr.Field( (Expr)pop(1), (Expr)pop() ); | |
158 @SuppressWarnings("unchecked") | |
159 List<TableExpr.Field> list = (List<TableExpr.Field>)peek(1); | |
160 list.add(field); | |
161 return true; | |
162 } | |
163 | |
164 boolean addIndexedField() { | |
165 Expr val = (Expr)pop(); | |
166 double i = (Double)pop(); | |
167 TableExpr.Field field = new TableExpr.Field( new ConstExpr(new LuaNumber(i)), val ); | |
168 push( i + 1 ); | |
169 @SuppressWarnings("unchecked") | |
170 List<TableExpr.Field> list = (List<TableExpr.Field>)peek(1); | |
171 list.add(field); | |
172 return true; | |
173 } | |
174 | |
175 Rule PrefixExpr() { | |
176 return Sequence( | |
177 FirstOf( | |
178 Sequence( '(', Spaces(), Expr(), ')', Spaces() ), | |
179 Var() | |
180 ), | |
181 ZeroOrMore( | |
182 FirstOf( | |
183 SubExpr(), | |
184 Sequence( '.', Spaces(), Name() ) | |
185 ), | |
186 push( new GetExpr( (Expr)pop(1), (Expr)pop() ) ) | |
187 ) | |
188 ); | |
189 } | |
190 | |
191 Rule SubExpr() { | |
192 return Sequence( '[', Spaces(), Expr(), ']', Spaces() ); | |
193 } | |
194 | |
195 Rule Var() { | |
196 return Sequence( | |
197 Name(), | |
198 push( new GetExpr( EnvExpr.INSTANCE, (Expr)pop() ) ) | |
199 ); | |
200 } | |
201 | |
202 Rule Name() { | |
203 return Sequence( | |
204 Sequence( | |
205 NameStart(), | |
206 ZeroOrMore( | |
207 FirstOf( NameStart(), Digit() ) | |
208 ) | |
209 ), | |
210 push( new ConstExpr(match()) ), | |
211 Spaces() | |
212 ); | |
213 } | |
214 | |
215 Rule NameStart() { | |
216 return FirstOf( | |
217 CharRange('a', 'z'), | |
218 CharRange('A', 'Z'), | |
219 '_' | |
107 ); | 220 ); |
108 } | 221 } |
109 | 222 |
110 Rule LiteralExpr() { | 223 Rule LiteralExpr() { |
111 return Sequence( | 224 return Sequence( |