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

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: rebased 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 401dc4b320427ec6a8920f65aa2b25084153f52f..fabe2daa0008874928d3ddec526cc842f23acf37 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,77 +438,82 @@ class IDLParser(object):
p[0] = ListFromConcat(self.BuildAttribute('TYPE', 'float'),
self.BuildAttribute('VALUE', val))
- # [30]
- def p_AttributeOrOperation(self, p):
- """AttributeOrOperation : STRINGIFIER StringifierAttributeOrOperation
- | StaticAttribute
- | 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))
- else:
- p[0] = ListFromConcat(self.BuildAttribute('STRINGIFIER', p[1]), p[1])
+ # [32-37] NOT IMPLEMENTED (Serializer)
+ # [38-39] FIXME: NOT IMPLEMENTED (Stringifier) http://crbug.com/306606
- # [31.1] FIXME: temporary production as part of moving |static| into
- # base parser
- def p_StaticAttribute(self, p):
- """StaticAttribute : STATIC Attribute"""
+ # [40]
+ def p_StaticMember(self, p):
+ """StaticMember : STATIC StaticMemberRest"""
p[2].AddChildren(self.BuildTrue('STATIC'))
p[0] = p[2]
- # [32]
+ # [41]
+ def p_StaticMemberRest(self, p):
+ """StaticMemberRest : AttributeRest
+ | ReturnType OperationRest"""
+ if len(p) == 2:
+ p[0] = p[1]
+ else:
+ p[2].AddChildren(p[1])
+ p[0] = p[2]
+
+ # [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
@@ -510,14 +522,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 (IteratorRest)
- # [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
|"""
@@ -526,33 +544,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"""
@@ -563,13 +580,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
|"""
@@ -577,23 +594,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 ']'
| """
@@ -601,7 +618,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 """
@@ -612,7 +629,7 @@ class IDLParser(object):
else:
p[0] = p[1]
- # [50]
+ # [65]
def p_ExtendedAttributes(self, p):
"""ExtendedAttributes : ',' ExtendedAttribute ExtendedAttributes
|"""
@@ -624,8 +641,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
@@ -633,7 +650,7 @@ class IDLParser(object):
| ExtendedAttributeNamedArgList"""
p[0] = p[1]
- # [55]
+ # [70]
def p_ArgumentNameKeyword(self, p):
"""ArgumentNameKeyword : ATTRIBUTE
| CALLBACK
@@ -648,6 +665,7 @@ class IDLParser(object):
| INHERIT
| LEGACYCALLER
| PARTIAL
+ | SERIALIZER
| SETTER
| STATIC
| STRINGIFIER
@@ -655,7 +673,7 @@ class IDLParser(object):
| UNRESTRICTED"""
p[0] = p[1]
- # [57]
+ # [72]
def p_Type(self, p):
"""Type : SingleType
| UnionType TypeSuffix"""
@@ -664,7 +682,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"""
@@ -673,21 +691,24 @@ 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
+ # Moving all built-in types into PrimitiveType makes it easier to
+ # differentiate between them and 'identifier', since p[1] would be a string in
+ # both cases.
def p_NonAnyType(self, p):
"""NonAnyType : PrimitiveType TypeSuffix
| identifier TypeSuffix
@@ -703,7 +724,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"""
@@ -714,23 +735,25 @@ class IDLParser(object):
p[0] = p[1]
- # [64]
+ # [79] Added BYTESTRING, DOMSTRING, OBJECT, DATE, REGEXP
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"""
@@ -742,13 +765,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"""
@@ -757,7 +780,7 @@ class IDLParser(object):
else:
p[0] = 'unsigned ' + p[2]
- # [68]
+ # [83]
def p_IntegerType(self, p):
"""IntegerType : SHORT
| LONG OptionalLong"""
@@ -766,7 +789,7 @@ class IDLParser(object):
else:
p[0] = p[1] + p[2]
- # [69]
+ # [84]
def p_OptionalLong(self, p):
"""OptionalLong : LONG
| """
@@ -776,7 +799,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
@@ -792,21 +815,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"""
@@ -816,30 +839,36 @@ class IDLParser(object):
else:
p[0] = p[1]
- # [74]
+ # [89-90] NOT IMPLEMENTED (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]
+ # [94] NOT IMPLEMENTED (ExtendedAttributeIdentList)
+
+ # [95]
def p_ExtendedAttributeNamedArgList(self, p):
"""ExtendedAttributeNamedArgList : identifier '=' identifier '(' ArgumentList ')'"""
args = self.BuildProduction('Arguments', p, 4, p[5])
value = self.BuildNamed('Call', p, 3, args)
p[0] = self.BuildNamed('ExtAttribute', p, 1, value)
+ # [96] NOT IMPLEMENTED (ExtendedAttributeTypePair)
+
#
# Parser Errors
#
« 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