webidl 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|