webidl 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +9 -0
- data/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +31 -0
- data/Rakefile +65 -0
- data/VERSION +1 -0
- data/bin/webidl2ruby +13 -0
- data/examples/html5.rb +6 -0
- data/lib/webidl.rb +47 -0
- data/lib/webidl/ast/argument.rb +25 -0
- data/lib/webidl/ast/attribute.rb +29 -0
- data/lib/webidl/ast/const.rb +17 -0
- data/lib/webidl/ast/exception.rb +15 -0
- data/lib/webidl/ast/extended_attribute.rb +14 -0
- data/lib/webidl/ast/field.rb +14 -0
- data/lib/webidl/ast/implements_statement.rb +14 -0
- data/lib/webidl/ast/interface.rb +24 -0
- data/lib/webidl/ast/module.rb +17 -0
- data/lib/webidl/ast/node.rb +29 -0
- data/lib/webidl/ast/operation.rb +43 -0
- data/lib/webidl/ast/scoped_name.rb +28 -0
- data/lib/webidl/ast/type.rb +20 -0
- data/lib/webidl/ast/typedef.rb +15 -0
- data/lib/webidl/extensions/string.rb +22 -0
- data/lib/webidl/extensions/syntax_node.rb +5 -0
- data/lib/webidl/generator.rb +38 -0
- data/lib/webidl/generator/ruby_sexp_visitor.rb +118 -0
- data/lib/webidl/parse_tree/absolute_scoped_name.rb +11 -0
- data/lib/webidl/parse_tree/argument.rb +20 -0
- data/lib/webidl/parse_tree/argument_list.rb +14 -0
- data/lib/webidl/parse_tree/attribute.rb +17 -0
- data/lib/webidl/parse_tree/const.rb +9 -0
- data/lib/webidl/parse_tree/definitions.rb +25 -0
- data/lib/webidl/parse_tree/exception.rb +15 -0
- data/lib/webidl/parse_tree/exception_field.rb +11 -0
- data/lib/webidl/parse_tree/extended_attributes.rb +41 -0
- data/lib/webidl/parse_tree/implements_statement.rb +20 -0
- data/lib/webidl/parse_tree/interface.rb +21 -0
- data/lib/webidl/parse_tree/interface_inheritance.rb +11 -0
- data/lib/webidl/parse_tree/interface_members.rb +21 -0
- data/lib/webidl/parse_tree/module.rb +15 -0
- data/lib/webidl/parse_tree/nullable_type.rb +11 -0
- data/lib/webidl/parse_tree/operation.rb +30 -0
- data/lib/webidl/parse_tree/relative_scoped_name.rb +15 -0
- data/lib/webidl/parse_tree/scoped_name_list.rb +16 -0
- data/lib/webidl/parse_tree/specials.rb +17 -0
- data/lib/webidl/parse_tree/stringifier_attribute_or_operation.rb +16 -0
- data/lib/webidl/parse_tree/typedef.rb +11 -0
- data/lib/webidl/parser/debug_helper.rb +17 -0
- data/lib/webidl/parser/idl.treetop +369 -0
- data/spec/ast_spec.rb +218 -0
- data/spec/fixtures/empty_interface.idl +3 -0
- data/spec/fixtures/empty_module.idl +3 -0
- data/spec/fixtures/framework.idl +48 -0
- data/spec/fixtures/html5.idl +1440 -0
- data/spec/fixtures/interface_with_attribute.idl +7 -0
- data/spec/fixtures/interface_with_inheritance.idl +9 -0
- data/spec/fixtures/interface_with_members.idl +5 -0
- data/spec/fixtures/interface_with_stringifiers.idl +5 -0
- data/spec/fixtures/module_with_exception.idl +13 -0
- data/spec/fixtures/module_with_implements_statement.idl +6 -0
- data/spec/fixtures/module_with_typedef.idl +4 -0
- data/spec/fixtures/module_with_xattr_ident.idl +4 -0
- data/spec/fixtures/module_with_xattr_named_args.idl +5 -0
- data/spec/fixtures/module_with_xattr_no_arg.idl +5 -0
- data/spec/fixtures/module_with_xattr_scoped.idl +4 -0
- data/spec/fixtures/module_with_xattr_two_args.idl +4 -0
- data/spec/fixtures/nested.idl +4 -0
- data/spec/fixtures/websocket.idl +19 -0
- data/spec/generator_spec.rb +92 -0
- data/spec/parser_spec.rb +64 -0
- data/spec/spec_helper.rb +45 -0
- metadata +161 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
module WebIDL
|
2
|
+
module ParseTree
|
3
|
+
class Interface < Treetop::Runtime::SyntaxNode
|
4
|
+
|
5
|
+
def build(parent)
|
6
|
+
intf = Ast::Interface.new(parent, name.text_value)
|
7
|
+
|
8
|
+
unless members.empty?
|
9
|
+
members.build(intf)
|
10
|
+
end
|
11
|
+
|
12
|
+
unless inherits.empty?
|
13
|
+
intf.inherits = inherits.build(parent)
|
14
|
+
end
|
15
|
+
|
16
|
+
intf
|
17
|
+
end
|
18
|
+
|
19
|
+
end # Interface
|
20
|
+
end # ParseTree
|
21
|
+
end # WebIDL
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module WebIDL
|
2
|
+
module ParseTree
|
3
|
+
class InterfaceMembers < Treetop::Runtime::SyntaxNode
|
4
|
+
|
5
|
+
def build(parent)
|
6
|
+
m = member.build(parent)
|
7
|
+
m.extended_attributes = eal.build(parent) unless eal.empty?
|
8
|
+
|
9
|
+
list = [m]
|
10
|
+
list += members.build(parent) unless members.empty?
|
11
|
+
|
12
|
+
if parent
|
13
|
+
parent.members = list
|
14
|
+
end
|
15
|
+
|
16
|
+
list
|
17
|
+
end
|
18
|
+
|
19
|
+
end # InterfaceMembers
|
20
|
+
end # ParseTree
|
21
|
+
end # WebIDL
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module WebIDL
|
2
|
+
module ParseTree
|
3
|
+
class Operation < Treetop::Runtime::SyntaxNode
|
4
|
+
|
5
|
+
def build(parent)
|
6
|
+
if respond_to?(:specials)
|
7
|
+
special_list = specials.build unless specials.empty?
|
8
|
+
operation = op
|
9
|
+
else
|
10
|
+
special_list = []
|
11
|
+
operation = self
|
12
|
+
end
|
13
|
+
|
14
|
+
debugger unless operation.type.respond_to?(:build)
|
15
|
+
typ = operation.type.build(parent)
|
16
|
+
name = operation.optional_id.text_value unless operation.optional_id.empty?
|
17
|
+
arguments = operation.args.build(parent) unless operation.args.empty?
|
18
|
+
raise_list = operation.raises.build unless operation.raises.empty?
|
19
|
+
|
20
|
+
Ast::Operation.new(
|
21
|
+
parent, typ, :name => name,
|
22
|
+
:specials => special_list,
|
23
|
+
:args => arguments,
|
24
|
+
:raises => raise_list
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
end # Operation
|
29
|
+
end # ParseTree
|
30
|
+
end # WebIDL
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module WebIDL
|
2
|
+
module ParseTree
|
3
|
+
class RelativeScopedName < Treetop::Runtime::SyntaxNode
|
4
|
+
|
5
|
+
def build(parent)
|
6
|
+
n = ''
|
7
|
+
n << name.text_value
|
8
|
+
n << parts.text_value
|
9
|
+
|
10
|
+
sn = Ast::ScopedName.new(parent, n, :relative => true)
|
11
|
+
end
|
12
|
+
|
13
|
+
end # RelativeScopedName
|
14
|
+
end # ParseTree
|
15
|
+
end # WebIDL
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module WebIDL
|
2
|
+
module ParseTree
|
3
|
+
class ScopedNameList < Treetop::Runtime::SyntaxNode
|
4
|
+
|
5
|
+
def build(parent)
|
6
|
+
result = []
|
7
|
+
|
8
|
+
result << name.build(parent)
|
9
|
+
result += names.build(parent) unless names.empty?
|
10
|
+
|
11
|
+
result
|
12
|
+
end
|
13
|
+
|
14
|
+
end # ScopedNameList
|
15
|
+
end # ParseTree
|
16
|
+
end # WebIDL
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module WebIDL
|
2
|
+
module ParseTree
|
3
|
+
class Specials < Treetop::Runtime::SyntaxNode
|
4
|
+
|
5
|
+
def build
|
6
|
+
result = []
|
7
|
+
|
8
|
+
result << first.text_value
|
9
|
+
result += rest.build unless rest.empty?
|
10
|
+
|
11
|
+
result
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
end # Specials
|
16
|
+
end # ParseTree
|
17
|
+
end # WebIDL
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module WebIDL
|
2
|
+
module ParseTree
|
3
|
+
class StringifierAttributeOrOperation < Treetop::Runtime::SyntaxNode
|
4
|
+
|
5
|
+
def build(parent)
|
6
|
+
unless a_or_op.empty? || a_or_op.text_value == ";"
|
7
|
+
elem = a_or_op.build(parent)
|
8
|
+
elem.stringifier = true
|
9
|
+
|
10
|
+
elem
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end # StringifierAttributeOrOperation
|
15
|
+
end # ParseTree
|
16
|
+
end # WebIDL
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module WebIDL
|
2
|
+
module Parser
|
3
|
+
module DebugHelper
|
4
|
+
|
5
|
+
def terminal_parse_failure(*args)
|
6
|
+
p :terminal_parse_failure => args
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def instantiate_node(node, input, interval, *args)
|
11
|
+
p :instantiating_from => caller.first[/in `(.+)'/, 1], :str => input[interval]
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
end # DebugHelper
|
16
|
+
end # Parser
|
17
|
+
end # WebIDL
|
@@ -0,0 +1,369 @@
|
|
1
|
+
module WebIDL
|
2
|
+
module Parser
|
3
|
+
|
4
|
+
# http://dev.w3.org/2006/webapi/WebIDL/#idl-grammar
|
5
|
+
grammar IDL
|
6
|
+
|
7
|
+
rule Definitions
|
8
|
+
ws metadef:(eal:ExtendedAttributeList ws d:Definition ws defs:Definitions)? ws <ParseTree::Definitions>
|
9
|
+
end
|
10
|
+
|
11
|
+
rule Definition
|
12
|
+
Module
|
13
|
+
/ Interface
|
14
|
+
/ Exception
|
15
|
+
/ TypeDef
|
16
|
+
/ ImplementsStatement
|
17
|
+
end
|
18
|
+
|
19
|
+
rule Module
|
20
|
+
"module" ws name:identifier ws "{" ws defs:Definitions ws "}" ws ";" <ParseTree::Module>
|
21
|
+
end
|
22
|
+
|
23
|
+
rule Interface
|
24
|
+
"interface" ws name:identifier ws inherits:InterfaceInheritance ws "{" ws members:InterfaceMembers ws "}" ws ";" <ParseTree::Interface>
|
25
|
+
end
|
26
|
+
|
27
|
+
rule InterfaceInheritance
|
28
|
+
(":" ws names:ScopedNameList <ParseTree::InterfaceInheritance>)?
|
29
|
+
end
|
30
|
+
|
31
|
+
# extract to a generic Members syntax node?
|
32
|
+
rule InterfaceMembers
|
33
|
+
(eal:ExtendedAttributeList ws member:InterfaceMember ws members:InterfaceMembers ws <ParseTree::InterfaceMembers>)?
|
34
|
+
end
|
35
|
+
|
36
|
+
rule InterfaceMember
|
37
|
+
Const / AttributeOrOperation
|
38
|
+
end
|
39
|
+
|
40
|
+
rule Exception
|
41
|
+
"exception" ws name:identifier ws "{" ws members:ExceptionMembers ws "}" ws ";" <ParseTree::Exception>
|
42
|
+
end
|
43
|
+
|
44
|
+
# extract to a generic Members syntax node?
|
45
|
+
rule ExceptionMembers
|
46
|
+
(eal:ExtendedAttributeList ws member:ExceptionMember ws members:ExceptionMembers ws <ParseTree::InterfaceMembers>)?
|
47
|
+
end
|
48
|
+
|
49
|
+
rule TypeDef
|
50
|
+
"typedef" ws type:Type ws name:identifier ws ";" <ParseTree::TypeDef>
|
51
|
+
end
|
52
|
+
|
53
|
+
rule ImplementsStatement
|
54
|
+
implementor:ScopedName ws "implements" ws implementee:ScopedName ws ";" <ParseTree::ImplementsStatement>
|
55
|
+
end
|
56
|
+
|
57
|
+
rule Const
|
58
|
+
"const" ws type:Type ws name:identifier ws "=" ws const_expr:ConstExpr ws ";" <ParseTree::Const>
|
59
|
+
end
|
60
|
+
|
61
|
+
rule ConstExpr
|
62
|
+
BooleanLiteral / integer / float
|
63
|
+
end
|
64
|
+
|
65
|
+
rule BooleanLiteral
|
66
|
+
("true" / "false") { def build() text_value == "true" end }
|
67
|
+
end
|
68
|
+
|
69
|
+
rule AttributeOrOperation
|
70
|
+
StringifierAttributeOrOperation / Attribute / Operation
|
71
|
+
end
|
72
|
+
|
73
|
+
rule StringifierAttributeOrOperation
|
74
|
+
"stringifier" ws a_or_op:(Attribute / OperationRest / ";") <ParseTree::StringifierAttributeOrOperation>
|
75
|
+
end
|
76
|
+
|
77
|
+
rule Attribute
|
78
|
+
readonly:ReadOnly ws "attribute" ws type:Type ws name:identifier ws getraises:GetRaises ws setraises:SetRaises ws ";" <ParseTree::Attribute>
|
79
|
+
end
|
80
|
+
|
81
|
+
rule ReadOnly
|
82
|
+
"readonly"?
|
83
|
+
end
|
84
|
+
|
85
|
+
rule GetRaises
|
86
|
+
("getraises" ws list:ExceptionList)?
|
87
|
+
end
|
88
|
+
|
89
|
+
rule SetRaises
|
90
|
+
("setraises" ws list:ExceptionList)?
|
91
|
+
end
|
92
|
+
|
93
|
+
rule Operation
|
94
|
+
specials:(OmittableSpecials / Specials) ws op:OperationRest <ParseTree::Operation>
|
95
|
+
end
|
96
|
+
|
97
|
+
rule OmittableSpecials
|
98
|
+
omit:"omittable" ws Specials <ParseTree::OmittableSpecials>
|
99
|
+
end
|
100
|
+
|
101
|
+
rule Specials
|
102
|
+
(first:Special ws rest:Specials <ParseTree::Specials>)?
|
103
|
+
end
|
104
|
+
|
105
|
+
rule Special
|
106
|
+
"getter"
|
107
|
+
/ "setter"
|
108
|
+
/ "creator"
|
109
|
+
/ "deleter"
|
110
|
+
/ "caller"
|
111
|
+
end
|
112
|
+
|
113
|
+
rule OperationRest
|
114
|
+
type:ReturnType ws optional_id:OptionalIdentifier ws "(" ws args:ArgumentList ws ")" ws raises:Raises ws ";" <ParseTree::Operation>
|
115
|
+
end
|
116
|
+
|
117
|
+
rule OptionalIdentifier
|
118
|
+
identifier?
|
119
|
+
end
|
120
|
+
|
121
|
+
rule Raises
|
122
|
+
("raises" ExceptionList)?
|
123
|
+
end
|
124
|
+
|
125
|
+
rule ExceptionList
|
126
|
+
"(" ScopedNameList ")"
|
127
|
+
end
|
128
|
+
|
129
|
+
rule ArgumentList
|
130
|
+
(arg:Argument ws args:Arguments <ParseTree::ArgumentList>)?
|
131
|
+
end
|
132
|
+
|
133
|
+
rule Arguments
|
134
|
+
("," ws arg:Argument ws args:Arguments <ParseTree::ArgumentList>)?
|
135
|
+
end
|
136
|
+
|
137
|
+
rule Argument
|
138
|
+
eal:ExtendedAttributeList ws In ws optional:Optional ws type:Type ws variadic:Ellipsis ws id:identifier <ParseTree::Argument>
|
139
|
+
end
|
140
|
+
|
141
|
+
rule In
|
142
|
+
"in"?
|
143
|
+
end
|
144
|
+
|
145
|
+
rule Optional
|
146
|
+
"optional"?
|
147
|
+
end
|
148
|
+
|
149
|
+
rule Ellipsis
|
150
|
+
"..."?
|
151
|
+
end
|
152
|
+
|
153
|
+
rule ExceptionMember
|
154
|
+
Const / ExceptionField
|
155
|
+
end
|
156
|
+
|
157
|
+
rule ExceptionField
|
158
|
+
type:Type ws id:identifier ws ";" <ParseTree::ExceptionField>
|
159
|
+
end
|
160
|
+
|
161
|
+
rule ExtendedAttributeList
|
162
|
+
("[" ws attribute:ExtendedAttribute ws attributes:ExtendedAttributes ws "]" <ParseTree::ExtendedAttributeList>)?
|
163
|
+
end
|
164
|
+
|
165
|
+
rule ExtendedAttributes
|
166
|
+
("," ws attribute:ExtendedAttribute ws attributes:ExtendedAttributes <ParseTree::ExtendedAttributeList>)?
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
#
|
171
|
+
# avoid infinite recursion trouble with the actual spec by using the "more restricted" ones
|
172
|
+
#
|
173
|
+
|
174
|
+
rule ExtendedAttribute
|
175
|
+
ExtendedAttributeNamedArgList
|
176
|
+
/ ExtendedAttributeIdent
|
177
|
+
/ ExtendedAttributeScopedName
|
178
|
+
/ ExtendedAttributeArgList
|
179
|
+
/ ExtendedAttributeNoArg
|
180
|
+
end
|
181
|
+
|
182
|
+
rule ExtendedAttributeNoArg
|
183
|
+
identifier {
|
184
|
+
def build(parent)
|
185
|
+
Ast::ExtendedAttribute.new(text_value)
|
186
|
+
end
|
187
|
+
}
|
188
|
+
end
|
189
|
+
|
190
|
+
rule ExtendedAttributeArgList
|
191
|
+
name:identifier "(" ws args:ArgumentList ws ")" <ParseTree::ExtendedAttributeArgList>
|
192
|
+
end
|
193
|
+
|
194
|
+
rule ExtendedAttributeScopedName
|
195
|
+
key:identifier "=" scoped_name:ScopedName <ParseTree::ExtendedAttributeScopedName>
|
196
|
+
end
|
197
|
+
|
198
|
+
rule ExtendedAttributeIdent
|
199
|
+
key:identifier "=" value:identifier !"::" <ParseTree::ExtendedAttributeIdent>
|
200
|
+
end
|
201
|
+
|
202
|
+
rule ExtendedAttributeNamedArgList
|
203
|
+
key:identifier "=" value:(name:identifier "(" ws args:ArgumentList ws ")" <ParseTree::ExtendedAttributeArgList>) <ParseTree::ExtendedAttributeNamedArgList>
|
204
|
+
end
|
205
|
+
|
206
|
+
|
207
|
+
# rule ExtendedAttribute
|
208
|
+
# "(" ws ExtendedAttributeInner ws ")" ws ExtendedAttributeRest
|
209
|
+
# / "[" ws ExtendedAttributeInner ws "]" ws ExtendedAttributeRest
|
210
|
+
# / "{" ws ExtendedAttributeInner ws "}" ws ExtendedAttributeRest
|
211
|
+
# / Other ws ExtendedAttributeRest
|
212
|
+
# end
|
213
|
+
#
|
214
|
+
# rule ExtendedAttributeRest
|
215
|
+
# ExtendedAttribute?
|
216
|
+
# end
|
217
|
+
#
|
218
|
+
# rule ExtendedAttributeInner
|
219
|
+
# ( "(" ws ExtendedAttributeInner ws ")" ws ExtendedAttributeInner
|
220
|
+
# / "[" ws ExtendedAttributeInner ws "]" ws ExtendedAttributeInner
|
221
|
+
# / "{" ws ExtendedAttributeInner ws "}" ws ExtendedAttributeInner
|
222
|
+
# / OtherOrComma ExtendedAttributeInner)?
|
223
|
+
# end
|
224
|
+
#
|
225
|
+
rule Other
|
226
|
+
integer
|
227
|
+
/ float
|
228
|
+
/ identifier
|
229
|
+
/ string
|
230
|
+
/ other
|
231
|
+
/ ":"
|
232
|
+
/ "::"
|
233
|
+
/ ";"
|
234
|
+
/ "<"
|
235
|
+
/ "="
|
236
|
+
/ ">"
|
237
|
+
/ "DOMString"
|
238
|
+
/ "FALSE"
|
239
|
+
/ "Object"
|
240
|
+
/ "TRUE"
|
241
|
+
/ "any"
|
242
|
+
/ "attribute"
|
243
|
+
/ "boolean"
|
244
|
+
/ "const"
|
245
|
+
/ "exception"
|
246
|
+
/ "float"
|
247
|
+
/ "getraises"
|
248
|
+
/ "in"
|
249
|
+
/ "interface"
|
250
|
+
/ "long"
|
251
|
+
/ "module"
|
252
|
+
/ "octet"
|
253
|
+
/ "raises"
|
254
|
+
/ "sequence"
|
255
|
+
/ "setraises"
|
256
|
+
/ "short"
|
257
|
+
/ "typedef"
|
258
|
+
/ "unsigned"
|
259
|
+
/ "valuetype"
|
260
|
+
end
|
261
|
+
|
262
|
+
rule OtherOrComma
|
263
|
+
Other / ","
|
264
|
+
end
|
265
|
+
|
266
|
+
rule Type
|
267
|
+
NullableType
|
268
|
+
/ ScopedName
|
269
|
+
/ "any"
|
270
|
+
/ "object"
|
271
|
+
end
|
272
|
+
|
273
|
+
#
|
274
|
+
# added: cannot be followed by a NonSpace character, since e.g. DOMStringMap would break parsing
|
275
|
+
#
|
276
|
+
|
277
|
+
rule NullableType
|
278
|
+
type:UnsignedIntegerType null:Nullable <ParseTree::NullableType>
|
279
|
+
/ type:"boolean" null:Nullable !NonSpace <ParseTree::NullableType>
|
280
|
+
/ type:"octet" null:Nullable !NonSpace <ParseTree::NullableType>
|
281
|
+
/ type:"float" null:Nullable !NonSpace <ParseTree::NullableType>
|
282
|
+
/ type:"double" null:Nullable !NonSpace <ParseTree::NullableType>
|
283
|
+
/ type:"DOMString" null:Nullable !NonSpace <ParseTree::NullableType>
|
284
|
+
/ type:"sequence" ws "<" ws Type ws ">" null:Nullable !NonSpace <ParseTree::NullableType>
|
285
|
+
end
|
286
|
+
|
287
|
+
rule UnsignedIntegerType
|
288
|
+
"unsigned" ws IntegerType / IntegerType
|
289
|
+
end
|
290
|
+
|
291
|
+
rule IntegerType
|
292
|
+
("short" / "long" ws OptionalLong)
|
293
|
+
end
|
294
|
+
|
295
|
+
rule OptionalLong
|
296
|
+
"long"?
|
297
|
+
end
|
298
|
+
|
299
|
+
rule Nullable
|
300
|
+
"?"?
|
301
|
+
end
|
302
|
+
|
303
|
+
rule NonSpace
|
304
|
+
(!' ' .)
|
305
|
+
end
|
306
|
+
|
307
|
+
rule ReturnType
|
308
|
+
Type / "void" <ParseTree::VoidType>
|
309
|
+
end
|
310
|
+
|
311
|
+
rule ScopedNameList
|
312
|
+
name:ScopedName ws names:ScopedNames <ParseTree::ScopedNameList>
|
313
|
+
end
|
314
|
+
|
315
|
+
rule ScopedNames
|
316
|
+
("," ScopedName ws ScopedNames)?
|
317
|
+
end
|
318
|
+
|
319
|
+
rule ScopedName
|
320
|
+
AbsoluteScopedName / RelativeScopedName
|
321
|
+
end
|
322
|
+
|
323
|
+
rule AbsoluteScopedName
|
324
|
+
"::" name:identifier parts:ScopedNameParts <ParseTree::AbsoluteScopedName>
|
325
|
+
end
|
326
|
+
|
327
|
+
rule RelativeScopedName
|
328
|
+
name:identifier parts:ScopedNameParts <ParseTree::RelativeScopedName>
|
329
|
+
end
|
330
|
+
|
331
|
+
rule ScopedNameParts
|
332
|
+
("::" ws name:identifier parts:ScopedNameParts)?
|
333
|
+
end
|
334
|
+
|
335
|
+
rule integer
|
336
|
+
("-"? "0" ([0-7]* / [Xx] [0-9A-Fa-f]+) / [1-9] [0-9]*) { def build() Integer(text_value) end} # TODO: check edge cases
|
337
|
+
end
|
338
|
+
|
339
|
+
rule float
|
340
|
+
("-"? ([0-9]+ "." [0-9]* / [0-9]* "." [0-9]+) ([Ee] [+-]? [0-9]+)? / [0-9]+ [Ee] [+-]? [0-9]+) { def build() Float(text_value) end} # TODO: check edge cases
|
341
|
+
end
|
342
|
+
|
343
|
+
rule identifier
|
344
|
+
[A-Z_a-z] [0-9A-Z_a-z]* { def build() text_value[/^_?(.+)/, 1] end}
|
345
|
+
end
|
346
|
+
|
347
|
+
rule string
|
348
|
+
"\"" [^"]* "\""
|
349
|
+
end
|
350
|
+
|
351
|
+
rule ws
|
352
|
+
([\t\n\r ]* ((line_comment / block_comment) [\t\n\r ]*)+ / [\t\n\r ]+)?
|
353
|
+
end
|
354
|
+
|
355
|
+
rule other
|
356
|
+
[^\t\n\r 0-9A-Z_a-z]
|
357
|
+
end
|
358
|
+
|
359
|
+
rule line_comment
|
360
|
+
"//" (![\n\r] . )*
|
361
|
+
end
|
362
|
+
|
363
|
+
rule block_comment
|
364
|
+
'/*' (!'*/' . )* '*/'
|
365
|
+
end
|
366
|
+
|
367
|
+
end # IDL
|
368
|
+
end # Parser
|
369
|
+
end # WebIDL
|