OLD | NEW |
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 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 | AttributeOrOperationOrIterator""" | 265 | AttributeOrOperationOrIterator""" |
266 p[0] = p[1] | 266 p[0] = p[1] |
267 | 267 |
| 268 # [10.1] Removed unsupported: Serializer |
| 269 def p_AttributeOrOperationOrIterator(self, p): |
| 270 """AttributeOrOperationOrIterator : Stringifier |
| 271 | StaticMember |
| 272 | ReadWriteAttribute |
| 273 | OperationOrIterator""" |
| 274 p[0] = p[1] |
| 275 |
268 # [11] | 276 # [11] |
269 def p_Dictionary(self, p): | 277 def p_Dictionary(self, p): |
270 """Dictionary : DICTIONARY identifier Inheritance '{' DictionaryMembers '}'
';'""" | 278 """Dictionary : DICTIONARY identifier Inheritance '{' DictionaryMembers '}'
';'""" |
271 p[0] = self.BuildNamed('Dictionary', p, 2, ListFromConcat(p[3], p[5])) | 279 p[0] = self.BuildNamed('Dictionary', p, 2, ListFromConcat(p[3], p[5])) |
272 | 280 |
273 # [11.1] Error recovery for regular Dictionary | 281 # [11.1] Error recovery for regular Dictionary |
274 def p_DictionaryError(self, p): | 282 def p_DictionaryError(self, p): |
275 """Dictionary : DICTIONARY error ';'""" | 283 """Dictionary : DICTIONARY error ';'""" |
276 p[0] = self.BuildError(p, 'Dictionary') | 284 p[0] = self.BuildError(p, 'Dictionary') |
277 | 285 |
278 # [12] | 286 # [12] |
279 def p_DictionaryMembers(self, p): | 287 def p_DictionaryMembers(self, p): |
280 """DictionaryMembers : ExtendedAttributeList DictionaryMember DictionaryMemb
ers | 288 """DictionaryMembers : ExtendedAttributeList DictionaryMember DictionaryMemb
ers |
281 |""" | 289 |""" |
282 if len(p) > 1: | 290 if len(p) > 1: |
283 p[2].AddChildren(p[1]) | 291 p[2].AddChildren(p[1]) |
284 p[0] = ListFromConcat(p[2], p[3]) | 292 p[0] = ListFromConcat(p[2], p[3]) |
285 | 293 |
286 # [13] | 294 # [13] |
287 def p_DictionaryMember(self, p): | 295 def p_DictionaryMember(self, p): |
288 """DictionaryMember : Type identifier Default ';'""" | 296 """DictionaryMember : Type identifier Default ';'""" |
289 p[0] = self.BuildNamed('Key', p, 2, ListFromConcat(p[1], p[3])) | 297 p[0] = self.BuildNamed('Key', p, 2, ListFromConcat(p[1], p[3])) |
290 | 298 |
291 # [14] | 299 # [14] NOT IMPLEMENTED (Required) |
| 300 |
| 301 # [15] |
292 def p_PartialDictionary(self, p): | 302 def p_PartialDictionary(self, p): |
293 """PartialDictionary : DICTIONARY identifier '{' DictionaryMembers '}' ';'""
" | 303 """PartialDictionary : DICTIONARY identifier '{' DictionaryMembers '}' ';'""
" |
294 partial = self.BuildTrue('Partial') | 304 partial = self.BuildTrue('Partial') |
295 p[0] = self.BuildNamed('Dictionary', p, 2, ListFromConcat(p[4], partial)) | 305 p[0] = self.BuildNamed('Dictionary', p, 2, ListFromConcat(p[4], partial)) |
296 | 306 |
297 # [14.1] Error recovery for Partial Dictionary | 307 # [15.1] Error recovery for Partial Dictionary |
298 def p_PartialDictionaryError(self, p): | 308 def p_PartialDictionaryError(self, p): |
299 """PartialDictionary : DICTIONARY error ';'""" | 309 """PartialDictionary : DICTIONARY error ';'""" |
300 p[0] = self.BuildError(p, 'PartialDictionary') | 310 p[0] = self.BuildError(p, 'PartialDictionary') |
301 | 311 |
302 # [15] | 312 # [16] |
303 def p_Default(self, p): | 313 def p_Default(self, p): |
304 """Default : '=' DefaultValue | 314 """Default : '=' DefaultValue |
305 |""" | 315 |""" |
306 if len(p) > 1: | 316 if len(p) > 1: |
307 p[0] = self.BuildProduction('Default', p, 2, p[2]) | 317 p[0] = self.BuildProduction('Default', p, 2, p[2]) |
308 | 318 |
309 # [16] | 319 # [17] |
310 def p_DefaultValue(self, p): | 320 def p_DefaultValue(self, p): |
311 """DefaultValue : ConstValue | 321 """DefaultValue : ConstValue |
312 | string""" | 322 | string""" |
313 if type(p[1]) == str: | 323 if type(p[1]) == str: |
314 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'DOMString'), | 324 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'DOMString'), |
315 self.BuildAttribute('NAME', p[1])) | 325 self.BuildAttribute('NAME', p[1])) |
316 else: | 326 else: |
317 p[0] = p[1] | 327 p[0] = p[1] |
318 | 328 |
319 # [17] | 329 # [] - Not specified |
320 def p_Exception(self, p): | 330 def p_Exception(self, p): |
321 """Exception : EXCEPTION identifier Inheritance '{' ExceptionMembers '}' ';'
""" | 331 """Exception : EXCEPTION identifier Inheritance '{' ExceptionMembers '}' ';'
""" |
322 p[0] = self.BuildNamed('Exception', p, 2, ListFromConcat(p[3], p[5])) | 332 p[0] = self.BuildNamed('Exception', p, 2, ListFromConcat(p[3], p[5])) |
323 | 333 |
324 # [18] | 334 # [] - Not specified |
325 def p_ExceptionMembers(self, p): | 335 def p_ExceptionMembers(self, p): |
326 """ExceptionMembers : ExtendedAttributeList ExceptionMember ExceptionMembers | 336 """ExceptionMembers : ExtendedAttributeList ExceptionMember ExceptionMembers |
327 |""" | 337 |""" |
328 if len(p) > 1: | 338 if len(p) > 1: |
329 p[2].AddChildren(p[1]) | 339 p[2].AddChildren(p[1]) |
330 p[0] = ListFromConcat(p[2], p[3]) | 340 p[0] = ListFromConcat(p[2], p[3]) |
331 | 341 |
332 # [18.1] Error recovery for ExceptionMembers | 342 # [.1] Error recovery for ExceptionMembers - Not specified |
333 def p_ExceptionMembersError(self, p): | 343 def p_ExceptionMembersError(self, p): |
334 """ExceptionMembers : error""" | 344 """ExceptionMembers : error""" |
335 p[0] = self.BuildError(p, 'ExceptionMembers') | 345 p[0] = self.BuildError(p, 'ExceptionMembers') |
336 | 346 |
337 # [19] | 347 # [18] |
338 def p_Inheritance(self, p): | 348 def p_Inheritance(self, p): |
339 """Inheritance : ':' identifier | 349 """Inheritance : ':' identifier |
340 |""" | 350 |""" |
341 if len(p) > 1: | 351 if len(p) > 1: |
342 p[0] = self.BuildNamed('Inherit', p, 2) | 352 p[0] = self.BuildNamed('Inherit', p, 2) |
343 | 353 |
344 # [20] | 354 # [19] |
345 def p_Enum(self, p): | 355 def p_Enum(self, p): |
346 """Enum : ENUM identifier '{' EnumValueList '}' ';'""" | 356 """Enum : ENUM identifier '{' EnumValueList '}' ';'""" |
347 p[0] = self.BuildNamed('Enum', p, 2, p[4]) | 357 p[0] = self.BuildNamed('Enum', p, 2, p[4]) |
348 | 358 |
349 # [20.1] Error recovery for Enums | 359 # [19.1] Error recovery for Enums |
350 def p_EnumError(self, p): | 360 def p_EnumError(self, p): |
351 """Enum : ENUM error ';'""" | 361 """Enum : ENUM error ';'""" |
352 p[0] = self.BuildError(p, 'Enum') | 362 p[0] = self.BuildError(p, 'Enum') |
353 | 363 |
354 # [21] | 364 # [20] |
355 def p_EnumValueList(self, p): | 365 def p_EnumValueList(self, p): |
356 """EnumValueList : ExtendedAttributeList string EnumValueListComma""" | 366 """EnumValueList : ExtendedAttributeList string EnumValueListComma""" |
357 enum = self.BuildNamed('EnumItem', p, 2, p[1]) | 367 enum = self.BuildNamed('EnumItem', p, 2, p[1]) |
358 p[0] = ListFromConcat(enum, p[3]) | 368 p[0] = ListFromConcat(enum, p[3]) |
359 | 369 |
360 # [22] | 370 # [21] |
361 def p_EnumValueListComma(self, p): | 371 def p_EnumValueListComma(self, p): |
362 """EnumValueListComma : ',' EnumValueListString | 372 """EnumValueListComma : ',' EnumValueListString |
363 |""" | 373 |""" |
364 if len(p) > 1: | 374 if len(p) > 1: |
365 p[0] = p[2] | 375 p[0] = p[2] |
366 | 376 |
367 # [23] | 377 # [22] |
368 def p_EnumValueListString(self, p): | 378 def p_EnumValueListString(self, p): |
369 """EnumValueListString : ExtendedAttributeList string EnumValueListComma | 379 """EnumValueListString : ExtendedAttributeList string EnumValueListComma |
370 |""" | 380 |""" |
371 if len(p) > 1: | 381 if len(p) > 1: |
372 enum = self.BuildNamed('EnumItem', p, 2, p[1]) | 382 enum = self.BuildNamed('EnumItem', p, 2, p[1]) |
373 p[0] = ListFromConcat(enum, p[3]) | 383 p[0] = ListFromConcat(enum, p[3]) |
374 | 384 |
375 # [24] | 385 # [23] |
376 def p_CallbackRest(self, p): | 386 def p_CallbackRest(self, p): |
377 """CallbackRest : identifier '=' ReturnType '(' ArgumentList ')' ';'""" | 387 """CallbackRest : identifier '=' ReturnType '(' ArgumentList ')' ';'""" |
378 arguments = self.BuildProduction('Arguments', p, 4, p[5]) | 388 arguments = self.BuildProduction('Arguments', p, 4, p[5]) |
379 p[0] = self.BuildNamed('Callback', p, 1, ListFromConcat(p[3], arguments)) | 389 p[0] = self.BuildNamed('Callback', p, 1, ListFromConcat(p[3], arguments)) |
380 | 390 |
381 # [25] | 391 # [24] |
382 def p_Typedef(self, p): | 392 def p_Typedef(self, p): |
383 """Typedef : TYPEDEF ExtendedAttributeListNoComments Type identifier ';'""" | 393 """Typedef : TYPEDEF ExtendedAttributeListNoComments Type identifier ';'""" |
384 p[0] = self.BuildNamed('Typedef', p, 4, ListFromConcat(p[2], p[3])) | 394 p[0] = self.BuildNamed('Typedef', p, 4, ListFromConcat(p[2], p[3])) |
385 | 395 |
386 # [25.1] Error recovery for Typedefs | 396 # [24.1] Error recovery for Typedefs |
387 def p_TypedefError(self, p): | 397 def p_TypedefError(self, p): |
388 """Typedef : TYPEDEF error ';'""" | 398 """Typedef : TYPEDEF error ';'""" |
389 p[0] = self.BuildError(p, 'Typedef') | 399 p[0] = self.BuildError(p, 'Typedef') |
390 | 400 |
391 # [26] | 401 # [25] |
392 def p_ImplementsStatement(self, p): | 402 def p_ImplementsStatement(self, p): |
393 """ImplementsStatement : identifier IMPLEMENTS identifier ';'""" | 403 """ImplementsStatement : identifier IMPLEMENTS identifier ';'""" |
394 name = self.BuildAttribute('REFERENCE', p[3]) | 404 name = self.BuildAttribute('REFERENCE', p[3]) |
395 p[0] = self.BuildNamed('Implements', p, 1, name) | 405 p[0] = self.BuildNamed('Implements', p, 1, name) |
396 | 406 |
397 # [27] | 407 # [26] |
398 def p_Const(self, p): | 408 def p_Const(self, p): |
399 """Const : CONST ConstType identifier '=' ConstValue ';'""" | 409 """Const : CONST ConstType identifier '=' ConstValue ';'""" |
400 value = self.BuildProduction('Value', p, 5, p[5]) | 410 value = self.BuildProduction('Value', p, 5, p[5]) |
401 p[0] = self.BuildNamed('Const', p, 3, ListFromConcat(p[2], value)) | 411 p[0] = self.BuildNamed('Const', p, 3, ListFromConcat(p[2], value)) |
402 | 412 |
403 # [28] | 413 # [27] |
404 def p_ConstValue(self, p): | 414 def p_ConstValue(self, p): |
405 """ConstValue : BooleanLiteral | 415 """ConstValue : BooleanLiteral |
406 | FloatLiteral | 416 | FloatLiteral |
407 | integer | 417 | integer |
408 | null""" | 418 | null""" |
409 if type(p[1]) == str: | 419 if type(p[1]) == str: |
410 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'integer'), | 420 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'integer'), |
411 self.BuildAttribute('NAME', p[1])) | 421 self.BuildAttribute('NAME', p[1])) |
412 else: | 422 else: |
413 p[0] = p[1] | 423 p[0] = p[1] |
414 | 424 |
415 # [28.1] Add definition for NULL | 425 # [27.1] Add definition for NULL |
416 def p_null(self, p): | 426 def p_null(self, p): |
417 """null : NULL""" | 427 """null : NULL""" |
418 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'NULL'), | 428 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'NULL'), |
419 self.BuildAttribute('NAME', 'NULL')) | 429 self.BuildAttribute('NAME', 'NULL')) |
420 | 430 |
421 # [29] | 431 # [28] |
422 def p_BooleanLiteral(self, p): | 432 def p_BooleanLiteral(self, p): |
423 """BooleanLiteral : TRUE | 433 """BooleanLiteral : TRUE |
424 | FALSE""" | 434 | FALSE""" |
425 value = self.BuildAttribute('VALUE', Boolean(p[1] == 'true')) | 435 value = self.BuildAttribute('VALUE', Boolean(p[1] == 'true')) |
426 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'boolean'), value) | 436 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'boolean'), value) |
427 | 437 |
428 # [30] | 438 # [29] |
429 def p_FloatLiteral(self, p): | 439 def p_FloatLiteral(self, p): |
430 """FloatLiteral : float | 440 """FloatLiteral : float |
431 | '-' INFINITY | 441 | '-' INFINITY |
432 | INFINITY | 442 | INFINITY |
433 | NAN """ | 443 | NAN """ |
434 if len(p) > 2: | 444 if len(p) > 2: |
435 val = '-Infinity' | 445 val = '-Infinity' |
436 else: | 446 else: |
437 val = p[1] | 447 val = p[1] |
438 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'float'), | 448 p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'float'), |
439 self.BuildAttribute('VALUE', val)) | 449 self.BuildAttribute('VALUE', val)) |
440 | 450 |
441 # [31] Removed unsupported: Serializer | 451 # [30-34] NOT IMPLEMENTED (Serializer) |
442 def p_AttributeOrOperationOrIterator(self, p): | |
443 """AttributeOrOperationOrIterator : Stringifier | |
444 | StaticMember | |
445 | Attribute | |
446 | OperationOrIterator""" | |
447 p[0] = p[1] | |
448 | 452 |
449 # [32-37] NOT IMPLEMENTED (Serializer) | 453 # [35] |
450 | |
451 # [38] | |
452 def p_Stringifier(self, p): | 454 def p_Stringifier(self, p): |
453 """Stringifier : STRINGIFIER StringifierRest""" | 455 """Stringifier : STRINGIFIER StringifierRest""" |
454 p[0] = self.BuildProduction('Stringifier', p, 1, p[2]) | 456 p[0] = self.BuildProduction('Stringifier', p, 1, p[2]) |
455 | 457 |
456 # [39] | 458 # [36] |
457 def p_StringifierRest(self, p): | 459 def p_StringifierRest(self, p): |
458 """StringifierRest : AttributeRest | 460 """StringifierRest : AttributeRest |
459 | ReturnType OperationRest | 461 | ReturnType OperationRest |
460 | ';'""" | 462 | ';'""" |
461 if len(p) == 3: | 463 if len(p) == 3: |
462 p[2].AddChildren(p[1]) | 464 p[2].AddChildren(p[1]) |
463 p[0] = p[2] | 465 p[0] = p[2] |
464 elif p[1] != ';': | 466 elif p[1] != ';': |
465 p[0] = p[1] | 467 p[0] = p[1] |
466 | 468 |
467 # [40] | 469 # [37] |
468 def p_StaticMember(self, p): | 470 def p_StaticMember(self, p): |
469 """StaticMember : STATIC StaticMemberRest""" | 471 """StaticMember : STATIC StaticMemberRest""" |
470 p[2].AddChildren(self.BuildTrue('STATIC')) | 472 p[2].AddChildren(self.BuildTrue('STATIC')) |
471 p[0] = p[2] | 473 p[0] = p[2] |
472 | 474 |
473 # [41] | 475 # [38] |
474 def p_StaticMemberRest(self, p): | 476 def p_StaticMemberRest(self, p): |
475 """StaticMemberRest : AttributeRest | 477 """StaticMemberRest : AttributeRest |
476 | ReturnType OperationRest""" | 478 | ReturnType OperationRest""" |
477 if len(p) == 2: | 479 if len(p) == 2: |
478 p[0] = p[1] | 480 p[0] = p[1] |
479 else: | 481 else: |
480 p[2].AddChildren(p[1]) | 482 p[2].AddChildren(p[1]) |
481 p[0] = p[2] | 483 p[0] = p[2] |
482 | 484 |
483 # [42] | 485 # [39] NOT IMPLEMENTED (ReadOnlyMember) |
484 def p_Attribute(self, p): | 486 # [40] NOT IMPLEMENTED (ReadOnlyMemberReset) |
485 """Attribute : Inherit AttributeRest""" | 487 |
| 488 # [41] |
| 489 def p_ReadWriteAttribute(self, p): |
| 490 """ReadWriteAttribute : Inherit AttributeRest""" |
486 p[2].AddChildren(ListFromConcat(p[1])) | 491 p[2].AddChildren(ListFromConcat(p[1])) |
487 p[0] = p[2] | 492 p[0] = p[2] |
488 | 493 |
489 # [43] | 494 # [41] Deprecated - Remove this entry after blink stops using it. |
| 495 def p_Attribute(self, p): |
| 496 """Attribute : ReadWriteAttribute""" |
| 497 p[0] = p[1] |
| 498 |
| 499 # [42] |
490 def p_AttributeRest(self, p): | 500 def p_AttributeRest(self, p): |
491 """AttributeRest : ReadOnly ATTRIBUTE Type identifier ';'""" | 501 """AttributeRest : ReadOnly ATTRIBUTE Type identifier ';'""" |
492 p[0] = self.BuildNamed('Attribute', p, 4, | 502 p[0] = self.BuildNamed('Attribute', p, 4, |
493 ListFromConcat(p[1], p[3])) | 503 ListFromConcat(p[1], p[3])) |
494 | 504 |
495 # [44] | 505 # [43] NOT IMPLEMENTED (AttributeName) |
| 506 # [44] NOT IMPLEMENTED (AttributeNameKeyword) |
| 507 |
| 508 # [45] |
496 def p_Inherit(self, p): | 509 def p_Inherit(self, p): |
497 """Inherit : INHERIT | 510 """Inherit : INHERIT |
498 |""" | 511 |""" |
499 if len(p) > 1: | 512 if len(p) > 1: |
500 p[0] = self.BuildTrue('INHERIT') | 513 p[0] = self.BuildTrue('INHERIT') |
501 | 514 |
502 # [45] | 515 # [46] |
503 def p_ReadOnly(self, p): | 516 def p_ReadOnly(self, p): |
504 """ReadOnly : READONLY | 517 """ReadOnly : READONLY |
505 |""" | 518 |""" |
506 if len(p) > 1: | 519 if len(p) > 1: |
507 p[0] = self.BuildTrue('READONLY') | 520 p[0] = self.BuildTrue('READONLY') |
508 | 521 |
509 # [46] | 522 # [47] |
510 def p_OperationOrIterator(self, p): | 523 def p_OperationOrIterator(self, p): |
511 """OperationOrIterator : ReturnType OperationOrIteratorRest | 524 """OperationOrIterator : ReturnType OperationOrIteratorRest |
512 | SpecialOperation""" | 525 | SpecialOperation""" |
513 if len(p) == 3: | 526 if len(p) == 3: |
514 p[2].AddChildren(p[1]) | 527 p[2].AddChildren(p[1]) |
515 p[0] = p[2] | 528 p[0] = p[2] |
516 else: | 529 else: |
517 p[0] = p[1] | 530 p[0] = p[1] |
518 | 531 |
519 # [47] | 532 # [48] |
520 def p_SpecialOperation(self, p): | 533 def p_SpecialOperation(self, p): |
521 """SpecialOperation : Special Specials ReturnType OperationRest""" | 534 """SpecialOperation : Special Specials ReturnType OperationRest""" |
522 p[4].AddChildren(ListFromConcat(p[1], p[2], p[3])) | 535 p[4].AddChildren(ListFromConcat(p[1], p[2], p[3])) |
523 p[0] = p[4] | 536 p[0] = p[4] |
524 | 537 |
525 # [48] | 538 # [49] |
526 def p_Specials(self, p): | 539 def p_Specials(self, p): |
527 """Specials : Special Specials | 540 """Specials : Special Specials |
528 | """ | 541 | """ |
529 if len(p) > 1: | 542 if len(p) > 1: |
530 p[0] = ListFromConcat(p[1], p[2]) | 543 p[0] = ListFromConcat(p[1], p[2]) |
531 | 544 |
532 # [49] | 545 # [50] |
533 def p_Special(self, p): | 546 def p_Special(self, p): |
534 """Special : GETTER | 547 """Special : GETTER |
535 | SETTER | 548 | SETTER |
536 | CREATOR | 549 | CREATOR |
537 | DELETER | 550 | DELETER |
538 | LEGACYCALLER""" | 551 | LEGACYCALLER""" |
539 p[0] = self.BuildTrue(p[1].upper()) | 552 p[0] = self.BuildTrue(p[1].upper()) |
540 | 553 |
541 # [50] Removed unsupported: IteratorRest | 554 # [51] |
542 def p_OperationOrIteratorRest(self, p): | 555 def p_OperationOrIteratorRest(self, p): |
543 """OperationOrIteratorRest : OperationRest""" | 556 """OperationOrIteratorRest : OperationRest""" |
544 p[0] = p[1] | 557 p[0] = p[1] |
545 | 558 |
546 # [51-53] NOT IMPLEMENTED (IteratorRest) | 559 # [51] |
547 | |
548 # [54] | |
549 def p_OperationRest(self, p): | 560 def p_OperationRest(self, p): |
550 """OperationRest : OptionalIdentifier '(' ArgumentList ')' ';'""" | 561 """OperationRest : OptionalIdentifier '(' ArgumentList ')' ';'""" |
551 arguments = self.BuildProduction('Arguments', p, 2, p[3]) | 562 arguments = self.BuildProduction('Arguments', p, 2, p[3]) |
552 p[0] = self.BuildNamed('Operation', p, 1, arguments) | 563 p[0] = self.BuildNamed('Operation', p, 1, arguments) |
553 | 564 |
554 # [55] | 565 # [52] |
555 def p_OptionalIdentifier(self, p): | 566 def p_OptionalIdentifier(self, p): |
556 """OptionalIdentifier : identifier | 567 """OptionalIdentifier : identifier |
557 |""" | 568 |""" |
558 if len(p) > 1: | 569 if len(p) > 1: |
559 p[0] = p[1] | 570 p[0] = p[1] |
560 else: | 571 else: |
561 p[0] = '_unnamed_' | 572 p[0] = '_unnamed_' |
562 | 573 |
563 # [56] | 574 # [53] |
564 def p_ArgumentList(self, p): | 575 def p_ArgumentList(self, p): |
565 """ArgumentList : Argument Arguments | 576 """ArgumentList : Argument Arguments |
566 |""" | 577 |""" |
567 if len(p) > 1: | 578 if len(p) > 1: |
568 p[0] = ListFromConcat(p[1], p[2]) | 579 p[0] = ListFromConcat(p[1], p[2]) |
569 | 580 |
570 # [56.1] ArgumentList error recovery | 581 # [53.1] ArgumentList error recovery |
571 def p_ArgumentListError(self, p): | 582 def p_ArgumentListError(self, p): |
572 """ArgumentList : error """ | 583 """ArgumentList : error """ |
573 p[0] = self.BuildError(p, 'ArgumentList') | 584 p[0] = self.BuildError(p, 'ArgumentList') |
574 | 585 |
575 # [57] | 586 # [54] |
576 def p_Arguments(self, p): | 587 def p_Arguments(self, p): |
577 """Arguments : ',' Argument Arguments | 588 """Arguments : ',' Argument Arguments |
578 |""" | 589 |""" |
579 if len(p) > 1: | 590 if len(p) > 1: |
580 p[0] = ListFromConcat(p[2], p[3]) | 591 p[0] = ListFromConcat(p[2], p[3]) |
581 | 592 |
582 # [58] | 593 # [55] |
583 def p_Argument(self, p): | 594 def p_Argument(self, p): |
584 """Argument : ExtendedAttributeList OptionalOrRequiredArgument""" | 595 """Argument : ExtendedAttributeList OptionalOrRequiredArgument""" |
585 p[2].AddChildren(p[1]) | 596 p[2].AddChildren(p[1]) |
586 p[0] = p[2] | 597 p[0] = p[2] |
587 | 598 |
588 # [59] | 599 # [56] |
589 def p_OptionalOrRequiredArgument(self, p): | 600 def p_OptionalOrRequiredArgument(self, p): |
590 """OptionalOrRequiredArgument : OPTIONAL Type ArgumentName Default | 601 """OptionalOrRequiredArgument : OPTIONAL Type ArgumentName Default |
591 | Type Ellipsis ArgumentName""" | 602 | Type Ellipsis ArgumentName""" |
592 if len(p) > 4: | 603 if len(p) > 4: |
593 arg = self.BuildNamed('Argument', p, 3, ListFromConcat(p[2], p[4])) | 604 arg = self.BuildNamed('Argument', p, 3, ListFromConcat(p[2], p[4])) |
594 arg.AddChildren(self.BuildTrue('OPTIONAL')) | 605 arg.AddChildren(self.BuildTrue('OPTIONAL')) |
595 else: | 606 else: |
596 arg = self.BuildNamed('Argument', p, 3, ListFromConcat(p[1], p[2])) | 607 arg = self.BuildNamed('Argument', p, 3, ListFromConcat(p[1], p[2])) |
597 p[0] = arg | 608 p[0] = arg |
598 | 609 |
599 # [60] | 610 # [57] |
600 def p_ArgumentName(self, p): | 611 def p_ArgumentName(self, p): |
601 """ArgumentName : ArgumentNameKeyword | 612 """ArgumentName : ArgumentNameKeyword |
602 | identifier""" | 613 | identifier""" |
603 p[0] = p[1] | 614 p[0] = p[1] |
604 | 615 |
605 # [61] | 616 # [58] |
606 def p_Ellipsis(self, p): | 617 def p_Ellipsis(self, p): |
607 """Ellipsis : ELLIPSIS | 618 """Ellipsis : ELLIPSIS |
608 |""" | 619 |""" |
609 if len(p) > 1: | 620 if len(p) > 1: |
610 p[0] = self.BuildNamed('Argument', p, 1) | 621 p[0] = self.BuildNamed('Argument', p, 1) |
611 p[0].AddChildren(self.BuildTrue('ELLIPSIS')) | 622 p[0].AddChildren(self.BuildTrue('ELLIPSIS')) |
612 | 623 |
613 # [62] | 624 # [] Unspecified |
614 def p_ExceptionMember(self, p): | 625 def p_ExceptionMember(self, p): |
615 """ExceptionMember : Const | 626 """ExceptionMember : Const |
616 | ExceptionField""" | 627 | ExceptionField""" |
617 p[0] = p[1] | 628 p[0] = p[1] |
618 | 629 |
619 # [63] | 630 # [] Unspecified |
620 def p_ExceptionField(self, p): | 631 def p_ExceptionField(self, p): |
621 """ExceptionField : Type identifier ';'""" | 632 """ExceptionField : Type identifier ';'""" |
622 p[0] = self.BuildNamed('ExceptionField', p, 2, p[1]) | 633 p[0] = self.BuildNamed('ExceptionField', p, 2, p[1]) |
623 | 634 |
624 # [63.1] Error recovery for ExceptionMembers | 635 # [] Error recovery for ExceptionMembers - Unspecified |
625 def p_ExceptionFieldError(self, p): | 636 def p_ExceptionFieldError(self, p): |
626 """ExceptionField : error""" | 637 """ExceptionField : error""" |
627 p[0] = self.BuildError(p, 'ExceptionField') | 638 p[0] = self.BuildError(p, 'ExceptionField') |
628 | 639 |
629 # [64] No comment version for mid statement attributes. | 640 # [59] NOT IMPLEMENTED (Iterable) |
| 641 # [60] NOT IMPLEMENTED (OptionalType) |
| 642 # [61] NOT IMPLEMENTED (ReadWriteMaplike) |
| 643 # [62] NOT IMPLEMENTED (ReadWriteSetlike) |
| 644 # [63] NOT IMPLEMENTED (MaplikeRest) |
| 645 # [64] NOT IMPLEMENTED (SetlikeRest) |
| 646 |
| 647 # [65] No comment version for mid statement attributes. |
630 def p_ExtendedAttributeListNoComments(self, p): | 648 def p_ExtendedAttributeListNoComments(self, p): |
631 """ExtendedAttributeListNoComments : '[' ExtendedAttribute ExtendedAttribute
s ']' | 649 """ExtendedAttributeListNoComments : '[' ExtendedAttribute ExtendedAttribute
s ']' |
632 | """ | 650 | """ |
633 if len(p) > 2: | 651 if len(p) > 2: |
634 items = ListFromConcat(p[2], p[3]) | 652 items = ListFromConcat(p[2], p[3]) |
635 p[0] = self.BuildProduction('ExtAttributes', p, 1, items) | 653 p[0] = self.BuildProduction('ExtAttributes', p, 1, items) |
636 | 654 |
637 # [64.1] Add optional comment field for start of statements. | 655 # [65.1] Add optional comment field for start of statements. |
638 def p_ExtendedAttributeList(self, p): | 656 def p_ExtendedAttributeList(self, p): |
639 """ExtendedAttributeList : Comments '[' ExtendedAttribute ExtendedAttributes
']' | 657 """ExtendedAttributeList : Comments '[' ExtendedAttribute ExtendedAttributes
']' |
640 | Comments """ | 658 | Comments """ |
641 if len(p) > 2: | 659 if len(p) > 2: |
642 items = ListFromConcat(p[3], p[4]) | 660 items = ListFromConcat(p[3], p[4]) |
643 attribs = self.BuildProduction('ExtAttributes', p, 2, items) | 661 attribs = self.BuildProduction('ExtAttributes', p, 2, items) |
644 p[0] = ListFromConcat(p[1], attribs) | 662 p[0] = ListFromConcat(p[1], attribs) |
645 else: | 663 else: |
646 p[0] = p[1] | 664 p[0] = p[1] |
647 | 665 |
648 # [65] | 666 # [66] |
649 def p_ExtendedAttributes(self, p): | 667 def p_ExtendedAttributes(self, p): |
650 """ExtendedAttributes : ',' ExtendedAttribute ExtendedAttributes | 668 """ExtendedAttributes : ',' ExtendedAttribute ExtendedAttributes |
651 |""" | 669 |""" |
652 if len(p) > 1: | 670 if len(p) > 1: |
653 p[0] = ListFromConcat(p[2], p[3]) | 671 p[0] = ListFromConcat(p[2], p[3]) |
654 | 672 |
655 # We only support: | 673 # We only support: |
656 # [ identifier ] | 674 # [ identifier ] |
657 # [ identifier ( ArgumentList ) ] | 675 # [ identifier ( ArgumentList ) ] |
658 # [ identifier = identifier ] | 676 # [ identifier = identifier ] |
659 # [ identifier = ( IdentifierList ) ] | 677 # [ identifier = ( IdentifierList ) ] |
660 # [ identifier = identifier ( ArgumentList ) ] | 678 # [ identifier = identifier ( ArgumentList ) ] |
661 # [66] map directly to [91-93, 95] | 679 # [66] map directly to [91-93, 95] |
662 # [67-69, 71] are unsupported | 680 # [67-69, 71] are unsupported |
663 def p_ExtendedAttribute(self, p): | 681 def p_ExtendedAttribute(self, p): |
664 """ExtendedAttribute : ExtendedAttributeNoArgs | 682 """ExtendedAttribute : ExtendedAttributeNoArgs |
665 | ExtendedAttributeArgList | 683 | ExtendedAttributeArgList |
666 | ExtendedAttributeIdent | 684 | ExtendedAttributeIdent |
667 | ExtendedAttributeIdentList | 685 | ExtendedAttributeIdentList |
668 | ExtendedAttributeNamedArgList""" | 686 | ExtendedAttributeNamedArgList""" |
669 p[0] = p[1] | 687 p[0] = p[1] |
670 | 688 |
671 # [70] | 689 # [71] |
672 def p_ArgumentNameKeyword(self, p): | 690 def p_ArgumentNameKeyword(self, p): |
673 """ArgumentNameKeyword : ATTRIBUTE | 691 """ArgumentNameKeyword : ATTRIBUTE |
674 | CALLBACK | 692 | CALLBACK |
675 | CONST | 693 | CONST |
676 | CREATOR | 694 | CREATOR |
677 | DELETER | 695 | DELETER |
678 | DICTIONARY | 696 | DICTIONARY |
679 | ENUM | 697 | ENUM |
680 | EXCEPTION | 698 | EXCEPTION |
681 | GETTER | 699 | GETTER |
682 | IMPLEMENTS | 700 | IMPLEMENTS |
683 | INHERIT | 701 | INHERIT |
684 | LEGACYCALLER | 702 | LEGACYCALLER |
685 | PARTIAL | 703 | PARTIAL |
686 | SERIALIZER | 704 | SERIALIZER |
687 | SETTER | 705 | SETTER |
688 | STATIC | 706 | STATIC |
689 | STRINGIFIER | 707 | STRINGIFIER |
690 | TYPEDEF | 708 | TYPEDEF |
691 | UNRESTRICTED""" | 709 | UNRESTRICTED""" |
692 p[0] = p[1] | 710 p[0] = p[1] |
693 | 711 |
694 # [72] | 712 # [72] NOT IMPLEMENTED (OtherOrComma) |
| 713 |
| 714 # [73] |
695 def p_Type(self, p): | 715 def p_Type(self, p): |
696 """Type : SingleType | 716 """Type : SingleType |
697 | UnionType TypeSuffix""" | 717 | UnionType TypeSuffix""" |
698 if len(p) == 2: | 718 if len(p) == 2: |
699 p[0] = self.BuildProduction('Type', p, 1, p[1]) | 719 p[0] = self.BuildProduction('Type', p, 1, p[1]) |
700 else: | 720 else: |
701 p[0] = self.BuildProduction('Type', p, 1, ListFromConcat(p[1], p[2])) | 721 p[0] = self.BuildProduction('Type', p, 1, ListFromConcat(p[1], p[2])) |
702 | 722 |
703 # [73] | 723 # [74] |
704 def p_SingleType(self, p): | 724 def p_SingleType(self, p): |
705 """SingleType : NonAnyType | 725 """SingleType : NonAnyType |
706 | ANY TypeSuffixStartingWithArray""" | 726 | ANY TypeSuffixStartingWithArray""" |
707 if len(p) == 2: | 727 if len(p) == 2: |
708 p[0] = p[1] | 728 p[0] = p[1] |
709 else: | 729 else: |
710 p[0] = ListFromConcat(self.BuildProduction('Any', p, 1), p[2]) | 730 p[0] = ListFromConcat(self.BuildProduction('Any', p, 1), p[2]) |
711 | 731 |
712 # [74] | 732 # [75] |
713 def p_UnionType(self, p): | 733 def p_UnionType(self, p): |
714 """UnionType : '(' UnionMemberType OR UnionMemberType UnionMemberTypes ')'""
" | 734 """UnionType : '(' UnionMemberType OR UnionMemberType UnionMemberTypes ')'""
" |
715 | 735 |
716 # [75] | 736 # [76] |
717 def p_UnionMemberType(self, p): | 737 def p_UnionMemberType(self, p): |
718 """UnionMemberType : NonAnyType | 738 """UnionMemberType : NonAnyType |
719 | UnionType TypeSuffix | 739 | UnionType TypeSuffix |
720 | ANY '[' ']' TypeSuffix""" | 740 | ANY '[' ']' TypeSuffix""" |
721 # [76] | 741 # [77] |
722 def p_UnionMemberTypes(self, p): | 742 def p_UnionMemberTypes(self, p): |
723 """UnionMemberTypes : OR UnionMemberType UnionMemberTypes | 743 """UnionMemberTypes : OR UnionMemberType UnionMemberTypes |
724 |""" | 744 |""" |
725 | 745 |
726 # [77] Moved BYTESTRING, DOMSTRING, OBJECT, DATE, REGEXP to PrimitiveType | 746 # [78] Moved BYTESTRING, DOMSTRING, OBJECT, DATE, REGEXP to PrimitiveType |
727 # Moving all built-in types into PrimitiveType makes it easier to | 747 # Moving all built-in types into PrimitiveType makes it easier to |
728 # differentiate between them and 'identifier', since p[1] would be a string in | 748 # differentiate between them and 'identifier', since p[1] would be a string in |
729 # both cases. | 749 # both cases. |
730 def p_NonAnyType(self, p): | 750 def p_NonAnyType(self, p): |
731 """NonAnyType : PrimitiveType TypeSuffix | 751 """NonAnyType : PrimitiveType TypeSuffix |
| 752 | PromiseType Null |
732 | identifier TypeSuffix | 753 | identifier TypeSuffix |
733 | SEQUENCE '<' Type '>' Null""" | 754 | SEQUENCE '<' Type '>' Null""" |
734 if len(p) == 3: | 755 if len(p) == 3: |
735 if type(p[1]) == str: | 756 if type(p[1]) == str: |
736 typeref = self.BuildNamed('Typeref', p, 1) | 757 typeref = self.BuildNamed('Typeref', p, 1) |
737 else: | 758 else: |
738 typeref = p[1] | 759 typeref = p[1] |
739 p[0] = ListFromConcat(typeref, p[2]) | 760 p[0] = ListFromConcat(typeref, p[2]) |
740 | 761 |
741 if len(p) == 6: | 762 if len(p) == 6: |
742 p[0] = self.BuildProduction('Sequence', p, 1, ListFromConcat(p[3], p[5])) | 763 p[0] = self.BuildProduction('Sequence', p, 1, ListFromConcat(p[3], p[5])) |
743 | 764 |
| 765 # [79] NOT IMPLEMENTED (BufferRelatedType) |
744 | 766 |
745 # [78] | 767 # [80] |
746 def p_ConstType(self, p): | 768 def p_ConstType(self, p): |
747 """ConstType : PrimitiveType Null | 769 """ConstType : PrimitiveType Null |
748 | identifier Null""" | 770 | identifier Null""" |
749 if type(p[1]) == str: | 771 if type(p[1]) == str: |
750 p[0] = self.BuildNamed('Typeref', p, 1, p[2]) | 772 p[0] = self.BuildNamed('Typeref', p, 1, p[2]) |
751 else: | 773 else: |
752 p[1].AddChildren(p[2]) | 774 p[1].AddChildren(p[2]) |
753 p[0] = p[1] | 775 p[0] = p[1] |
754 | 776 |
755 | 777 |
756 # [79] Added BYTESTRING, DOMSTRING, OBJECT, DATE, REGEXP | 778 # [81] Added BYTESTRING, DOMSTRING, OBJECT, DATE, REGEXP |
757 def p_PrimitiveType(self, p): | 779 def p_PrimitiveType(self, p): |
758 """PrimitiveType : UnsignedIntegerType | 780 """PrimitiveType : UnsignedIntegerType |
759 | UnrestrictedFloatType | 781 | UnrestrictedFloatType |
760 | BOOLEAN | 782 | BOOLEAN |
761 | BYTE | 783 | BYTE |
762 | OCTET | 784 | OCTET |
763 | BYTESTRING | 785 | BYTESTRING |
764 | DOMSTRING | 786 | DOMSTRING |
765 | OBJECT | 787 | OBJECT |
766 | DATE | 788 | DATE |
767 | REGEXP""" | 789 | REGEXP""" |
768 if type(p[1]) == str: | 790 if type(p[1]) == str: |
769 p[0] = self.BuildNamed('PrimitiveType', p, 1) | 791 p[0] = self.BuildNamed('PrimitiveType', p, 1) |
770 else: | 792 else: |
771 p[0] = p[1] | 793 p[0] = p[1] |
772 | 794 |
773 | 795 |
774 # [80] | 796 # [82] |
775 def p_UnrestrictedFloatType(self, p): | 797 def p_UnrestrictedFloatType(self, p): |
776 """UnrestrictedFloatType : UNRESTRICTED FloatType | 798 """UnrestrictedFloatType : UNRESTRICTED FloatType |
777 | FloatType""" | 799 | FloatType""" |
778 if len(p) == 2: | 800 if len(p) == 2: |
779 typeref = self.BuildNamed('PrimitiveType', p, 1) | 801 typeref = self.BuildNamed('PrimitiveType', p, 1) |
780 else: | 802 else: |
781 typeref = self.BuildNamed('PrimitiveType', p, 2) | 803 typeref = self.BuildNamed('PrimitiveType', p, 2) |
782 typeref.AddChildren(self.BuildTrue('UNRESTRICTED')) | 804 typeref.AddChildren(self.BuildTrue('UNRESTRICTED')) |
783 p[0] = typeref | 805 p[0] = typeref |
784 | 806 |
785 | 807 |
786 # [81] | 808 # [83] |
787 def p_FloatType(self, p): | 809 def p_FloatType(self, p): |
788 """FloatType : FLOAT | 810 """FloatType : FLOAT |
789 | DOUBLE""" | 811 | DOUBLE""" |
790 p[0] = p[1] | 812 p[0] = p[1] |
791 | 813 |
792 # [82] | 814 # [84] |
793 def p_UnsignedIntegerType(self, p): | 815 def p_UnsignedIntegerType(self, p): |
794 """UnsignedIntegerType : UNSIGNED IntegerType | 816 """UnsignedIntegerType : UNSIGNED IntegerType |
795 | IntegerType""" | 817 | IntegerType""" |
796 if len(p) == 2: | 818 if len(p) == 2: |
797 p[0] = p[1] | 819 p[0] = p[1] |
798 else: | 820 else: |
799 p[0] = 'unsigned ' + p[2] | 821 p[0] = 'unsigned ' + p[2] |
800 | 822 |
801 # [83] | 823 # [85] |
802 def p_IntegerType(self, p): | 824 def p_IntegerType(self, p): |
803 """IntegerType : SHORT | 825 """IntegerType : SHORT |
804 | LONG OptionalLong""" | 826 | LONG OptionalLong""" |
805 if len(p) == 2: | 827 if len(p) == 2: |
806 p[0] = p[1] | 828 p[0] = p[1] |
807 else: | 829 else: |
808 p[0] = p[1] + p[2] | 830 p[0] = p[1] + p[2] |
809 | 831 |
810 # [84] | 832 # [86] |
811 def p_OptionalLong(self, p): | 833 def p_OptionalLong(self, p): |
812 """OptionalLong : LONG | 834 """OptionalLong : LONG |
813 | """ | 835 | """ |
814 if len(p) > 1: | 836 if len(p) > 1: |
815 p[0] = ' ' + p[1] | 837 p[0] = ' ' + p[1] |
816 else: | 838 else: |
817 p[0] = '' | 839 p[0] = '' |
818 | 840 |
| 841 # [87] Add unqualified Promise |
| 842 def p_PromiseType(self, p): |
| 843 """PromiseType : PROMISE '<' ReturnType '>' |
| 844 | PROMISE""" |
| 845 if len(p) == 2: |
| 846 # Promise without resolution type is not specified in the Web IDL spec. |
| 847 # As it is used in some specs and in the blink implementation, |
| 848 # we allow that here. |
| 849 resolution_type = self.BuildProduction('Type', p, 1, |
| 850 self.BuildProduction('Any', p, 1)) |
| 851 p[0] = self.BuildNamed('Promise', p, 1, resolution_type) |
| 852 else: |
| 853 p[0] = self.BuildNamed('Promise', p, 1, p[3]) |
819 | 854 |
820 # [85] Add support for sized array | 855 # [88] Add support for sized array |
821 def p_TypeSuffix(self, p): | 856 def p_TypeSuffix(self, p): |
822 """TypeSuffix : '[' integer ']' TypeSuffix | 857 """TypeSuffix : '[' integer ']' TypeSuffix |
823 | '[' ']' TypeSuffix | 858 | '[' ']' TypeSuffix |
824 | '?' TypeSuffixStartingWithArray | 859 | '?' TypeSuffixStartingWithArray |
825 | """ | 860 | """ |
826 if len(p) == 5: | 861 if len(p) == 5: |
827 p[0] = self.BuildNamed('Array', p, 2, p[4]) | 862 p[0] = self.BuildNamed('Array', p, 2, p[4]) |
828 | 863 |
829 if len(p) == 4: | 864 if len(p) == 4: |
830 p[0] = self.BuildProduction('Array', p, 1, p[3]) | 865 p[0] = self.BuildProduction('Array', p, 1, p[3]) |
831 | 866 |
832 if len(p) == 3: | 867 if len(p) == 3: |
833 p[0] = ListFromConcat(self.BuildTrue('NULLABLE'), p[2]) | 868 p[0] = ListFromConcat(self.BuildTrue('NULLABLE'), p[2]) |
834 | 869 |
835 | 870 |
836 # [86] | 871 # [89] |
837 def p_TypeSuffixStartingWithArray(self, p): | 872 def p_TypeSuffixStartingWithArray(self, p): |
838 """TypeSuffixStartingWithArray : '[' ']' TypeSuffix | 873 """TypeSuffixStartingWithArray : '[' ']' TypeSuffix |
839 | """ | 874 | """ |
840 if len(p) > 1: | 875 if len(p) > 1: |
841 p[0] = self.BuildProduction('Array', p, 0, p[3]) | 876 p[0] = self.BuildProduction('Array', p, 0, p[3]) |
842 | 877 |
843 # [87] | 878 # [90] |
844 def p_Null(self, p): | 879 def p_Null(self, p): |
845 """Null : '?' | 880 """Null : '?' |
846 |""" | 881 |""" |
847 if len(p) > 1: | 882 if len(p) > 1: |
848 p[0] = self.BuildTrue('NULLABLE') | 883 p[0] = self.BuildTrue('NULLABLE') |
849 | 884 |
850 # [88] | 885 # [91] |
851 def p_ReturnType(self, p): | 886 def p_ReturnType(self, p): |
852 """ReturnType : Type | 887 """ReturnType : Type |
853 | VOID""" | 888 | VOID""" |
854 if p[1] == 'void': | 889 if p[1] == 'void': |
855 p[0] = self.BuildProduction('Type', p, 1) | 890 p[0] = self.BuildProduction('Type', p, 1) |
856 p[0].AddChildren(self.BuildNamed('PrimitiveType', p, 1)) | 891 p[0].AddChildren(self.BuildNamed('PrimitiveType', p, 1)) |
857 else: | 892 else: |
858 p[0] = p[1] | 893 p[0] = p[1] |
859 | 894 |
860 # [89] | 895 # [92] |
861 def p_IdentifierList(self, p): | 896 def p_IdentifierList(self, p): |
862 """IdentifierList : identifier Identifiers""" | 897 """IdentifierList : identifier Identifiers""" |
863 p[0] = ListFromConcat(p[1], p[2]) | 898 p[0] = ListFromConcat(p[1], p[2]) |
864 | 899 |
865 # [90] | 900 # [93] |
866 def p_Identifiers(self, p): | 901 def p_Identifiers(self, p): |
867 """Identifiers : ',' identifier Identifiers | 902 """Identifiers : ',' identifier Identifiers |
868 |""" | 903 |""" |
869 if len(p) > 1: | 904 if len(p) > 1: |
870 p[0] = ListFromConcat(p[2], p[3]) | 905 p[0] = ListFromConcat(p[2], p[3]) |
871 | 906 |
872 # [91] | 907 # [94] |
873 def p_ExtendedAttributeNoArgs(self, p): | 908 def p_ExtendedAttributeNoArgs(self, p): |
874 """ExtendedAttributeNoArgs : identifier""" | 909 """ExtendedAttributeNoArgs : identifier""" |
875 p[0] = self.BuildNamed('ExtAttribute', p, 1) | 910 p[0] = self.BuildNamed('ExtAttribute', p, 1) |
876 | 911 |
877 # [92] | 912 # [95] |
878 def p_ExtendedAttributeArgList(self, p): | 913 def p_ExtendedAttributeArgList(self, p): |
879 """ExtendedAttributeArgList : identifier '(' ArgumentList ')'""" | 914 """ExtendedAttributeArgList : identifier '(' ArgumentList ')'""" |
880 arguments = self.BuildProduction('Arguments', p, 2, p[3]) | 915 arguments = self.BuildProduction('Arguments', p, 2, p[3]) |
881 p[0] = self.BuildNamed('ExtAttribute', p, 1, arguments) | 916 p[0] = self.BuildNamed('ExtAttribute', p, 1, arguments) |
882 | 917 |
883 # [93] | 918 # [96] |
884 def p_ExtendedAttributeIdent(self, p): | 919 def p_ExtendedAttributeIdent(self, p): |
885 """ExtendedAttributeIdent : identifier '=' identifier""" | 920 """ExtendedAttributeIdent : identifier '=' identifier""" |
886 value = self.BuildAttribute('VALUE', p[3]) | 921 value = self.BuildAttribute('VALUE', p[3]) |
887 p[0] = self.BuildNamed('ExtAttribute', p, 1, value) | 922 p[0] = self.BuildNamed('ExtAttribute', p, 1, value) |
888 | 923 |
889 # [94] | 924 # [97] |
890 def p_ExtendedAttributeIdentList(self, p): | 925 def p_ExtendedAttributeIdentList(self, p): |
891 """ExtendedAttributeIdentList : identifier '=' '(' IdentifierList ')'""" | 926 """ExtendedAttributeIdentList : identifier '=' '(' IdentifierList ')'""" |
892 value = self.BuildAttribute('VALUE', p[4]) | 927 value = self.BuildAttribute('VALUE', p[4]) |
893 p[0] = self.BuildNamed('ExtAttribute', p, 1, value) | 928 p[0] = self.BuildNamed('ExtAttribute', p, 1, value) |
894 | 929 |
895 # [95] | 930 # [98] |
896 def p_ExtendedAttributeNamedArgList(self, p): | 931 def p_ExtendedAttributeNamedArgList(self, p): |
897 """ExtendedAttributeNamedArgList : identifier '=' identifier '(' ArgumentLis
t ')'""" | 932 """ExtendedAttributeNamedArgList : identifier '=' identifier '(' ArgumentLis
t ')'""" |
898 args = self.BuildProduction('Arguments', p, 4, p[5]) | 933 args = self.BuildProduction('Arguments', p, 4, p[5]) |
899 value = self.BuildNamed('Call', p, 3, args) | 934 value = self.BuildNamed('Call', p, 3, args) |
900 p[0] = self.BuildNamed('ExtAttribute', p, 1, value) | 935 p[0] = self.BuildNamed('ExtAttribute', p, 1, value) |
901 | 936 |
902 # [96] NOT IMPLEMENTED (ExtendedAttributeTypePair) | |
903 | |
904 # | 937 # |
905 # Parser Errors | 938 # Parser Errors |
906 # | 939 # |
907 # p_error is called whenever the parser can not find a pattern match for | 940 # p_error is called whenever the parser can not find a pattern match for |
908 # a set of items from the current state. The p_error function defined here | 941 # a set of items from the current state. The p_error function defined here |
909 # is triggered logging an error, and parsing recovery happens as the | 942 # is triggered logging an error, and parsing recovery happens as the |
910 # p_<type>_error functions defined above are called. This allows the parser | 943 # p_<type>_error functions defined above are called. This allows the parser |
911 # to continue so as to capture more than one error per file. | 944 # to continue so as to capture more than one error per file. |
912 # | 945 # |
913 def p_error(self, t): | 946 def p_error(self, t): |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1113 | 1146 |
1114 print '\n'.join(ast.Tree(accept_props=['PROD'])) | 1147 print '\n'.join(ast.Tree(accept_props=['PROD'])) |
1115 if errors: | 1148 if errors: |
1116 print '\nFound %d errors.\n' % errors | 1149 print '\nFound %d errors.\n' % errors |
1117 | 1150 |
1118 return errors | 1151 return errors |
1119 | 1152 |
1120 | 1153 |
1121 if __name__ == '__main__': | 1154 if __name__ == '__main__': |
1122 sys.exit(main(sys.argv[1:])) | 1155 sys.exit(main(sys.argv[1:])) |
OLD | NEW |