OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Generates a syntax tree from a Mojo IDL file.""" | 5 """Generates a syntax tree from a Mojo IDL file.""" |
6 | 6 |
7 import imp | 7 import imp |
8 import os.path | 8 import os.path |
9 import sys | 9 import sys |
10 | 10 |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 | """ | 136 | """ |
137 if len(p) > 1: | 137 if len(p) > 1: |
138 p[0] = _ListFromConcat(p[1], p[2]) | 138 p[0] = _ListFromConcat(p[1], p[2]) |
139 | 139 |
140 def p_field(self, p): | 140 def p_field(self, p): |
141 """field : typename NAME default ordinal SEMI""" | 141 """field : typename NAME default ordinal SEMI""" |
142 p[0] = ('FIELD', p[1], p[2], p[4], p[3]) | 142 p[0] = ('FIELD', p[1], p[2], p[4], p[3]) |
143 | 143 |
144 def p_default(self, p): | 144 def p_default(self, p): |
145 """default : EQUALS expression | 145 """default : EQUALS expression |
146 | EQUALS expression_object | |
147 | """ | 146 | """ |
148 if len(p) > 2: | 147 if len(p) > 2: |
149 p[0] = p[2] | 148 p[0] = p[2] |
150 | 149 |
151 def p_interface(self, p): | 150 def p_interface(self, p): |
152 """interface : attribute_section INTERFACE NAME LBRACE interface_body \ | 151 """interface : attribute_section INTERFACE NAME LBRACE interface_body \ |
153 RBRACE SEMI""" | 152 RBRACE SEMI""" |
154 p[0] = ('INTERFACE', p[3], p[1], p[5]) | 153 p[0] = ('INTERFACE', p[3], p[1], p[5]) |
155 | 154 |
156 def p_interface_body(self, p): | 155 def p_interface_body(self, p): |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 p[0] = ('ENUM_FIELD', p[1], None) | 249 p[0] = ('ENUM_FIELD', p[1], None) |
251 else: | 250 else: |
252 p[0] = ('ENUM_FIELD', p[1], p[3]) | 251 p[0] = ('ENUM_FIELD', p[1], p[3]) |
253 | 252 |
254 def p_const(self, p): | 253 def p_const(self, p): |
255 """const : CONST typename NAME EQUALS expression SEMI""" | 254 """const : CONST typename NAME EQUALS expression SEMI""" |
256 p[0] = ('CONST', p[2], p[3], p[5]) | 255 p[0] = ('CONST', p[2], p[3], p[5]) |
257 | 256 |
258 ### Expressions ### | 257 ### Expressions ### |
259 | 258 |
260 def p_expression_object(self, p): | |
261 """expression_object : expression_array | |
262 | LBRACE expression_object_elements RBRACE """ | |
263 if len(p) < 3: | |
264 p[0] = p[1] | |
265 else: | |
266 p[0] = ('OBJECT', p[2]) | |
267 | |
268 def p_expression_object_elements(self, p): | |
269 """expression_object_elements : expression_object | |
270 | expression_object COMMA expression_object_el
ements | |
271 | """ | |
272 if len(p) == 2: | |
273 p[0] = _ListFromConcat(p[1]) | |
274 elif len(p) > 3: | |
275 p[0] = _ListFromConcat(p[1], p[3]) | |
276 | |
277 def p_expression_array(self, p): | |
278 """expression_array : expression | |
279 | LBRACKET expression_array_elements RBRACKET """ | |
280 if len(p) < 3: | |
281 p[0] = p[1] | |
282 else: | |
283 p[0] = ('ARRAY', p[2]) | |
284 | |
285 def p_expression_array_elements(self, p): | |
286 """expression_array_elements : expression_object | |
287 | expression_object COMMA expression_array_elem
ents | |
288 | """ | |
289 if len(p) == 2: | |
290 p[0] = _ListFromConcat(p[1]) | |
291 elif len(p) > 3: | |
292 p[0] = _ListFromConcat(p[1], p[3]) | |
293 | |
294 # TODO(vtl): This is now largely redundant. | 259 # TODO(vtl): This is now largely redundant. |
295 def p_expression(self, p): | 260 def p_expression(self, p): |
296 """expression : binary_expression""" | 261 """expression : binary_expression""" |
297 p[0] = ('EXPRESSION', p[1]) | 262 p[0] = ('EXPRESSION', p[1]) |
298 | 263 |
299 # PLY lets us specify precedence of operators, but since we don't actually | 264 # PLY lets us specify precedence of operators, but since we don't actually |
300 # evaluate them, we don't need that here. | 265 # evaluate them, we don't need that here. |
301 # TODO(vtl): We're going to need to evaluate them. | 266 # TODO(vtl): We're going to need to evaluate them. |
302 def p_binary_expression(self, p): | 267 def p_binary_expression(self, p): |
303 """binary_expression : unary_expression | 268 """binary_expression : unary_expression |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 | 329 |
365 def Parse(source, filename): | 330 def Parse(source, filename): |
366 lexer = Lexer(filename) | 331 lexer = Lexer(filename) |
367 parser = Parser(lexer, source, filename) | 332 parser = Parser(lexer, source, filename) |
368 | 333 |
369 lex.lex(object=lexer) | 334 lex.lex(object=lexer) |
370 yacc.yacc(module=parser, debug=0, write_tables=0) | 335 yacc.yacc(module=parser, debug=0, write_tables=0) |
371 | 336 |
372 tree = yacc.parse(source) | 337 tree = yacc.parse(source) |
373 return tree | 338 return tree |
OLD | NEW |