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(