Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: mojo/public/tools/bindings/pylib/mojom/parse/parser.py

Issue 375993002: Mojo: Mojom: Make enum values only integers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | mojo/public/tools/bindings/pylib/mojom/parse/translate.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 value = int(p[1][1:]) 276 value = int(p[1][1:])
277 if value > _MAX_ORDINAL_VALUE: 277 if value > _MAX_ORDINAL_VALUE:
278 raise ParseError(self.filename, "Ordinal value %d too large:" % value, 278 raise ParseError(self.filename, "Ordinal value %d too large:" % value,
279 lineno=p.lineno(1), 279 lineno=p.lineno(1),
280 snippet=self._GetSnippet(p.lineno(1))) 280 snippet=self._GetSnippet(p.lineno(1)))
281 p[0] = ast.Ordinal(value, filename=self.filename, lineno=p.lineno(1)) 281 p[0] = ast.Ordinal(value, filename=self.filename, lineno=p.lineno(1))
282 else: 282 else:
283 p[0] = ast.Ordinal(None) 283 p[0] = ast.Ordinal(None)
284 284
285 def p_enum(self, p): 285 def p_enum(self, p):
286 """enum : ENUM NAME LBRACE enum_field_list RBRACE SEMI""" 286 """enum : ENUM NAME LBRACE nonempty_enum_value_list RBRACE SEMI
287 | ENUM NAME LBRACE nonempty_enum_value_list COMMA RBRACE SEMI"""
287 p[0] = ('ENUM', p[2], p[4]) 288 p[0] = ('ENUM', p[2], p[4])
288 289
289 def p_enum_field_list(self, p): 290 def p_nonempty_enum_value_list_1(self, p):
290 """enum_field_list : enum_field 291 """nonempty_enum_value_list : enum_value"""
291 | enum_field COMMA enum_field_list 292 p[0] = [p[1]]
292 | """
293 if len(p) == 2:
294 p[0] = _ListFromConcat(p[1])
295 elif len(p) > 3:
296 p[0] = _ListFromConcat(p[1], p[3])
297 293
298 def p_enum_field(self, p): 294 def p_nonempty_enum_value_list_2(self, p):
299 """enum_field : NAME 295 """nonempty_enum_value_list : nonempty_enum_value_list COMMA enum_value"""
300 | NAME EQUALS constant""" 296 p[0] = p[1]
301 if len(p) == 2: 297 p[0].append(p[3])
302 p[0] = ('ENUM_FIELD', p[1], None) 298
303 else: 299 def p_enum_value(self, p):
304 p[0] = ('ENUM_FIELD', p[1], p[3]) 300 """enum_value : NAME
301 | NAME EQUALS int
302 | NAME EQUALS identifier_wrapped"""
303 p[0] = ('ENUM_VALUE', p[1], p[3] if len(p) == 4 else None)
305 304
306 def p_const(self, p): 305 def p_const(self, p):
307 """const : CONST typename NAME EQUALS constant SEMI""" 306 """const : CONST typename NAME EQUALS constant SEMI"""
308 p[0] = ('CONST', p[2], p[3], p[5]) 307 p[0] = ('CONST', p[2], p[3], p[5])
309 308
310 def p_constant(self, p): 309 def p_constant(self, p):
311 """constant : literal 310 """constant : literal
312 | identifier_wrapped""" 311 | identifier_wrapped"""
313 p[0] = p[1] 312 p[0] = p[1]
314 313
315 def p_identifier_wrapped(self, p): 314 def p_identifier_wrapped(self, p):
316 """identifier_wrapped : identifier""" 315 """identifier_wrapped : identifier"""
317 p[0] = ('IDENTIFIER', p[1]) 316 p[0] = ('IDENTIFIER', p[1])
318 317
319 def p_identifier(self, p): 318 def p_identifier(self, p):
320 """identifier : NAME 319 """identifier : NAME
321 | NAME DOT identifier""" 320 | NAME DOT identifier"""
322 p[0] = ''.join(p[1:]) 321 p[0] = ''.join(p[1:])
323 322
324 def p_literal(self, p): 323 def p_literal(self, p):
325 """literal : number 324 """literal : int
325 | float
326 | TRUE 326 | TRUE
327 | FALSE 327 | FALSE
328 | DEFAULT 328 | DEFAULT
329 | STRING_LITERAL""" 329 | STRING_LITERAL"""
330 p[0] = p[1] 330 p[0] = p[1]
331 331
332 def p_number(self, p): 332 def p_int(self, p):
333 """number : digits 333 """int : int_const
334 | PLUS digits 334 | PLUS int_const
335 | MINUS digits""" 335 | MINUS int_const"""
336 p[0] = ''.join(p[1:]) 336 p[0] = ''.join(p[1:])
337 337
338 def p_digits(self, p): 338 def p_int_const(self, p):
339 """digits : INT_CONST_DEC 339 """int_const : INT_CONST_DEC
340 | INT_CONST_HEX 340 | INT_CONST_HEX"""
341 | FLOAT_CONST"""
342 p[0] = p[1] 341 p[0] = p[1]
343 342
343 def p_float(self, p):
344 """float : FLOAT_CONST
345 | PLUS FLOAT_CONST
346 | MINUS FLOAT_CONST"""
347 p[0] = ''.join(p[1:])
348
344 def p_error(self, e): 349 def p_error(self, e):
345 if e is None: 350 if e is None:
346 # Unexpected EOF. 351 # Unexpected EOF.
347 # TODO(vtl): Can we figure out what's missing? 352 # TODO(vtl): Can we figure out what's missing?
348 raise ParseError(self.filename, "Unexpected end of file") 353 raise ParseError(self.filename, "Unexpected end of file")
349 354
350 raise ParseError(self.filename, "Unexpected %r:" % e.value, lineno=e.lineno, 355 raise ParseError(self.filename, "Unexpected %r:" % e.value, lineno=e.lineno,
351 snippet=self._GetSnippet(e.lineno)) 356 snippet=self._GetSnippet(e.lineno))
352 357
353 def _GetSnippet(self, lineno): 358 def _GetSnippet(self, lineno):
354 return self.source.split('\n')[lineno - 1] 359 return self.source.split('\n')[lineno - 1]
355 360
356 361
357 def Parse(source, filename): 362 def Parse(source, filename):
358 lexer = Lexer(filename) 363 lexer = Lexer(filename)
359 parser = Parser(lexer, source, filename) 364 parser = Parser(lexer, source, filename)
360 365
361 lex.lex(object=lexer) 366 lex.lex(object=lexer)
362 yacc.yacc(module=parser, debug=0, write_tables=0) 367 yacc.yacc(module=parser, debug=0, write_tables=0)
363 368
364 tree = yacc.parse(source) 369 tree = yacc.parse(source)
365 return tree 370 return tree
OLDNEW
« no previous file with comments | « no previous file | mojo/public/tools/bindings/pylib/mojom/parse/translate.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698