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

Side by Side Diff: tools/idl_parser/idl_parser.py

Issue 329853005: IDL parser: align with current Web IDL specification (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Created 6 years, 6 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
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """ Parser for PPAPI IDL """ 6 """ Parser for PPAPI IDL """
7 7
8 # 8 #
9 # IDL Parser 9 # IDL Parser
10 # 10 #
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 # http://www.w3.org/TR/WebIDL/#idl-grammar 186 # http://www.w3.org/TR/WebIDL/#idl-grammar
187 # 187 #
188 # [1] 188 # [1]
189 def p_Definitions(self, p): 189 def p_Definitions(self, p):
190 """Definitions : ExtendedAttributeList Definition Definitions 190 """Definitions : ExtendedAttributeList Definition Definitions
191 | """ 191 | """
192 if len(p) > 1: 192 if len(p) > 1:
193 p[2].AddChildren(p[1]) 193 p[2].AddChildren(p[1])
194 p[0] = ListFromConcat(p[2], p[3]) 194 p[0] = ListFromConcat(p[2], p[3])
195 195
196 # [2] Add INLINE definition 196 # [2] Add INLINE definition
Jens Widell 2014/06/12 13:34:36 I don't know what this comment is about. :-) There
noelallen1 2014/06/12 19:33:37 This really should just be: # [2] To signify it'
197 def p_Definition(self, p): 197 def p_Definition(self, p):
198 """Definition : CallbackOrInterface 198 """Definition : CallbackOrInterface
199 | Partial 199 | Partial
200 | Dictionary 200 | Dictionary
201 | Exception 201 | Exception
202 | Enum 202 | Enum
203 | Typedef 203 | Typedef
204 | ImplementsStatement""" 204 | ImplementsStatement"""
205 p[0] = p[1] 205 p[0] = p[1]
206 206
(...skipping 15 matching lines...) Expand all
222 def p_CallbackRestOrInterface(self, p): 222 def p_CallbackRestOrInterface(self, p):
223 """CallbackRestOrInterface : CallbackRest 223 """CallbackRestOrInterface : CallbackRest
224 | Interface""" 224 | Interface"""
225 p[0] = p[1] 225 p[0] = p[1]
226 226
227 # [5] 227 # [5]
228 def p_Interface(self, p): 228 def p_Interface(self, p):
229 """Interface : INTERFACE identifier Inheritance '{' InterfaceMembers '}' ';' """ 229 """Interface : INTERFACE identifier Inheritance '{' InterfaceMembers '}' ';' """
230 p[0] = self.BuildNamed('Interface', p, 2, ListFromConcat(p[3], p[5])) 230 p[0] = self.BuildNamed('Interface', p, 2, ListFromConcat(p[3], p[5]))
231 231
232 # [6] Error recovery for PARTIAL 232 # [6]
233 def p_Partial(self, p): 233 def p_Partial(self, p):
234 """Partial : PARTIAL PartialDefinition""" 234 """Partial : PARTIAL PartialDefinition"""
235 p[2].AddChildren(self.BuildTrue('Partial')) 235 p[2].AddChildren(self.BuildTrue('Partial'))
236 p[0] = p[2] 236 p[0] = p[2]
237 237
238 # [6.1] Error recovery for Enums 238 # [6.1] Error recovery for Partial
239 def p_PartialError(self, p): 239 def p_PartialError(self, p):
240 """Partial : PARTIAL error""" 240 """Partial : PARTIAL error"""
241 p[0] = self.BuildError(p, 'Partial') 241 p[0] = self.BuildError(p, 'Partial')
242 242
243 # [7] 243 # [7]
244 def p_PartialDefinition(self, p): 244 def p_PartialDefinition(self, p):
245 """PartialDefinition : PartialDictionary 245 """PartialDefinition : PartialDictionary
246 | PartialInterface""" 246 | PartialInterface"""
247 p[0] = p[1] 247 p[0] = p[1]
248 248
249 # [8] 249 # [8]
250 def p_PartialInterface(self, p): 250 def p_PartialInterface(self, p):
251 """PartialInterface : INTERFACE identifier '{' InterfaceMembers '}' ';'""" 251 """PartialInterface : INTERFACE identifier '{' InterfaceMembers '}' ';'"""
252 p[0] = self.BuildNamed('Interface', p, 2, p[4]) 252 p[0] = self.BuildNamed('Interface', p, 2, p[4])
253 253
254 # [9] 254 # [9]
255 def p_InterfaceMembers(self, p): 255 def p_InterfaceMembers(self, p):
256 """InterfaceMembers : ExtendedAttributeList InterfaceMember InterfaceMembers 256 """InterfaceMembers : ExtendedAttributeList InterfaceMember InterfaceMembers
257 |""" 257 |"""
258 if len(p) > 1: 258 if len(p) > 1:
259 p[2].AddChildren(p[1]) 259 p[2].AddChildren(p[1])
260 p[0] = ListFromConcat(p[2], p[3]) 260 p[0] = ListFromConcat(p[2], p[3])
261 261
262 # [10] 262 # [10]
263 def p_InterfaceMember(self, p): 263 def p_InterfaceMember(self, p):
264 """InterfaceMember : Const 264 """InterfaceMember : Const
265 | AttributeOrOperation""" 265 | AttributeOrOperationOrIterator"""
266 p[0] = p[1] 266 p[0] = p[1]
267 267
268 # [11] 268 # [11]
269 def p_Dictionary(self, p): 269 def p_Dictionary(self, p):
270 """Dictionary : DICTIONARY identifier Inheritance '{' DictionaryMembers '}' ';'""" 270 """Dictionary : DICTIONARY identifier Inheritance '{' DictionaryMembers '}' ';'"""
271 p[0] = self.BuildNamed('Dictionary', p, 2, ListFromConcat(p[3], p[5])) 271 p[0] = self.BuildNamed('Dictionary', p, 2, ListFromConcat(p[3], p[5]))
272 272
273 # [11.1] Error recovery for regular Dictionary 273 # [11.1] Error recovery for regular Dictionary
274 def p_DictionaryError(self, p): 274 def p_DictionaryError(self, p):
275 """Dictionary : DICTIONARY error ';'""" 275 """Dictionary : DICTIONARY error ';'"""
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 """Enum : ENUM identifier '{' EnumValueList '}' ';'""" 346 """Enum : ENUM identifier '{' EnumValueList '}' ';'"""
347 p[0] = self.BuildNamed('Enum', p, 2, p[4]) 347 p[0] = self.BuildNamed('Enum', p, 2, p[4])
348 348
349 # [20.1] Error recovery for Enums 349 # [20.1] Error recovery for Enums
350 def p_EnumError(self, p): 350 def p_EnumError(self, p):
351 """Enum : ENUM error ';'""" 351 """Enum : ENUM error ';'"""
352 p[0] = self.BuildError(p, 'Enum') 352 p[0] = self.BuildError(p, 'Enum')
353 353
354 # [21] 354 # [21]
355 def p_EnumValueList(self, p): 355 def p_EnumValueList(self, p):
356 """EnumValueList : ExtendedAttributeList string EnumValues""" 356 """EnumValueList : ExtendedAttributeList string EnumValueListComma"""
357 enum = self.BuildNamed('EnumItem', p, 2, p[1]) 357 enum = self.BuildNamed('EnumItem', p, 2, p[1])
358 p[0] = ListFromConcat(enum, p[3]) 358 p[0] = ListFromConcat(enum, p[3])
359 359
360 # [22] 360 # [22]
361 def p_EnumValues(self, p): 361 def p_EnumValueListComma(self, p):
362 """EnumValues : ',' ExtendedAttributeList string EnumValues 362 """EnumValueListComma : ',' EnumValueListString
363 |""" 363 |"""
364 if len(p) > 1: 364 if len(p) > 1:
365 enum = self.BuildNamed('EnumItem', p, 3, p[2]) 365 p[0] = p[2]
366 p[0] = ListFromConcat(enum, p[4])
367 366
368 # [23] 367 # [23]
368 def p_EnumValueListString(self, p):
369 """EnumValueListString : ExtendedAttributeList string EnumValueListComma
370 |"""
371 if len(p) > 1:
372 enum = self.BuildNamed('EnumItem', p, 2, p[1])
373 p[0] = ListFromConcat(enum, p[3])
374
375 # [24]
noelallen1 2014/06/12 19:33:37 This does not match: http://www.w3.org/TR/WebID
369 def p_CallbackRest(self, p): 376 def p_CallbackRest(self, p):
370 """CallbackRest : identifier '=' ReturnType '(' ArgumentList ')' ';'""" 377 """CallbackRest : identifier '=' ReturnType '(' ArgumentList ')' ';'"""
371 arguments = self.BuildProduction('Arguments', p, 4, p[5]) 378 arguments = self.BuildProduction('Arguments', p, 4, p[5])
372 p[0] = self.BuildNamed('Callback', p, 1, ListFromConcat(p[3], arguments)) 379 p[0] = self.BuildNamed('Callback', p, 1, ListFromConcat(p[3], arguments))
373 380
374 # [24] 381 # [25]
375 def p_Typedef(self, p): 382 def p_Typedef(self, p):
376 """Typedef : TYPEDEF ExtendedAttributeListNoComments Type identifier ';'""" 383 """Typedef : TYPEDEF ExtendedAttributeListNoComments Type identifier ';'"""
377 p[0] = self.BuildNamed('Typedef', p, 4, ListFromConcat(p[2], p[3])) 384 p[0] = self.BuildNamed('Typedef', p, 4, ListFromConcat(p[2], p[3]))
378 385
379 # [24.1] Error recovery for Typedefs 386 # [25.1] Error recovery for Typedefs
380 def p_TypedefError(self, p): 387 def p_TypedefError(self, p):
381 """Typedef : TYPEDEF error ';'""" 388 """Typedef : TYPEDEF error ';'"""
382 p[0] = self.BuildError(p, 'Typedef') 389 p[0] = self.BuildError(p, 'Typedef')
383 390
384 # [25] 391 # [26]
385 def p_ImplementsStatement(self, p): 392 def p_ImplementsStatement(self, p):
386 """ImplementsStatement : identifier IMPLEMENTS identifier ';'""" 393 """ImplementsStatement : identifier IMPLEMENTS identifier ';'"""
387 name = self.BuildAttribute('REFERENCE', p[3]) 394 name = self.BuildAttribute('REFERENCE', p[3])
388 p[0] = self.BuildNamed('Implements', p, 1, name) 395 p[0] = self.BuildNamed('Implements', p, 1, name)
389 396
390 # [26] 397 # [27]
391 def p_Const(self, p): 398 def p_Const(self, p):
392 """Const : CONST ConstType identifier '=' ConstValue ';'""" 399 """Const : CONST ConstType identifier '=' ConstValue ';'"""
393 value = self.BuildProduction('Value', p, 5, p[5]) 400 value = self.BuildProduction('Value', p, 5, p[5])
394 p[0] = self.BuildNamed('Const', p, 3, ListFromConcat(p[2], value)) 401 p[0] = self.BuildNamed('Const', p, 3, ListFromConcat(p[2], value))
395 402
396 # [27] 403 # [28]
397 def p_ConstValue(self, p): 404 def p_ConstValue(self, p):
398 """ConstValue : BooleanLiteral 405 """ConstValue : BooleanLiteral
399 | FloatLiteral 406 | FloatLiteral
400 | integer 407 | integer
401 | null""" 408 | null"""
402 if type(p[1]) == str: 409 if type(p[1]) == str:
403 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'integer'), 410 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'integer'),
404 self.BuildAttribute('NAME', p[1])) 411 self.BuildAttribute('NAME', p[1]))
405 else: 412 else:
406 p[0] = p[1] 413 p[0] = p[1]
407 414
408 # [27.1] Add definition for NULL 415 # [28.1] Add definition for NULL
409 def p_null(self, p): 416 def p_null(self, p):
410 """null : NULL""" 417 """null : NULL"""
411 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'NULL'), 418 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'NULL'),
412 self.BuildAttribute('NAME', 'NULL')) 419 self.BuildAttribute('NAME', 'NULL'))
413 420
414 # [28] 421 # [29]
415 def p_BooleanLiteral(self, p): 422 def p_BooleanLiteral(self, p):
416 """BooleanLiteral : TRUE 423 """BooleanLiteral : TRUE
417 | FALSE""" 424 | FALSE"""
418 value = self.BuildAttribute('VALUE', Boolean(p[1] == 'true')) 425 value = self.BuildAttribute('VALUE', Boolean(p[1] == 'true'))
419 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'boolean'), value) 426 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'boolean'), value)
420 427
421 # [29] 428 # [30]
422 def p_FloatLiteral(self, p): 429 def p_FloatLiteral(self, p):
423 """FloatLiteral : float 430 """FloatLiteral : float
424 | '-' INFINITY 431 | '-' INFINITY
425 | INFINITY 432 | INFINITY
426 | NAN """ 433 | NAN """
427 if len(p) > 2: 434 if len(p) > 2:
428 val = '-Infinity' 435 val = '-Infinity'
429 else: 436 else:
430 val = p[1] 437 val = p[1]
431 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'float'), 438 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'float'),
432 self.BuildAttribute('VALUE', val)) 439 self.BuildAttribute('VALUE', val))
433 440
434 # [30] 441 # [31] Removed unsupported: Serializer, Stringifier
435 def p_AttributeOrOperation(self, p): 442 def p_AttributeOrOperationOrIterator(self, p):
436 """AttributeOrOperation : STRINGIFIER StringifierAttributeOrOperation 443 """AttributeOrOperationOrIterator : StaticMember
437 | Attribute 444 | Attribute
438 | Operation""" 445 | OperationOrIterator"""
439 if len(p) > 2: 446 p[0] = p[1]
440 p[0] = p[2]
441 else:
442 p[0] = p[1]
443
444 # [31]
445 def p_StringifierAttributeOrOperation(self, p):
446 """StringifierAttributeOrOperation : Attribute
447 | OperationRest
448 | ';'"""
449 if p[1] == ';':
450 p[0] = self.BuildAttribute('STRINGIFIER', Boolean(True))
451 else:
452 p[0] = ListFromConcat(self.BuildAttribute('STRINGIFIER', p[1]), p[1])
453 447
454 # [32] 448 # [32]
455 def p_Attribute(self, p): 449 # def p_Serializer(self, p):
noelallen1 2014/06/12 19:33:36 I have mixed feeling about these place holders. I
456 """Attribute : Inherit ReadOnly ATTRIBUTE Type identifier ';'""" 450 # """Serializer : SERIALIZER SerializerRest"""
457 p[0] = self.BuildNamed('Attribute', p, 5, 451 # NOT_IMPLEMENTED
458 ListFromConcat(p[1], p[2], p[4]))
459 452
460 # [33] 453 # [33]
454 # def p_SerializerRest(self, p):
455 # """SerializerRest : OperationRest
456 # | '=' SerializationPattern
457 # |"""
458 # NOT_IMPLEMENTED
459
460 # [34]
461 # def p_SerializationPattern(self, p):
462 # """SerializationPattern : '{' SerializationPatternMap '}'
463 # | '[' SerializationPatternList ']'
464 # | identifier"""
465 # NOT_IMPLEMENTED
466
467 # [35]
468 # def p_SerializationPatternMap(self, p):
469 # """SerializationPatternMap : GETTER
470 # | INHERIT Identifiers
471 # | identifier Identifiers
472 # |"""
473 # NOT_IMPLEMENTED
474
475 # [36]
476 # def p_SerializationPatternList(self, p):
477 # """SerializationPatternList : GETTER
478 # | identifier Identifiers
479 # |"""
480 # NOT_IMPLEMENTED
481
482 # [37]
483 # def p_Identifiers(self, p):
484 # """Identifiers : ',' identifier Identifiers
485 # |"""
486 # return ListFromConcat(p[2], p[3])
487
488 # [38]
489 # def p_Stringifier(self, p):
490 # """Stringifier : STRINGIFIER StringifierRest"""
491 # NOT_IMPLEMENTED
492
493 # [39]
494 # def p_StringifierRest(self, p):
495 # """StringifierRest : AttributeRest
496 # | ReturnType OperationRest
497 # | ';'"""
498 # NOT_IMPLEMENTED
499
500 # [40]
501 def p_StaticMember(self, p):
502 """StaticMember : STATIC StaticMemberRest"""
503 p[2].AddChildren(self.BuildTrue('STATIC'))
504 p[0] = p[2]
505
506 # [41]
507 def p_StaticMemberRest(self, p):
508 """StaticMemberRest : AttributeRest
509 | ReturnType OperationRest"""
510 if len(p) == 2:
511 p[0] = p[1]
512 else:
513 p[2].AddChildren(p[1])
514 p[0] = p[2]
515
516 # [42]
517 def p_Attribute(self, p):
518 """Attribute : Inherit AttributeRest"""
519 p[2].AddChildren(ListFromConcat(p[1]))
520 p[0] = p[2]
521
522 # [43]
523 def p_AttributeRest(self, p):
524 """AttributeRest : ReadOnly ATTRIBUTE Type identifier ';'"""
525 p[0] = self.BuildNamed('Attribute', p, 4,
526 ListFromConcat(p[1], p[3]))
527
528 # [44]
461 def p_Inherit(self, p): 529 def p_Inherit(self, p):
462 """Inherit : INHERIT 530 """Inherit : INHERIT
463 |""" 531 |"""
464 if len(p) > 1: 532 if len(p) > 1:
465 p[0] = self.BuildTrue('INHERIT') 533 p[0] = self.BuildTrue('INHERIT')
466 534
467 # [34] 535 # [45]
468 def p_ReadOnly(self, p): 536 def p_ReadOnly(self, p):
469 """ReadOnly : READONLY 537 """ReadOnly : READONLY
470 |""" 538 |"""
471 if len(p) > 1: 539 if len(p) > 1:
472 p[0] = self.BuildTrue('READONLY') 540 p[0] = self.BuildTrue('READONLY')
473 541
474 # [35] 542 # [46]
475 def p_Operation(self, p): 543 def p_OperationOrIterator(self, p):
476 """Operation : Qualifiers OperationRest""" 544 """OperationOrIterator : ReturnType OperationOrIteratorRest
477 p[2].AddChildren(p[1]) 545 | SpecialOperation"""
478 p[0] = p[2] 546 if len(p) == 3:
479 547 p[2].AddChildren(p[1])
480 # [36] 548 p[0] = p[2]
481 def p_Qualifiers(self, p):
482 """Qualifiers : STATIC
483 | Specials"""
484 if p[1] == 'static':
485 p[0] = self.BuildTrue('STATIC')
486 else: 549 else:
487 p[0] = p[1] 550 p[0] = p[1]
488 551
489 # [37] 552 # [47]
553 def p_SpecialOperation(self, p):
554 """SpecialOperation : Special Specials ReturnType OperationRest"""
555 p[4].AddChildren(ListFromConcat(p[1], p[2], p[3]))
556 p[0] = p[4]
557
558 # [48]
490 def p_Specials(self, p): 559 def p_Specials(self, p):
491 """Specials : Special Specials 560 """Specials : Special Specials
492 | """ 561 | """
493 if len(p) > 1: 562 if len(p) > 1:
494 p[0] = ListFromConcat(p[1], p[2]) 563 p[0] = ListFromConcat(p[1], p[2])
495 564
496 # [38] 565 # [49]
497 def p_Special(self, p): 566 def p_Special(self, p):
498 """Special : GETTER 567 """Special : GETTER
499 | SETTER 568 | SETTER
500 | CREATOR 569 | CREATOR
501 | DELETER 570 | DELETER
502 | LEGACYCALLER""" 571 | LEGACYCALLER"""
503 p[0] = self.BuildTrue(p[1].upper()) 572 p[0] = self.BuildTrue(p[1].upper())
504 573
574 # [50] Removed unsupported: IteratorRest
575 def p_OperationOrIteratorRest(self, p):
576 """OperationOrIteratorRest : OperationRest"""
577 p[0] = p[1]
505 578
506 # [39] 579 # [51]
580 # def p_IteratorRest(self, p):
581 # """IteratorRest : ITERATOR OptionalIteratorInterfaceOrObject ';'"""
582 # NOT_IMPLEMENTED
583
584 # [52]
585 # def p_OptionalIteratorInterfaceOrObject(self, p):
586 # """OptionalIteratorInterfaceOrObject : OptionalIteratorInterface
587 # | OBJECT"""
588 # NOT_IMPLEMENTED
589
590 # [53]
591 # def p_OptionalIteratorInterface(self, p):
592 # """OptionalIteratorInterface : '=' identifier
593 # |"""
594 # NOT_IMPLEMENTED
595
596 # [54]
507 def p_OperationRest(self, p): 597 def p_OperationRest(self, p):
508 """OperationRest : ReturnType OptionalIdentifier '(' ArgumentList ')' ';'""" 598 """OperationRest : OptionalIdentifier '(' ArgumentList ')' ';'"""
509 arguments = self.BuildProduction('Arguments', p, 3, p[4]) 599 arguments = self.BuildProduction('Arguments', p, 2, p[3])
510 p[0] = self.BuildNamed('Operation', p, 2, ListFromConcat(p[1], arguments)) 600 p[0] = self.BuildNamed('Operation', p, 1, arguments)
511 601
512 # [40] 602 # [55]
513 def p_OptionalIdentifier(self, p): 603 def p_OptionalIdentifier(self, p):
514 """OptionalIdentifier : identifier 604 """OptionalIdentifier : identifier
515 |""" 605 |"""
516 if len(p) > 1: 606 if len(p) > 1:
517 p[0] = p[1] 607 p[0] = p[1]
518 else: 608 else:
519 p[0] = '_unnamed_' 609 p[0] = '_unnamed_'
520 610
521 # [41] 611 # [56]
522 def p_ArgumentList(self, p): 612 def p_ArgumentList(self, p):
523 """ArgumentList : Argument Arguments 613 """ArgumentList : Argument Arguments
524 |""" 614 |"""
525 if len(p) > 1: 615 if len(p) > 1:
526 p[0] = ListFromConcat(p[1], p[2]) 616 p[0] = ListFromConcat(p[1], p[2])
527 617
528 # [41.1] ArgumentList error recovery 618 # [56.1] ArgumentList error recovery
529 def p_ArgumentListError(self, p): 619 def p_ArgumentListError(self, p):
530 """ArgumentList : error """ 620 """ArgumentList : error """
531 p[0] = self.BuildError(p, 'ArgumentList') 621 p[0] = self.BuildError(p, 'ArgumentList')
532 622
533 # [42] 623 # [57]
534 def p_Arguments(self, p): 624 def p_Arguments(self, p):
535 """Arguments : ',' Argument Arguments 625 """Arguments : ',' Argument Arguments
536 |""" 626 |"""
537 if len(p) > 1: 627 if len(p) > 1:
538 p[0] = ListFromConcat(p[2], p[3]) 628 p[0] = ListFromConcat(p[2], p[3])
539 629
540 # [43] 630 # [58]
541 def p_Argument(self, p): 631 def p_Argument(self, p):
542 """Argument : ExtendedAttributeList OptionalOrRequiredArgument""" 632 """Argument : ExtendedAttributeList OptionalOrRequiredArgument"""
543 p[2].AddChildren(p[1]) 633 p[2].AddChildren(p[1])
544 p[0] = p[2] 634 p[0] = p[2]
545 635
546 636 # [59]
547 # [44]
548 def p_OptionalOrRequiredArgument(self, p): 637 def p_OptionalOrRequiredArgument(self, p):
549 """OptionalOrRequiredArgument : OPTIONAL Type ArgumentName Default 638 """OptionalOrRequiredArgument : OPTIONAL Type ArgumentName Default
550 | Type Ellipsis ArgumentName""" 639 | Type Ellipsis ArgumentName"""
551 if len(p) > 4: 640 if len(p) > 4:
552 arg = self.BuildNamed('Argument', p, 3, ListFromConcat(p[2], p[4])) 641 arg = self.BuildNamed('Argument', p, 3, ListFromConcat(p[2], p[4]))
553 arg.AddChildren(self.BuildTrue('OPTIONAL')) 642 arg.AddChildren(self.BuildTrue('OPTIONAL'))
554 else: 643 else:
555 arg = self.BuildNamed('Argument', p, 3, ListFromConcat(p[1], p[2])) 644 arg = self.BuildNamed('Argument', p, 3, ListFromConcat(p[1], p[2]))
556 p[0] = arg 645 p[0] = arg
557 646
558 # [45] 647 # [60]
559 def p_ArgumentName(self, p): 648 def p_ArgumentName(self, p):
560 """ArgumentName : ArgumentNameKeyword 649 """ArgumentName : ArgumentNameKeyword
561 | identifier""" 650 | identifier"""
562 p[0] = p[1] 651 p[0] = p[1]
563 652
564 # [46] 653 # [61]
565 def p_Ellipsis(self, p): 654 def p_Ellipsis(self, p):
566 """Ellipsis : ELLIPSIS 655 """Ellipsis : ELLIPSIS
567 |""" 656 |"""
568 if len(p) > 1: 657 if len(p) > 1:
569 p[0] = self.BuildNamed('Argument', p, 1) 658 p[0] = self.BuildNamed('Argument', p, 1)
570 p[0].AddChildren(self.BuildTrue('ELLIPSIS')) 659 p[0].AddChildren(self.BuildTrue('ELLIPSIS'))
571 660
572 # [47] 661 # [62]
573 def p_ExceptionMember(self, p): 662 def p_ExceptionMember(self, p):
574 """ExceptionMember : Const 663 """ExceptionMember : Const
575 | ExceptionField""" 664 | ExceptionField"""
576 p[0] = p[1] 665 p[0] = p[1]
577 666
578 # [48] 667 # [63]
579 def p_ExceptionField(self, p): 668 def p_ExceptionField(self, p):
580 """ExceptionField : Type identifier ';'""" 669 """ExceptionField : Type identifier ';'"""
581 p[0] = self.BuildNamed('ExceptionField', p, 2, p[1]) 670 p[0] = self.BuildNamed('ExceptionField', p, 2, p[1])
582 671
583 # [48.1] Error recovery for ExceptionMembers 672 # [63.1] Error recovery for ExceptionMembers
584 def p_ExceptionFieldError(self, p): 673 def p_ExceptionFieldError(self, p):
585 """ExceptionField : error""" 674 """ExceptionField : error"""
586 p[0] = self.BuildError(p, 'ExceptionField') 675 p[0] = self.BuildError(p, 'ExceptionField')
587 676
588 # [49] No comment version for mid statement attributes. 677 # [64] No comment version for mid statement attributes.
589 def p_ExtendedAttributeListNoComments(self, p): 678 def p_ExtendedAttributeListNoComments(self, p):
590 """ExtendedAttributeListNoComments : '[' ExtendedAttribute ExtendedAttribute s ']' 679 """ExtendedAttributeListNoComments : '[' ExtendedAttribute ExtendedAttribute s ']'
591 | """ 680 | """
592 if len(p) > 2: 681 if len(p) > 2:
593 items = ListFromConcat(p[2], p[3]) 682 items = ListFromConcat(p[2], p[3])
594 p[0] = self.BuildProduction('ExtAttributes', p, 1, items) 683 p[0] = self.BuildProduction('ExtAttributes', p, 1, items)
595 684
596 # [49.1] Add optional comment field for start of statements. 685 # [64.1] Add optional comment field for start of statements.
597 def p_ExtendedAttributeList(self, p): 686 def p_ExtendedAttributeList(self, p):
598 """ExtendedAttributeList : Comments '[' ExtendedAttribute ExtendedAttributes ']' 687 """ExtendedAttributeList : Comments '[' ExtendedAttribute ExtendedAttributes ']'
599 | Comments """ 688 | Comments """
600 if len(p) > 2: 689 if len(p) > 2:
601 items = ListFromConcat(p[3], p[4]) 690 items = ListFromConcat(p[3], p[4])
602 attribs = self.BuildProduction('ExtAttributes', p, 2, items) 691 attribs = self.BuildProduction('ExtAttributes', p, 2, items)
603 p[0] = ListFromConcat(p[1], attribs) 692 p[0] = ListFromConcat(p[1], attribs)
604 else: 693 else:
605 p[0] = p[1] 694 p[0] = p[1]
606 695
607 # [50] 696 # [65]
608 def p_ExtendedAttributes(self, p): 697 def p_ExtendedAttributes(self, p):
609 """ExtendedAttributes : ',' ExtendedAttribute ExtendedAttributes 698 """ExtendedAttributes : ',' ExtendedAttribute ExtendedAttributes
610 |""" 699 |"""
611 if len(p) > 1: 700 if len(p) > 1:
612 p[0] = ListFromConcat(p[2], p[3]) 701 p[0] = ListFromConcat(p[2], p[3])
613 702
614 # We only support: 703 # We only support:
615 # [ identifier ] 704 # [ identifier ]
616 # [ identifier = identifier ] 705 # [ identifier = identifier ]
617 # [ identifier ( ArgumentList )] 706 # [ identifier ( ArgumentList )]
618 # [ identifier = identifier ( ArgumentList )] 707 # [ identifier = identifier ( ArgumentList )]
619 # [51] map directly to 74-77 708 # [66] map directly to [91-93, 95]
620 # [52-54, 56] are unsupported 709 # [67-69, 71] are unsupported
621 def p_ExtendedAttribute(self, p): 710 def p_ExtendedAttribute(self, p):
622 """ExtendedAttribute : ExtendedAttributeNoArgs 711 """ExtendedAttribute : ExtendedAttributeNoArgs
623 | ExtendedAttributeArgList 712 | ExtendedAttributeArgList
624 | ExtendedAttributeIdent 713 | ExtendedAttributeIdent
625 | ExtendedAttributeNamedArgList""" 714 | ExtendedAttributeNamedArgList"""
626 p[0] = p[1] 715 p[0] = p[1]
627 716
628 # [55] 717 # [70]
629 def p_ArgumentNameKeyword(self, p): 718 def p_ArgumentNameKeyword(self, p):
630 """ArgumentNameKeyword : ATTRIBUTE 719 """ArgumentNameKeyword : ATTRIBUTE
631 | CALLBACK 720 | CALLBACK
632 | CONST 721 | CONST
633 | CREATOR 722 | CREATOR
634 | DELETER 723 | DELETER
635 | DICTIONARY 724 | DICTIONARY
636 | ENUM 725 | ENUM
637 | EXCEPTION 726 | EXCEPTION
638 | GETTER 727 | GETTER
639 | IMPLEMENTS 728 | IMPLEMENTS
640 | INHERIT 729 | INHERIT
641 | LEGACYCALLER 730 | LEGACYCALLER
642 | PARTIAL 731 | PARTIAL
732 | SERIALIZER
643 | SETTER 733 | SETTER
644 | STATIC 734 | STATIC
645 | STRINGIFIER 735 | STRINGIFIER
646 | TYPEDEF 736 | TYPEDEF
647 | UNRESTRICTED""" 737 | UNRESTRICTED"""
648 p[0] = p[1] 738 p[0] = p[1]
649 739
650 # [57] 740 # [72]
651 def p_Type(self, p): 741 def p_Type(self, p):
652 """Type : SingleType 742 """Type : SingleType
653 | UnionType TypeSuffix""" 743 | UnionType TypeSuffix"""
654 if len(p) == 2: 744 if len(p) == 2:
655 p[0] = self.BuildProduction('Type', p, 1, p[1]) 745 p[0] = self.BuildProduction('Type', p, 1, p[1])
656 else: 746 else:
657 p[0] = self.BuildProduction('Type', p, 1, ListFromConcat(p[1], p[2])) 747 p[0] = self.BuildProduction('Type', p, 1, ListFromConcat(p[1], p[2]))
658 748
659 # [58] 749 # [73]
660 def p_SingleType(self, p): 750 def p_SingleType(self, p):
661 """SingleType : NonAnyType 751 """SingleType : NonAnyType
662 | ANY TypeSuffixStartingWithArray""" 752 | ANY TypeSuffixStartingWithArray"""
663 if len(p) == 2: 753 if len(p) == 2:
664 p[0] = p[1] 754 p[0] = p[1]
665 else: 755 else:
666 p[0] = ListFromConcat(self.BuildProduction('Any', p, 1), p[2]) 756 p[0] = ListFromConcat(self.BuildProduction('Any', p, 1), p[2])
667 757
668 # [59] 758 # [74]
669 def p_UnionType(self, p): 759 def p_UnionType(self, p):
670 """UnionType : '(' UnionMemberType OR UnionMemberType UnionMemberTypes ')'"" " 760 """UnionType : '(' UnionMemberType OR UnionMemberType UnionMemberTypes ')'"" "
671 761
672 # [60] 762 # [75]
673 def p_UnionMemberType(self, p): 763 def p_UnionMemberType(self, p):
674 """UnionMemberType : NonAnyType 764 """UnionMemberType : NonAnyType
675 | UnionType TypeSuffix 765 | UnionType TypeSuffix
676 | ANY '[' ']' TypeSuffix""" 766 | ANY '[' ']' TypeSuffix"""
677 # [61] 767 # [76]
678 def p_UnionMemberTypes(self, p): 768 def p_UnionMemberTypes(self, p):
679 """UnionMemberTypes : OR UnionMemberType UnionMemberTypes 769 """UnionMemberTypes : OR UnionMemberType UnionMemberTypes
680 |""" 770 |"""
681 771
682 # [62] Moved DATE, DOMSTRING, OBJECT to PrimitiveType 772 # [77] Moved BYTESTRING, DOMSTRING, OBJECT, DATE, REGEXP to PrimitiveType
Jens Widell 2014/06/12 13:34:36 I don't know why any of these are moved, but I gue
noelallen1 2014/06/12 20:39:31 Moved just to make parsing easier. Otherwise it's
Nils Barth (inactive) 2014/06/16 06:50:47 Thanks for explaining! Could this be aligned with
Jens Widell 2014/06/16 10:53:11 Aligning with spec would not more difficult than d
Nils Barth (inactive) 2014/06/17 05:08:18 That sounds great! (Agreed that "primitive type" i
Jens Widell 2014/06/17 06:18:37 "Not more difficult" was apparently a bit optimist
Nils Barth (inactive) 2014/06/17 06:28:25 Got it; that's a lot of work for minor spec compli
683 def p_NonAnyType(self, p): 773 def p_NonAnyType(self, p):
684 """NonAnyType : PrimitiveType TypeSuffix 774 """NonAnyType : PrimitiveType TypeSuffix
685 | identifier TypeSuffix 775 | identifier TypeSuffix
686 | SEQUENCE '<' Type '>' Null""" 776 | SEQUENCE '<' Type '>' Null"""
687 if len(p) == 3: 777 if len(p) == 3:
688 if type(p[1]) == str: 778 if type(p[1]) == str:
689 typeref = self.BuildNamed('Typeref', p, 1) 779 typeref = self.BuildNamed('Typeref', p, 1)
690 else: 780 else:
691 typeref = p[1] 781 typeref = p[1]
692 p[0] = ListFromConcat(typeref, p[2]) 782 p[0] = ListFromConcat(typeref, p[2])
693 783
694 if len(p) == 6: 784 if len(p) == 6:
695 p[0] = self.BuildProduction('Sequence', p, 1, ListFromConcat(p[3], p[5])) 785 p[0] = self.BuildProduction('Sequence', p, 1, ListFromConcat(p[3], p[5]))
696 786
697 787
698 # [63] 788 # [78]
699 def p_ConstType(self, p): 789 def p_ConstType(self, p):
700 """ConstType : PrimitiveType Null 790 """ConstType : PrimitiveType Null
701 | identifier Null""" 791 | identifier Null"""
702 if type(p[1]) == str: 792 if type(p[1]) == str:
703 p[0] = self.BuildNamed('Typeref', p, 1, p[2]) 793 p[0] = self.BuildNamed('Typeref', p, 1, p[2])
704 else: 794 else:
705 p[1].AddChildren(p[2]) 795 p[1].AddChildren(p[2])
706 p[0] = p[1] 796 p[0] = p[1]
707 797
708 798
709 # [64] 799 # [79]
710 def p_PrimitiveType(self, p): 800 def p_PrimitiveType(self, p):
711 """PrimitiveType : UnsignedIntegerType 801 """PrimitiveType : UnsignedIntegerType
712 | UnrestrictedFloatType 802 | UnrestrictedFloatType
713 | BOOLEAN 803 | BOOLEAN
714 | BYTE 804 | BYTE
715 | OCTET 805 | OCTET
806 | BYTESTRING
716 | DOMSTRING 807 | DOMSTRING
808 | OBJECT
717 | DATE 809 | DATE
718 | OBJECT""" 810 | REGEXP"""
719 if type(p[1]) == str: 811 if type(p[1]) == str:
720 p[0] = self.BuildNamed('PrimitiveType', p, 1) 812 p[0] = self.BuildNamed('PrimitiveType', p, 1)
721 else: 813 else:
722 p[0] = p[1] 814 p[0] = p[1]
723 815
724 816
725 # [65] 817 # [80]
726 def p_UnrestrictedFloatType(self, p): 818 def p_UnrestrictedFloatType(self, p):
727 """UnrestrictedFloatType : UNRESTRICTED FloatType 819 """UnrestrictedFloatType : UNRESTRICTED FloatType
728 | FloatType""" 820 | FloatType"""
729 if len(p) == 2: 821 if len(p) == 2:
730 typeref = self.BuildNamed('PrimitiveType', p, 1) 822 typeref = self.BuildNamed('PrimitiveType', p, 1)
731 else: 823 else:
732 typeref = self.BuildNamed('PrimitiveType', p, 2) 824 typeref = self.BuildNamed('PrimitiveType', p, 2)
733 typeref.AddChildren(self.BuildTrue('UNRESTRICTED')) 825 typeref.AddChildren(self.BuildTrue('UNRESTRICTED'))
734 p[0] = typeref 826 p[0] = typeref
735 827
736 828
737 # [66] 829 # [81]
738 def p_FloatType(self, p): 830 def p_FloatType(self, p):
739 """FloatType : FLOAT 831 """FloatType : FLOAT
740 | DOUBLE""" 832 | DOUBLE"""
741 p[0] = p[1] 833 p[0] = p[1]
742 834
743 # [67] 835 # [82]
744 def p_UnsignedIntegerType(self, p): 836 def p_UnsignedIntegerType(self, p):
745 """UnsignedIntegerType : UNSIGNED IntegerType 837 """UnsignedIntegerType : UNSIGNED IntegerType
746 | IntegerType""" 838 | IntegerType"""
747 if len(p) == 2: 839 if len(p) == 2:
748 p[0] = p[1] 840 p[0] = p[1]
749 else: 841 else:
750 p[0] = 'unsigned ' + p[2] 842 p[0] = 'unsigned ' + p[2]
751 843
752 # [68] 844 # [83]
753 def p_IntegerType(self, p): 845 def p_IntegerType(self, p):
754 """IntegerType : SHORT 846 """IntegerType : SHORT
755 | LONG OptionalLong""" 847 | LONG OptionalLong"""
756 if len(p) == 2: 848 if len(p) == 2:
757 p[0] = p[1] 849 p[0] = p[1]
758 else: 850 else:
759 p[0] = p[1] + p[2] 851 p[0] = p[1] + p[2]
760 852
761 # [69] 853 # [84]
762 def p_OptionalLong(self, p): 854 def p_OptionalLong(self, p):
763 """OptionalLong : LONG 855 """OptionalLong : LONG
764 | """ 856 | """
765 if len(p) > 1: 857 if len(p) > 1:
766 p[0] = ' ' + p[1] 858 p[0] = ' ' + p[1]
767 else: 859 else:
768 p[0] = '' 860 p[0] = ''
769 861
770 862
771 # [70] Add support for sized array 863 # [85] Add support for sized array
772 def p_TypeSuffix(self, p): 864 def p_TypeSuffix(self, p):
773 """TypeSuffix : '[' integer ']' TypeSuffix 865 """TypeSuffix : '[' integer ']' TypeSuffix
774 | '[' ']' TypeSuffix 866 | '[' ']' TypeSuffix
775 | '?' TypeSuffixStartingWithArray 867 | '?' TypeSuffixStartingWithArray
776 | """ 868 | """
777 if len(p) == 5: 869 if len(p) == 5:
778 p[0] = self.BuildNamed('Array', p, 2, p[4]) 870 p[0] = self.BuildNamed('Array', p, 2, p[4])
779 871
780 if len(p) == 4: 872 if len(p) == 4:
781 p[0] = self.BuildProduction('Array', p, 1, p[3]) 873 p[0] = self.BuildProduction('Array', p, 1, p[3])
782 874
783 if len(p) == 3: 875 if len(p) == 3:
784 p[0] = ListFromConcat(self.BuildTrue('NULLABLE'), p[2]) 876 p[0] = ListFromConcat(self.BuildTrue('NULLABLE'), p[2])
785 877
786 878
787 # [71] 879 # [86]
788 def p_TypeSuffixStartingWithArray(self, p): 880 def p_TypeSuffixStartingWithArray(self, p):
789 """TypeSuffixStartingWithArray : '[' ']' TypeSuffix 881 """TypeSuffixStartingWithArray : '[' ']' TypeSuffix
790 | """ 882 | """
791 if len(p) > 1: 883 if len(p) > 1:
792 p[0] = self.BuildProduction('Array', p, 0, p[3]) 884 p[0] = self.BuildProduction('Array', p, 0, p[3])
793 885
794 # [72] 886 # [87]
795 def p_Null(self, p): 887 def p_Null(self, p):
796 """Null : '?' 888 """Null : '?'
797 |""" 889 |"""
798 if len(p) > 1: 890 if len(p) > 1:
799 p[0] = self.BuildTrue('NULLABLE') 891 p[0] = self.BuildTrue('NULLABLE')
800 892
801 # [73] 893 # [88]
802 def p_ReturnType(self, p): 894 def p_ReturnType(self, p):
803 """ReturnType : Type 895 """ReturnType : Type
804 | VOID""" 896 | VOID"""
805 if p[1] == 'void': 897 if p[1] == 'void':
806 p[0] = self.BuildProduction('Type', p, 1) 898 p[0] = self.BuildProduction('Type', p, 1)
807 p[0].AddChildren(self.BuildNamed('PrimitiveType', p, 1)) 899 p[0].AddChildren(self.BuildNamed('PrimitiveType', p, 1))
808 else: 900 else:
809 p[0] = p[1] 901 p[0] = p[1]
810 902
811 # [74] 903 # [89]
904 #def p_IdentifierList(self, p):
905 # """IdentifierList : identifier Identifiers"""
906 # p[0] = ListFromConcat(p[1], p[2])
907
908 # [90]
909 #def p_Identifiers(self, p):
Jens Widell 2014/06/12 13:34:36 Note that this is identical to [37]. Reported http
910 # """Identifiers : ',' identifier Identifiers
911 # |"""
912 # if len(p) > 1:
913 # p[0] = ListFromConcat(p[2], p[3])
914
915 # [91]
812 def p_ExtendedAttributeNoArgs(self, p): 916 def p_ExtendedAttributeNoArgs(self, p):
813 """ExtendedAttributeNoArgs : identifier""" 917 """ExtendedAttributeNoArgs : identifier"""
814 p[0] = self.BuildNamed('ExtAttribute', p, 1) 918 p[0] = self.BuildNamed('ExtAttribute', p, 1)
815 919
816 # [75] 920 # [92]
817 def p_ExtendedAttributeArgList(self, p): 921 def p_ExtendedAttributeArgList(self, p):
818 """ExtendedAttributeArgList : identifier '(' ArgumentList ')'""" 922 """ExtendedAttributeArgList : identifier '(' ArgumentList ')'"""
819 arguments = self.BuildProduction('Arguments', p, 2, p[3]) 923 arguments = self.BuildProduction('Arguments', p, 2, p[3])
820 p[0] = self.BuildNamed('ExtAttribute', p, 1, arguments) 924 p[0] = self.BuildNamed('ExtAttribute', p, 1, arguments)
821 925
822 # [76] 926 # [93]
823 def p_ExtendedAttributeIdent(self, p): 927 def p_ExtendedAttributeIdent(self, p):
824 """ExtendedAttributeIdent : identifier '=' identifier""" 928 """ExtendedAttributeIdent : identifier '=' identifier"""
825 value = self.BuildAttribute('VALUE', p[3]) 929 value = self.BuildAttribute('VALUE', p[3])
826 p[0] = self.BuildNamed('ExtAttribute', p, 1, value) 930 p[0] = self.BuildNamed('ExtAttribute', p, 1, value)
827 931
828 # [77] 932 # [95]
829 def p_ExtendedAttributeNamedArgList(self, p): 933 def p_ExtendedAttributeNamedArgList(self, p):
830 """ExtendedAttributeNamedArgList : identifier '=' identifier '(' ArgumentLis t ')'""" 934 """ExtendedAttributeNamedArgList : identifier '=' identifier '(' ArgumentLis t ')'"""
831 args = self.BuildProduction('Arguments', p, 4, p[5]) 935 args = self.BuildProduction('Arguments', p, 4, p[5])
832 value = self.BuildNamed('Call', p, 3, args) 936 value = self.BuildNamed('Call', p, 3, args)
833 p[0] = self.BuildNamed('ExtAttribute', p, 1, value) 937 p[0] = self.BuildNamed('ExtAttribute', p, 1, value)
834 938
835 # 939 #
836 # Parser Errors 940 # Parser Errors
837 # 941 #
838 # p_error is called whenever the parser can not find a pattern match for 942 # p_error is called whenever the parser can not find a pattern match for
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 1148
1045 print '\n'.join(ast.Tree(accept_props=['PROD'])) 1149 print '\n'.join(ast.Tree(accept_props=['PROD']))
1046 if errors: 1150 if errors:
1047 print '\nFound %d errors.\n' % errors 1151 print '\nFound %d errors.\n' % errors
1048 1152
1049 return errors 1153 return errors
1050 1154
1051 1155
1052 if __name__ == '__main__': 1156 if __name__ == '__main__':
1053 sys.exit(main(sys.argv[1:])) 1157 sys.exit(main(sys.argv[1:]))
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698