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

Unified 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: fix another spec link 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/idl_parser/idl_node.py ('k') | tools/idl_parser/idl_ppapi_lexer.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/idl_parser/idl_parser.py
diff --git a/tools/idl_parser/idl_parser.py b/tools/idl_parser/idl_parser.py
index 8a682ea688b6821d8993f8c52c8e9dcf6b78cc44..7a5202c50397049f0ef267b733d6a4c60deb7db9 100755
--- a/tools/idl_parser/idl_parser.py
+++ b/tools/idl_parser/idl_parser.py
@@ -12,7 +12,7 @@
# on WebIDL.
#
# WebIDL, and WebIDL grammar can be found at:
-# http://dev.w3.org/2006/webapi/WebIDL/
+# http://heycam.github.io/webidl/
# PLY can be found at:
# http://www.dabeaz.com/ply/
#
@@ -144,7 +144,7 @@ def TokenTypeName(t):
# http://www.dabeaz.com/ply/
#
# The parser is based on the WebIDL standard. See:
-# http://www.w3.org/TR/WebIDL/#idl-grammar
+# http://heycam.github.io/webidl/#idl-grammar
#
# The various productions are annotated so that the WHOLE number greater than
# zero in the comment denotes the matching WebIDL grammar definition.
@@ -183,7 +183,7 @@ class IDLParser(object):
#
#The parser is based on the WebIDL standard. See:
-# http://www.w3.org/TR/WebIDL/#idl-grammar
+# http://heycam.github.io/webidl/#idl-grammar
#
# [1]
def p_Definitions(self, p):
@@ -193,7 +193,7 @@ class IDLParser(object):
p[2].AddChildren(p[1])
p[0] = ListFromConcat(p[2], p[3])
- # [2] Add INLINE definition
+ # [2]
def p_Definition(self, p):
"""Definition : CallbackOrInterface
| Partial
@@ -229,13 +229,13 @@ class IDLParser(object):
"""Interface : INTERFACE identifier Inheritance '{' InterfaceMembers '}' ';'"""
p[0] = self.BuildNamed('Interface', p, 2, ListFromConcat(p[3], p[5]))
- # [6] Error recovery for PARTIAL
+ # [6]
def p_Partial(self, p):
"""Partial : PARTIAL PartialDefinition"""
p[2].AddChildren(self.BuildTrue('Partial'))
p[0] = p[2]
- # [6.1] Error recovery for Enums
+ # [6.1] Error recovery for Partial
def p_PartialError(self, p):
"""Partial : PARTIAL error"""
p[0] = self.BuildError(p, 'Partial')
@@ -262,7 +262,7 @@ class IDLParser(object):
# [10]
def p_InterfaceMember(self, p):
"""InterfaceMember : Const
- | AttributeOrOperation"""
+ | AttributeOrOperationOrIterator"""
p[0] = p[1]
# [11]
@@ -353,47 +353,54 @@ class IDLParser(object):
# [21]
def p_EnumValueList(self, p):
- """EnumValueList : ExtendedAttributeList string EnumValues"""
+ """EnumValueList : ExtendedAttributeList string EnumValueListComma"""
enum = self.BuildNamed('EnumItem', p, 2, p[1])
p[0] = ListFromConcat(enum, p[3])
# [22]
- def p_EnumValues(self, p):
- """EnumValues : ',' ExtendedAttributeList string EnumValues
- |"""
+ def p_EnumValueListComma(self, p):
+ """EnumValueListComma : ',' EnumValueListString
+ |"""
if len(p) > 1:
- enum = self.BuildNamed('EnumItem', p, 3, p[2])
- p[0] = ListFromConcat(enum, p[4])
+ p[0] = p[2]
# [23]
+ def p_EnumValueListString(self, p):
+ """EnumValueListString : ExtendedAttributeList string EnumValueListComma
+ |"""
+ if len(p) > 1:
+ enum = self.BuildNamed('EnumItem', p, 2, p[1])
+ p[0] = ListFromConcat(enum, p[3])
+
+ # [24]
def p_CallbackRest(self, p):
"""CallbackRest : identifier '=' ReturnType '(' ArgumentList ')' ';'"""
arguments = self.BuildProduction('Arguments', p, 4, p[5])
p[0] = self.BuildNamed('Callback', p, 1, ListFromConcat(p[3], arguments))
- # [24]
+ # [25]
def p_Typedef(self, p):
"""Typedef : TYPEDEF ExtendedAttributeListNoComments Type identifier ';'"""
p[0] = self.BuildNamed('Typedef', p, 4, ListFromConcat(p[2], p[3]))
- # [24.1] Error recovery for Typedefs
+ # [25.1] Error recovery for Typedefs
def p_TypedefError(self, p):
"""Typedef : TYPEDEF error ';'"""
p[0] = self.BuildError(p, 'Typedef')
- # [25]
+ # [26]
def p_ImplementsStatement(self, p):
"""ImplementsStatement : identifier IMPLEMENTS identifier ';'"""
name = self.BuildAttribute('REFERENCE', p[3])
p[0] = self.BuildNamed('Implements', p, 1, name)
- # [26]
+ # [27]
def p_Const(self, p):
"""Const : CONST ConstType identifier '=' ConstValue ';'"""
value = self.BuildProduction('Value', p, 5, p[5])
p[0] = self.BuildNamed('Const', p, 3, ListFromConcat(p[2], value))
- # [27]
+ # [28]
def p_ConstValue(self, p):
"""ConstValue : BooleanLiteral
| FloatLiteral
@@ -405,20 +412,20 @@ class IDLParser(object):
else:
p[0] = p[1]
- # [27.1] Add definition for NULL
+ # [28.1] Add definition for NULL
def p_null(self, p):
"""null : NULL"""
p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'NULL'),
self.BuildAttribute('NAME', 'NULL'))
- # [28]
+ # [29]
def p_BooleanLiteral(self, p):
"""BooleanLiteral : TRUE
| FALSE"""
value = self.BuildAttribute('VALUE', Boolean(p[1] == 'true'))
p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'boolean'), value)
- # [29]
+ # [30]
def p_FloatLiteral(self, p):
"""FloatLiteral : float
| '-' INFINITY
@@ -431,69 +438,81 @@ class IDLParser(object):
p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'float'),
self.BuildAttribute('VALUE', val))
- # [30]
- def p_AttributeOrOperation(self, p):
- """AttributeOrOperation : STRINGIFIER StringifierAttributeOrOperation
- | Attribute
- | Operation"""
- if len(p) > 2:
- p[0] = p[2]
- else:
- p[0] = p[1]
+ # [31] Removed unsupported: Serializer, Stringifier
+ def p_AttributeOrOperationOrIterator(self, p):
+ """AttributeOrOperationOrIterator : StaticMember
+ | Attribute
+ | OperationOrIterator"""
+ p[0] = p[1]
- # [31]
- def p_StringifierAttributeOrOperation(self, p):
- """StringifierAttributeOrOperation : Attribute
- | OperationRest
- | ';'"""
- if p[1] == ';':
- p[0] = self.BuildAttribute('STRINGIFIER', Boolean(True))
+ # [32-39] NOT IMPLEMENTED
Nils Barth (inactive) 2014/06/16 06:50:48 Could you link to the stringifier bug? // FIXME: N
+
+ # [40]
+ def p_StaticMember(self, p):
+ """StaticMember : STATIC StaticMemberRest"""
+ p[2].AddChildren(self.BuildTrue('STATIC'))
+ p[0] = p[2]
+
+ # [41]
+ def p_StaticMemberRest(self, p):
+ """StaticMemberRest : AttributeRest
+ | ReturnType OperationRest"""
+ if len(p) == 2:
+ p[0] = p[1]
else:
- p[0] = ListFromConcat(self.BuildAttribute('STRINGIFIER', p[1]), p[1])
+ p[2].AddChildren(p[1])
+ p[0] = p[2]
- # [32]
+ # [42]
def p_Attribute(self, p):
- """Attribute : Inherit ReadOnly ATTRIBUTE Type identifier ';'"""
- p[0] = self.BuildNamed('Attribute', p, 5,
- ListFromConcat(p[1], p[2], p[4]))
+ """Attribute : Inherit AttributeRest"""
+ p[2].AddChildren(ListFromConcat(p[1]))
+ p[0] = p[2]
- # [33]
+ # [43]
+ def p_AttributeRest(self, p):
+ """AttributeRest : ReadOnly ATTRIBUTE Type identifier ';'"""
+ p[0] = self.BuildNamed('Attribute', p, 4,
+ ListFromConcat(p[1], p[3]))
+
+ # [44]
def p_Inherit(self, p):
"""Inherit : INHERIT
|"""
if len(p) > 1:
p[0] = self.BuildTrue('INHERIT')
- # [34]
+ # [45]
def p_ReadOnly(self, p):
"""ReadOnly : READONLY
- |"""
+ |"""
if len(p) > 1:
p[0] = self.BuildTrue('READONLY')
- # [35]
- def p_Operation(self, p):
- """Operation : Qualifiers OperationRest"""
- p[2].AddChildren(p[1])
- p[0] = p[2]
-
- # [36]
- def p_Qualifiers(self, p):
- """Qualifiers : STATIC
- | Specials"""
- if p[1] == 'static':
- p[0] = self.BuildTrue('STATIC')
+ # [46]
+ def p_OperationOrIterator(self, p):
+ """OperationOrIterator : ReturnType OperationOrIteratorRest
+ | SpecialOperation"""
+ if len(p) == 3:
+ p[2].AddChildren(p[1])
+ p[0] = p[2]
else:
p[0] = p[1]
- # [37]
+ # [47]
+ def p_SpecialOperation(self, p):
+ """SpecialOperation : Special Specials ReturnType OperationRest"""
+ p[4].AddChildren(ListFromConcat(p[1], p[2], p[3]))
+ p[0] = p[4]
+
+ # [48]
def p_Specials(self, p):
"""Specials : Special Specials
| """
if len(p) > 1:
p[0] = ListFromConcat(p[1], p[2])
- # [38]
+ # [49]
def p_Special(self, p):
"""Special : GETTER
| SETTER
@@ -502,14 +521,20 @@ class IDLParser(object):
| LEGACYCALLER"""
p[0] = self.BuildTrue(p[1].upper())
+ # [50] Removed unsupported: IteratorRest
+ def p_OperationOrIteratorRest(self, p):
+ """OperationOrIteratorRest : OperationRest"""
+ p[0] = p[1]
+
+ # [51-53] NOT IMPLEMENTED
Nils Barth (inactive) 2014/06/16 06:50:48 Could you elab as "NOT IMPLEMENTED (iterator)" Do
Jens Widell 2014/06/16 10:39:49 I had no plans right now, at least. Implementing s
Nils Barth (inactive) 2014/06/17 05:08:18 Got it; as a rule we don't add support for anythin
- # [39]
+ # [54]
def p_OperationRest(self, p):
- """OperationRest : ReturnType OptionalIdentifier '(' ArgumentList ')' ';'"""
- arguments = self.BuildProduction('Arguments', p, 3, p[4])
- p[0] = self.BuildNamed('Operation', p, 2, ListFromConcat(p[1], arguments))
+ """OperationRest : OptionalIdentifier '(' ArgumentList ')' ';'"""
+ arguments = self.BuildProduction('Arguments', p, 2, p[3])
+ p[0] = self.BuildNamed('Operation', p, 1, arguments)
- # [40]
+ # [55]
def p_OptionalIdentifier(self, p):
"""OptionalIdentifier : identifier
|"""
@@ -518,33 +543,32 @@ class IDLParser(object):
else:
p[0] = '_unnamed_'
- # [41]
+ # [56]
def p_ArgumentList(self, p):
"""ArgumentList : Argument Arguments
|"""
if len(p) > 1:
p[0] = ListFromConcat(p[1], p[2])
- # [41.1] ArgumentList error recovery
+ # [56.1] ArgumentList error recovery
def p_ArgumentListError(self, p):
"""ArgumentList : error """
p[0] = self.BuildError(p, 'ArgumentList')
- # [42]
+ # [57]
def p_Arguments(self, p):
"""Arguments : ',' Argument Arguments
|"""
if len(p) > 1:
p[0] = ListFromConcat(p[2], p[3])
- # [43]
+ # [58]
def p_Argument(self, p):
"""Argument : ExtendedAttributeList OptionalOrRequiredArgument"""
p[2].AddChildren(p[1])
p[0] = p[2]
-
- # [44]
+ # [59]
def p_OptionalOrRequiredArgument(self, p):
"""OptionalOrRequiredArgument : OPTIONAL Type ArgumentName Default
| Type Ellipsis ArgumentName"""
@@ -555,13 +579,13 @@ class IDLParser(object):
arg = self.BuildNamed('Argument', p, 3, ListFromConcat(p[1], p[2]))
p[0] = arg
- # [45]
+ # [60]
def p_ArgumentName(self, p):
"""ArgumentName : ArgumentNameKeyword
| identifier"""
p[0] = p[1]
- # [46]
+ # [61]
def p_Ellipsis(self, p):
"""Ellipsis : ELLIPSIS
|"""
@@ -569,23 +593,23 @@ class IDLParser(object):
p[0] = self.BuildNamed('Argument', p, 1)
p[0].AddChildren(self.BuildTrue('ELLIPSIS'))
- # [47]
+ # [62]
def p_ExceptionMember(self, p):
"""ExceptionMember : Const
| ExceptionField"""
p[0] = p[1]
- # [48]
+ # [63]
def p_ExceptionField(self, p):
"""ExceptionField : Type identifier ';'"""
p[0] = self.BuildNamed('ExceptionField', p, 2, p[1])
- # [48.1] Error recovery for ExceptionMembers
+ # [63.1] Error recovery for ExceptionMembers
def p_ExceptionFieldError(self, p):
"""ExceptionField : error"""
p[0] = self.BuildError(p, 'ExceptionField')
- # [49] No comment version for mid statement attributes.
+ # [64] No comment version for mid statement attributes.
def p_ExtendedAttributeListNoComments(self, p):
"""ExtendedAttributeListNoComments : '[' ExtendedAttribute ExtendedAttributes ']'
| """
@@ -593,7 +617,7 @@ class IDLParser(object):
items = ListFromConcat(p[2], p[3])
p[0] = self.BuildProduction('ExtAttributes', p, 1, items)
- # [49.1] Add optional comment field for start of statements.
+ # [64.1] Add optional comment field for start of statements.
def p_ExtendedAttributeList(self, p):
"""ExtendedAttributeList : Comments '[' ExtendedAttribute ExtendedAttributes ']'
| Comments """
@@ -604,7 +628,7 @@ class IDLParser(object):
else:
p[0] = p[1]
- # [50]
+ # [65]
def p_ExtendedAttributes(self, p):
"""ExtendedAttributes : ',' ExtendedAttribute ExtendedAttributes
|"""
@@ -616,8 +640,8 @@ class IDLParser(object):
# [ identifier = identifier ]
# [ identifier ( ArgumentList )]
# [ identifier = identifier ( ArgumentList )]
- # [51] map directly to 74-77
- # [52-54, 56] are unsupported
+ # [66] map directly to [91-93, 95]
+ # [67-69, 71] are unsupported
def p_ExtendedAttribute(self, p):
"""ExtendedAttribute : ExtendedAttributeNoArgs
| ExtendedAttributeArgList
@@ -625,7 +649,7 @@ class IDLParser(object):
| ExtendedAttributeNamedArgList"""
p[0] = p[1]
- # [55]
+ # [70]
def p_ArgumentNameKeyword(self, p):
"""ArgumentNameKeyword : ATTRIBUTE
| CALLBACK
@@ -640,6 +664,7 @@ class IDLParser(object):
| INHERIT
| LEGACYCALLER
| PARTIAL
+ | SERIALIZER
| SETTER
| STATIC
| STRINGIFIER
@@ -647,7 +672,7 @@ class IDLParser(object):
| UNRESTRICTED"""
p[0] = p[1]
- # [57]
+ # [72]
def p_Type(self, p):
"""Type : SingleType
| UnionType TypeSuffix"""
@@ -656,7 +681,7 @@ class IDLParser(object):
else:
p[0] = self.BuildProduction('Type', p, 1, ListFromConcat(p[1], p[2]))
- # [58]
+ # [73]
def p_SingleType(self, p):
"""SingleType : NonAnyType
| ANY TypeSuffixStartingWithArray"""
@@ -665,21 +690,21 @@ class IDLParser(object):
else:
p[0] = ListFromConcat(self.BuildProduction('Any', p, 1), p[2])
- # [59]
+ # [74]
def p_UnionType(self, p):
"""UnionType : '(' UnionMemberType OR UnionMemberType UnionMemberTypes ')'"""
- # [60]
+ # [75]
def p_UnionMemberType(self, p):
"""UnionMemberType : NonAnyType
| UnionType TypeSuffix
| ANY '[' ']' TypeSuffix"""
- # [61]
+ # [76]
def p_UnionMemberTypes(self, p):
"""UnionMemberTypes : OR UnionMemberType UnionMemberTypes
|"""
- # [62] Moved DATE, DOMSTRING, OBJECT to PrimitiveType
+ # [77] Moved BYTESTRING, DOMSTRING, OBJECT, DATE, REGEXP to PrimitiveType
def p_NonAnyType(self, p):
"""NonAnyType : PrimitiveType TypeSuffix
| identifier TypeSuffix
@@ -695,7 +720,7 @@ class IDLParser(object):
p[0] = self.BuildProduction('Sequence', p, 1, ListFromConcat(p[3], p[5]))
- # [63]
+ # [78]
def p_ConstType(self, p):
"""ConstType : PrimitiveType Null
| identifier Null"""
@@ -706,23 +731,25 @@ class IDLParser(object):
p[0] = p[1]
- # [64]
+ # [79]
Nils Barth (inactive) 2014/06/16 06:50:47 Could you note that we've added BYTESTRING etc.?
def p_PrimitiveType(self, p):
"""PrimitiveType : UnsignedIntegerType
| UnrestrictedFloatType
| BOOLEAN
| BYTE
| OCTET
+ | BYTESTRING
| DOMSTRING
+ | OBJECT
| DATE
- | OBJECT"""
+ | REGEXP"""
if type(p[1]) == str:
p[0] = self.BuildNamed('PrimitiveType', p, 1)
else:
p[0] = p[1]
- # [65]
+ # [80]
def p_UnrestrictedFloatType(self, p):
"""UnrestrictedFloatType : UNRESTRICTED FloatType
| FloatType"""
@@ -734,13 +761,13 @@ class IDLParser(object):
p[0] = typeref
- # [66]
+ # [81]
def p_FloatType(self, p):
"""FloatType : FLOAT
| DOUBLE"""
p[0] = p[1]
- # [67]
+ # [82]
def p_UnsignedIntegerType(self, p):
"""UnsignedIntegerType : UNSIGNED IntegerType
| IntegerType"""
@@ -749,7 +776,7 @@ class IDLParser(object):
else:
p[0] = 'unsigned ' + p[2]
- # [68]
+ # [83]
def p_IntegerType(self, p):
"""IntegerType : SHORT
| LONG OptionalLong"""
@@ -758,7 +785,7 @@ class IDLParser(object):
else:
p[0] = p[1] + p[2]
- # [69]
+ # [84]
def p_OptionalLong(self, p):
"""OptionalLong : LONG
| """
@@ -768,7 +795,7 @@ class IDLParser(object):
p[0] = ''
- # [70] Add support for sized array
+ # [85] Add support for sized array
def p_TypeSuffix(self, p):
"""TypeSuffix : '[' integer ']' TypeSuffix
| '[' ']' TypeSuffix
@@ -784,21 +811,21 @@ class IDLParser(object):
p[0] = ListFromConcat(self.BuildTrue('NULLABLE'), p[2])
- # [71]
+ # [86]
def p_TypeSuffixStartingWithArray(self, p):
"""TypeSuffixStartingWithArray : '[' ']' TypeSuffix
| """
if len(p) > 1:
p[0] = self.BuildProduction('Array', p, 0, p[3])
- # [72]
+ # [87]
def p_Null(self, p):
"""Null : '?'
|"""
if len(p) > 1:
p[0] = self.BuildTrue('NULLABLE')
- # [73]
+ # [88]
def p_ReturnType(self, p):
"""ReturnType : Type
| VOID"""
@@ -808,24 +835,26 @@ class IDLParser(object):
else:
p[0] = p[1]
- # [74]
+ # [89-90] NOT IMPLEMENTED
Nils Barth (inactive) 2014/06/16 06:50:48 Gloss: (IdentifierList)
+
+ # [91]
def p_ExtendedAttributeNoArgs(self, p):
"""ExtendedAttributeNoArgs : identifier"""
p[0] = self.BuildNamed('ExtAttribute', p, 1)
- # [75]
+ # [92]
def p_ExtendedAttributeArgList(self, p):
"""ExtendedAttributeArgList : identifier '(' ArgumentList ')'"""
arguments = self.BuildProduction('Arguments', p, 2, p[3])
p[0] = self.BuildNamed('ExtAttribute', p, 1, arguments)
- # [76]
+ # [93]
def p_ExtendedAttributeIdent(self, p):
"""ExtendedAttributeIdent : identifier '=' identifier"""
value = self.BuildAttribute('VALUE', p[3])
p[0] = self.BuildNamed('ExtAttribute', p, 1, value)
- # [77]
+ # [95]
Nils Barth (inactive) 2014/06/16 06:50:48 # [94] NOT IMPLEMENTED (ExtendedAttributeIdentList
def p_ExtendedAttributeNamedArgList(self, p):
"""ExtendedAttributeNamedArgList : identifier '=' identifier '(' ArgumentList ')'"""
args = self.BuildProduction('Arguments', p, 4, p[5])
« no previous file with comments | « tools/idl_parser/idl_node.py ('k') | tools/idl_parser/idl_ppapi_lexer.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698