4
# Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org>
6
# This library is free software; you can redistribute it and/or
7
# modify it under the terms of the GNU Library General Public
8
# License as published by the Free Software Foundation; either
9
# version 2 of the License, or (at your option) any later version.
11
# This library is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
# Library General Public License for more details.
16
# You should have received a copy of the GNU Library General Public License
17
# along with this library; see the file COPYING.LIB. If not, write to
18
# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19
# Boston, MA 02110-1301, USA.
29
use constant StringToken => 0;
30
use constant IntegerToken => 1;
31
use constant FloatToken => 2;
32
use constant IdentifierToken => 3;
33
use constant OtherToken => 4;
34
use constant EmptyToken => 5;
36
# Used to represent a parsed IDL document
37
struct( idlDocument => {
38
interfaces => '@', # All parsed interfaces
39
fileName => '$' # file name
42
# Used to represent 'interface' blocks
43
struct( domInterface => {
44
name => '$', # Class identifier
45
parents => '@', # List of strings
46
constants => '@', # List of 'domConstant'
47
functions => '@', # List of 'domFunction'
48
attributes => '@', # List of 'domAttribute'
49
extendedAttributes => '$', # Extended attributes
50
constructors => '@', # Constructor
51
isException => '$', # Used for exception interfaces
54
# Used to represent domInterface contents (name of method, signature)
55
struct( domFunction => {
57
signature => '$', # Return type/Object name/extended attributes
58
parameters => '@', # List of 'domSignature'
59
raisesExceptions => '@', # Possibly raised exceptions.
62
# Used to represent domInterface contents (name of attribute, signature)
63
struct( domAttribute => {
64
type => '$', # Attribute type (including namespace)
66
signature => '$', # Attribute signature
67
getterExceptions => '@', # Possibly raised exceptions.
68
setterExceptions => '@', # Possibly raised exceptions.
71
# Used to represent a map of 'variable name' <-> 'variable type'
72
struct( domSignature => {
73
direction => '$', # Variable direction (in or out)
74
name => '$', # Variable name
75
type => '$', # Variable type
76
extendedAttributes => '$', # Extended attributes
77
isNullable => '$', # Is variable type Nullable (T?)
78
isVariadic => '$' # Is variable variadic (long... numbers)
81
# Used to represent string constants
82
struct( domConstant => {
83
name => '$', # DOM Constant identifier
84
type => '$', # Type of data
85
value => '$', # Constant value
86
extendedAttributes => '$', # Extended attributes
90
type => '$', # type of token
91
value => '$' # value of token
97
my $emptyToken = Token->new();
98
$emptyToken->type(EmptyToken);
99
$emptyToken->value("empty");
102
DocumentContent => "",
103
EmptyToken => $emptyToken,
104
NextToken => $emptyToken,
105
Token => $emptyToken,
109
return bless $self, $class;
118
my $msg = "Next token should be " . $value . ", but " . $token->value() . " at " . $self->{Line};
119
if (defined ($line)) {
120
$msg .= " IDLParser.pm:" . $line;
122
die $msg unless $token->value() eq $value;
130
die "Next token's type should be " . $type . ", but " . $token->type() . " at " . $self->{Line} unless $token->type() eq $type;
133
sub assertUnexpectedToken
138
my $msg = "Unexpected token " . $token . " at " . $self->{Line};
139
if (defined ($line)) {
140
$msg .= " IDLParser.pm:" . $line;
148
my $fileName = shift;
150
my $preprocessor = shift;
152
my @definitions = ();
154
my @lines = applyPreprocessor($fileName, $defines, $preprocessor);
155
$self->{Line} = $lines[0];
156
$self->{DocumentContent} = join(' ', @lines);
160
my $result = $self->parseDefinitions();
161
push(@definitions, @{$result});
163
my $next = $self->nextToken();
164
$self->assertTokenType($next, EmptyToken);
166
die $@ . " in $fileName" if $@;
168
die "No document found" unless @definitions;
171
if ($#definitions == 0 && ref($definitions[0]) eq "idlDocument") {
172
$document = $definitions[0];
174
$document = idlDocument->new();
175
push(@{$document->interfaces}, @definitions);
178
$document->fileName($fileName);
185
return $self->{NextToken};
191
$self->{Token} = $self->{NextToken};
192
$self->{NextToken} = $self->getTokenInternal();
193
return $self->{Token};
196
my $whitespaceTokenPattern = '^[\t\n\r ]*[\n\r]';
197
my $floatTokenPattern = '^(-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+))';
198
my $integerTokenPattern = '^(-?[1-9][0-9]*|-?0[Xx][0-9A-Fa-f]+|-?0[0-7]*)';
199
my $stringTokenPattern = '^(\"[^\"]*\")';
200
my $identifierTokenPattern = '^([A-Z_a-z][0-9A-Z_a-z]*)';
201
my $otherTokenPattern = '^(::|\.\.\.|[^\t\n\r 0-9A-Z_a-z])';
207
if ($self->{DocumentContent} =~ /$whitespaceTokenPattern/) {
208
$self->{DocumentContent} =~ s/($whitespaceTokenPattern)//;
210
$self->{LineNumber}++ while ($skipped =~ /\n/g);
211
if ($self->{DocumentContent} =~ /^([^\n\r]+)/) {
212
$self->{Line} = $self->{LineNumber} . ":" . $1;
214
$self->{Line} = "Unknown";
217
$self->{DocumentContent} =~ s/^([\t\n\r ]+)//;
218
if ($self->{DocumentContent} eq "") {
219
return $self->{EmptyToken};
222
my $token = Token->new();
223
if ($self->{DocumentContent} =~ /$floatTokenPattern/) {
224
$token->type(FloatToken);
226
$self->{DocumentContent} =~ s/$floatTokenPattern//;
229
if ($self->{DocumentContent} =~ /$integerTokenPattern/) {
230
$token->type(IntegerToken);
232
$self->{DocumentContent} =~ s/$integerTokenPattern//;
235
if ($self->{DocumentContent} =~ /$stringTokenPattern/) {
236
$token->type(StringToken);
238
$self->{DocumentContent} =~ s/$stringTokenPattern//;
241
if ($self->{DocumentContent} =~ /$identifierTokenPattern/) {
242
$token->type(IdentifierToken);
244
$self->{DocumentContent} =~ s/$identifierTokenPattern//;
247
if ($self->{DocumentContent} =~ /$otherTokenPattern/) {
248
$token->type(OtherToken);
250
$self->{DocumentContent} =~ s/$otherTokenPattern//;
253
die "Failed in tokenizing at " . $self->{Line};
256
my $nextAttributeOld_1 = '^(attribute|inherit|readonly)$';
257
my $nextPrimitiveType_1 = '^(int|long|short|unsigned)$';
258
my $nextPrimitiveType_2 = '^(double|float|unrestricted)$';
259
my $nextSetGetRaises2_1 = '^(;|getraises|setraises)$';
260
my $nextArgumentList_1 = '^(\(|::|ByteString|DOMString|Date|\[|any|boolean|byte|double|float|in|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$';
261
my $nextNonAnyType_1 = '^(boolean|byte|double|float|int|long|octet|short|unrestricted|unsigned)$';
262
my $nextInterfaceMemberOld_1 = '^(\(|::|ByteString|DOMString|Date|any|attribute|boolean|byte|creator|deleter|double|float|getter|inherit|int|legacycaller|long|object|octet|readonly|sequence|serializer|setter|short|static|stringifier|unrestricted|unsigned|void)$';
263
my $nextOptionalIteratorInterfaceOrObject_1 = '^(;|=)$';
264
my $nextAttributeOrOperationOrIterator_1 = '^(static|stringifier)$';
265
my $nextAttributeOrOperationOrIterator_2 = '^(\(|::|ByteString|DOMString|Date|any|boolean|byte|creator|deleter|double|float|getter|int|legacycaller|long|object|octet|sequence|setter|short|unrestricted|unsigned|void)$';
266
my $nextUnrestrictedFloatType_1 = '^(double|float)$';
267
my $nextExtendedAttributeRest3_1 = '^(\,|::|\])$';
268
my $nextExceptionField_1 = '^(\(|::|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
269
my $nextType_1 = '^(::|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
270
my $nextSpecials_1 = '^(creator|deleter|getter|legacycaller|setter)$';
271
my $nextDefinitions_1 = '^(::|callback|dictionary|enum|exception|interface|partial|typedef)$';
272
my $nextExceptionMembers_1 = '^(\(|::|ByteString|DOMString|Date|\[|any|boolean|byte|const|double|float|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$';
273
my $nextAttributeRest_1 = '^(attribute|readonly)$';
274
my $nextInterfaceMembers_1 = '^(\(|::|ByteString|DOMString|Date|any|attribute|boolean|byte|const|creator|deleter|double|float|getter|inherit|int|legacycaller|long|object|octet|readonly|sequence|serializer|setter|short|static|stringifier|unrestricted|unsigned|void)$';
275
my $nextSingleType_1 = '^(::|ByteString|DOMString|Date|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$';
276
my $nextGet_1 = '^(;|getraises|getter|setraises|setter)$';
277
my $nextArgumentName_1 = '^(attribute|callback|const|creator|deleter|dictionary|enum|exception|getter|implements|inherit|interface|legacycaller|partial|serializer|setter|static|stringifier|typedef|unrestricted)$';
278
my $nextConstValue_1 = '^(false|true)$';
279
my $nextConstValue_2 = '^(-|Infinity|NaN)$';
280
my $nextDefinition_1 = '^(callback|interface)$';
281
my $nextAttributeOrOperationRest_1 = '^(\(|::|ByteString|DOMString|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned|void)$';
282
my $nextUnsignedIntegerType_1 = '^(int|long|short)$';
283
my $nextDefaultValue_1 = '^(-|Infinity|NaN|false|null|true)$';
289
my @definitions = ();
292
my $next = $self->nextToken();
294
if ($next->value() eq "[") {
295
my $extendedAttributeList = $self->parseExtendedAttributeList();
296
$definition = $self->parseDefinition($extendedAttributeList);
297
} elsif ($next->type() == IdentifierToken || $next->value() =~ /$nextDefinitions_1/) {
298
$definition = $self->parseDefinitionOld();
302
if (defined ($definition)) {
303
push(@definitions, $definition);
306
return \@definitions;
312
my $extendedAttributeList = shift;
314
my $next = $self->nextToken();
315
if ($next->value() =~ /$nextDefinition_1/) {
316
return $self->parseCallbackOrInterface($extendedAttributeList);
318
if ($next->value() eq "partial") {
319
return $self->parsePartial($extendedAttributeList);
321
if ($next->value() eq "dictionary") {
322
return $self->parseDictionary($extendedAttributeList);
324
if ($next->value() eq "exception") {
325
return $self->parseException($extendedAttributeList);
327
if ($next->value() eq "enum") {
328
return $self->parseEnum($extendedAttributeList);
330
if ($next->value() eq "typedef") {
331
return $self->parseTypedef($extendedAttributeList);
333
if ($next->type() == IdentifierToken || $next->value() eq "::") {
334
return $self->parseImplementsStatement($extendedAttributeList);
336
$self->assertUnexpectedToken($next->value(), __LINE__);
339
sub parseCallbackOrInterface
342
my $extendedAttributeList = shift;
344
my $next = $self->nextToken();
345
if ($next->value() eq "callback") {
346
$self->assertTokenValue($self->getToken(), "callback", __LINE__);
347
return $self->parseCallbackRestOrInterface($extendedAttributeList);
349
if ($next->value() eq "interface") {
350
return $self->parseInterface($extendedAttributeList);
352
$self->assertUnexpectedToken($next->value(), __LINE__);
355
sub parseCallbackRestOrInterface
358
my $extendedAttributeList = shift;
360
my $next = $self->nextToken();
361
if ($next->value() eq "interface") {
362
return $self->parseInterface($extendedAttributeList);
364
if ($next->type() == IdentifierToken) {
365
return $self->parseCallbackRest($extendedAttributeList);
367
$self->assertUnexpectedToken($next->value(), __LINE__);
373
my $extendedAttributeList = shift;
375
my $next = $self->nextToken();
376
if ($next->value() eq "interface") {
377
my $interface = domInterface->new();
378
$self->assertTokenValue($self->getToken(), "interface", __LINE__);
379
my $interfaceNameToken = $self->getToken();
380
$self->assertTokenType($interfaceNameToken, IdentifierToken);
381
$interface->name($interfaceNameToken->value());
382
push(@{$interface->parents}, @{$self->parseInheritance()});
383
$self->assertTokenValue($self->getToken(), "{", __LINE__);
384
my $interfaceMembers = $self->parseInterfaceMembers();
385
$self->assertTokenValue($self->getToken(), "}", __LINE__);
386
$self->assertTokenValue($self->getToken(), ";", __LINE__);
387
applyMemberList($interface, $interfaceMembers);
388
applyExtendedAttributeList($interface, $extendedAttributeList);
391
$self->assertUnexpectedToken($next->value(), __LINE__);
397
my $extendedAttributeList = shift;
399
my $next = $self->nextToken();
400
if ($next->value() eq "partial") {
401
$self->assertTokenValue($self->getToken(), "partial", __LINE__);
402
return $self->parsePartialDefinition($extendedAttributeList);
404
$self->assertUnexpectedToken($next->value(), __LINE__);
407
sub parsePartialDefinition
410
my $extendedAttributeList = shift;
412
my $next = $self->nextToken();
413
if ($next->value() eq "interface") {
414
return $self->parsePartialInterface($extendedAttributeList);
416
if ($next->value() eq "dictionary") {
417
return $self->parsePartialDictionary($extendedAttributeList);
419
$self->assertUnexpectedToken($next->value(), __LINE__);
422
sub parsePartialInterface
425
my $extendedAttributeList = shift;
427
my $next = $self->nextToken();
428
if ($next->value() eq "interface") {
429
$self->assertTokenValue($self->getToken(), "interface", __LINE__);
430
$self->assertTokenType($self->getToken(), IdentifierToken);
431
$self->assertTokenValue($self->getToken(), "{", __LINE__);
432
$self->parseInterfaceMembers();
433
$self->assertTokenValue($self->getToken(), "}", __LINE__);
434
$self->assertTokenValue($self->getToken(), ";", __LINE__);
437
$self->assertUnexpectedToken($next->value(), __LINE__);
440
sub parseInterfaceMembers
443
my @interfaceMembers = ();
446
my $next = $self->nextToken();
449
if ($next->value() eq "[") {
450
my $extendedAttributeList = $self->parseExtendedAttributeList();
451
$interfaceMember = $self->parseInterfaceMember($extendedAttributeList);
452
} elsif ($next->type() == IdentifierToken || $next->value() =~ /$nextInterfaceMembers_1/) {
453
$interfaceMember = $self->parseInterfaceMemberOld();
457
if (defined $interfaceMember) {
458
push(@interfaceMembers, $interfaceMember);
461
return \@interfaceMembers;
464
sub parseInterfaceMember
467
my $extendedAttributeList = shift;
469
my $next = $self->nextToken();
470
if ($next->value() eq "const") {
471
return $self->parseConst($extendedAttributeList);
473
if ($next->type() == IdentifierToken || $next->value() =~ /$nextInterfaceMemberOld_1/) {
474
return $self->parseAttributeOrOperationOrIterator($extendedAttributeList);
476
$self->assertUnexpectedToken($next->value(), __LINE__);
482
my $extendedAttributeList = shift;
484
my $next = $self->nextToken();
485
if ($next->value() eq "dictionary") {
486
$self->assertTokenValue($self->getToken(), "dictionary", __LINE__);
487
$self->assertTokenType($self->getToken(), IdentifierToken);
488
$self->parseInheritance();
489
$self->assertTokenValue($self->getToken(), "{", __LINE__);
490
$self->parseDictionaryMembers();
491
$self->assertTokenValue($self->getToken(), "}", __LINE__);
492
$self->assertTokenValue($self->getToken(), ";", __LINE__);
495
$self->assertUnexpectedToken($next->value(), __LINE__);
498
sub parseDictionaryMembers
503
my $next = $self->nextToken();
504
if ($next->value() eq "[") {
505
my $extendedAttributeList = $self->parseExtendedAttributeList();
506
$self->parseDictionaryMember($extendedAttributeList);
507
} elsif ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) {
508
$self->parseDictionaryMemberOld();
515
sub parseDictionaryMember
518
my $extendedAttributeList = shift;
520
my $next = $self->nextToken();
521
if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) {
523
$self->assertTokenType($self->getToken(), IdentifierToken);
524
$self->parseDefault();
525
$self->assertTokenValue($self->getToken(), ";", __LINE__);
528
$self->assertUnexpectedToken($next->value(), __LINE__);
531
sub parsePartialDictionary
534
my $next = $self->nextToken();
535
if ($next->value() eq "dictionary") {
536
$self->assertTokenValue($self->getToken(), "dictionary", __LINE__);
537
$self->assertTokenType($self->getToken(), IdentifierToken);
538
$self->assertTokenValue($self->getToken(), "{", __LINE__);
539
$self->parseDictionaryMembers();
540
$self->assertTokenValue($self->getToken(), "}", __LINE__);
541
$self->assertTokenValue($self->getToken(), ";", __LINE__);
544
$self->assertUnexpectedToken($next->value(), __LINE__);
550
my $next = $self->nextToken();
551
if ($next->value() eq "=") {
552
$self->assertTokenValue($self->getToken(), "=", __LINE__);
553
return $self->parseDefaultValue();
557
sub parseDefaultValue
560
my $next = $self->nextToken();
561
if ($next->type() == FloatToken || $next->type() == IntegerToken || $next->value() =~ /$nextDefaultValue_1/) {
562
return $self->parseConstValue();
564
if ($next->type() == StringToken) {
565
return $self->getToken()->value();
567
$self->assertUnexpectedToken($next->value(), __LINE__);
573
my $extendedAttributeList = shift;
575
my $next = $self->nextToken();
576
if ($next->value() eq "exception") {
577
my $interface = domInterface->new();
578
$self->assertTokenValue($self->getToken(), "exception", __LINE__);
579
my $exceptionNameToken = $self->getToken();
580
$self->assertTokenType($exceptionNameToken, IdentifierToken);
581
$interface->name($exceptionNameToken->value());
582
$interface->isException(1);
583
push(@{$interface->parents}, @{$self->parseInheritance()});
584
$self->assertTokenValue($self->getToken(), "{", __LINE__);
585
my $exceptionMembers = $self->parseExceptionMembers();
586
$self->assertTokenValue($self->getToken(), "}", __LINE__);
587
$self->assertTokenValue($self->getToken(), ";", __LINE__);
588
applyMemberList($interface, $exceptionMembers);
589
applyExtendedAttributeList($interface, $extendedAttributeList);
592
$self->assertUnexpectedToken($next->value(), __LINE__);
595
sub parseExceptionMembers
601
my $next = $self->nextToken();
602
if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionMembers_1/) {
603
my $extendedAttributeList = $self->parseExtendedAttributeListAllowEmpty();
604
#my $member = $self->parseExceptionMember($extendedAttributeList);
605
my $member = $self->parseInterfaceMember($extendedAttributeList);
606
if (defined ($member)) {
607
push(@members, $member);
621
my $next = $self->nextToken();
622
if ($next->value() eq ":") {
623
$self->assertTokenValue($self->getToken(), ":", __LINE__);
624
my $scopedName = $self->parseScopedName();
625
push(@parent, $scopedName);
626
# Multiple inheritance?
627
push(@parent, @{$self->parseIdentifiers()});
635
my $extendedAttributeList = shift;
637
my $next = $self->nextToken();
638
if ($next->value() eq "enum") {
639
$self->assertTokenValue($self->getToken(), "enum", __LINE__);
640
$self->assertTokenType($self->getToken(), IdentifierToken);
641
$self->assertTokenValue($self->getToken(), "{", __LINE__);
642
$self->parseEnumValueList();
643
$self->assertTokenValue($self->getToken(), "}", __LINE__);
644
$self->assertTokenValue($self->getToken(), ";", __LINE__);
647
$self->assertUnexpectedToken($next->value(), __LINE__);
650
sub parseEnumValueList
653
my $next = $self->nextToken();
654
if ($next->type() == StringToken) {
655
$self->assertTokenType($self->getToken(), StringToken);
656
$self->parseEnumValues();
659
$self->assertUnexpectedToken($next->value(), __LINE__);
665
my $next = $self->nextToken();
666
if ($next->value() eq ",") {
667
$self->assertTokenValue($self->getToken(), ",", __LINE__);
668
$self->assertTokenType($self->getToken(), StringToken);
669
$self->parseEnumValues();
673
sub parseCallbackRest
676
my $extendedAttributeList = shift;
678
my $next = $self->nextToken();
679
if ($next->type() == IdentifierToken) {
680
$self->assertTokenType($self->getToken(), IdentifierToken);
681
$self->assertTokenValue($self->getToken(), "=", __LINE__);
682
$self->parseReturnType();
683
$self->assertTokenValue($self->getToken(), "(", __LINE__);
684
$self->parseArgumentList();
685
$self->assertTokenValue($self->getToken(), ")", __LINE__);
686
$self->assertTokenValue($self->getToken(), ";", __LINE__);
689
$self->assertUnexpectedToken($next->value(), __LINE__);
695
my $extendedAttributeList = shift;
697
my $next = $self->nextToken();
698
if ($next->value() eq "typedef") {
699
$self->assertTokenValue($self->getToken(), "typedef", __LINE__);
700
$self->parseExtendedAttributeList();
702
$self->assertTokenType($self->getToken(), IdentifierToken);
703
$self->assertTokenValue($self->getToken(), ";", __LINE__);
706
$self->assertUnexpectedToken($next->value(), __LINE__);
709
sub parseImplementsStatement
712
my $extendedAttributeList = shift;
714
my $next = $self->nextToken();
715
if ($next->type() == IdentifierToken) {
716
$self->parseScopedName();
717
$self->assertTokenValue($self->getToken(), "implements", __LINE__);
718
$self->parseScopedName();
719
$self->assertTokenValue($self->getToken(), ";", __LINE__);
722
$self->assertUnexpectedToken($next->value(), __LINE__);
728
my $extendedAttributeList = shift;
730
my $next = $self->nextToken();
731
if ($next->value() eq "const") {
732
my $newDataNode = domConstant->new();
733
$self->assertTokenValue($self->getToken(), "const", __LINE__);
734
$newDataNode->type($self->parseConstType());
735
my $constNameToken = $self->getToken();
736
$self->assertTokenType($constNameToken, IdentifierToken);
737
$newDataNode->name($constNameToken->value());
738
$self->assertTokenValue($self->getToken(), "=", __LINE__);
739
$newDataNode->value($self->parseConstValue());
740
$self->assertTokenValue($self->getToken(), ";", __LINE__);
741
$newDataNode->extendedAttributes($extendedAttributeList);
744
$self->assertUnexpectedToken($next->value(), __LINE__);
750
my $next = $self->nextToken();
751
if ($next->value() =~ /$nextConstValue_1/) {
752
return $self->parseBooleanLiteral();
754
if ($next->value() eq "null") {
755
$self->assertTokenValue($self->getToken(), "null", __LINE__);
758
if ($next->type() == FloatToken || $next->value() =~ /$nextConstValue_2/) {
759
return $self->parseFloatLiteral();
761
# backward compatibility
762
if ($next->type() == StringToken) {
763
return $self->getToken()->value();
765
if ($next->type() == IntegerToken) {
766
return $self->getToken()->value();
768
$self->assertUnexpectedToken($next->value(), __LINE__);
771
sub parseBooleanLiteral
774
my $next = $self->nextToken();
775
if ($next->value() eq "true") {
776
$self->assertTokenValue($self->getToken(), "true", __LINE__);
779
if ($next->value() eq "false") {
780
$self->assertTokenValue($self->getToken(), "false", __LINE__);
783
$self->assertUnexpectedToken($next->value(), __LINE__);
786
sub parseFloatLiteral
789
my $next = $self->nextToken();
790
if ($next->value() eq "-") {
791
$self->assertTokenValue($self->getToken(), "-", __LINE__);
792
$self->assertTokenValue($self->getToken(), "Infinity", __LINE__);
795
if ($next->value() eq "Infinity") {
796
$self->assertTokenValue($self->getToken(), "Infinity", __LINE__);
799
if ($next->value() eq "NaN") {
800
$self->assertTokenValue($self->getToken(), "NaN", __LINE__);
803
if ($next->type() == FloatToken) {
804
return $self->getToken()->value();
806
$self->assertUnexpectedToken($next->value(), __LINE__);
809
sub parseAttributeOrOperationOrIterator
812
my $extendedAttributeList = shift;
814
my $next = $self->nextToken();
815
if ($next->value() eq "serializer") {
816
return $self->parseSerializer($extendedAttributeList);
818
if ($next->value() =~ /$nextAttributeOrOperationOrIterator_1/) {
819
my $qualifier = $self->parseQualifier();
820
my $newDataNode = $self->parseAttributeOrOperationRest($extendedAttributeList);
821
if (defined($newDataNode) && $qualifier eq "static") {
822
$newDataNode->isStatic(1);
826
if ($next->value() =~ /$nextAttributeOld_1/) {
827
return $self->parseAttribute($extendedAttributeList);
829
if ($next->type() == IdentifierToken || $next->value() =~ /$nextAttributeOrOperationOrIterator_2/) {
830
return $self->parseOperationOrIterator($extendedAttributeList);
832
$self->assertUnexpectedToken($next->value(), __LINE__);
838
my $extendedAttributeList = shift;
840
my $next = $self->nextToken();
841
if ($next->value() eq "serializer") {
842
$self->assertTokenValue($self->getToken(), "serializer", __LINE__);
843
return $self->parseSerializerRest($extendedAttributeList);
845
$self->assertUnexpectedToken($next->value(), __LINE__);
848
sub parseSerializerRest
851
my $extendedAttributeList = shift;
853
my $next = $self->nextToken();
854
if ($next->value() eq "=") {
855
$self->assertTokenValue($self->getToken(), "=", __LINE__);
856
return $self->parseSerializationPattern($extendedAttributeList);
858
if ($next->type() == IdentifierToken || $next->value() eq "(") {
859
return $self->parseOperationRest($extendedAttributeList);
863
sub parseSerializationPattern
866
my $extendedAttributeList = shift;
868
my $next = $self->nextToken();
869
if ($next->value() eq "{") {
870
$self->assertTokenValue($self->getToken(), "{", __LINE__);
871
$self->parseSerializationPatternMap();
872
$self->assertTokenValue($self->getToken(), "}", __LINE__);
875
if ($next->value() eq "[") {
876
$self->assertTokenValue($self->getToken(), "[", __LINE__);
877
$self->parseSerializationPatternList();
878
$self->assertTokenValue($self->getToken(), "]", __LINE__);
881
if ($next->type() == IdentifierToken) {
882
$self->assertTokenType($self->getToken(), IdentifierToken);
885
$self->assertUnexpectedToken($next->value(), __LINE__);
888
sub parseSerializationPatternMap
891
my $next = $self->nextToken();
892
if ($next->value() eq "getter") {
893
$self->assertTokenValue($self->getToken(), "getter", __LINE__);
896
if ($next->value() eq "inherit") {
897
$self->assertTokenValue($self->getToken(), "inherit", __LINE__);
898
$self->parseIdentifiers();
901
if ($next->type() == IdentifierToken) {
902
$self->assertTokenType($self->getToken(), IdentifierToken);
903
$self->parseIdentifiers();
907
sub parseSerializationPatternList
910
my $next = $self->nextToken();
911
if ($next->value() eq "getter") {
912
$self->assertTokenValue($self->getToken(), "getter", __LINE__);
915
if ($next->type() == IdentifierToken) {
916
$self->assertTokenType($self->getToken(), IdentifierToken);
917
$self->parseIdentifiers();
927
my $next = $self->nextToken();
928
if ($next->value() eq ",") {
929
$self->assertTokenValue($self->getToken(), ",", __LINE__);
930
my $token = $self->getToken();
931
$self->assertTokenType($token, IdentifierToken);
932
push(@idents, $token->value());
944
my $next = $self->nextToken();
945
if ($next->value() eq "static") {
946
$self->assertTokenValue($self->getToken(), "static", __LINE__);
949
if ($next->value() eq "stringifier") {
950
$self->assertTokenValue($self->getToken(), "stringifier", __LINE__);
951
return "stringifier";
953
$self->assertUnexpectedToken($next->value(), __LINE__);
956
sub parseAttributeOrOperationRest
959
my $extendedAttributeList = shift;
961
my $next = $self->nextToken();
962
if ($next->value() =~ /$nextAttributeRest_1/) {
963
return $self->parseAttributeRest($extendedAttributeList);
965
if ($next->value() eq ";") {
966
$self->assertTokenValue($self->getToken(), ";", __LINE__);
969
if ($next->type() == IdentifierToken || $next->value() =~ /$nextAttributeOrOperationRest_1/) {
970
my $returnType = $self->parseReturnType();
971
my $interface = $self->parseOperationRest($extendedAttributeList);
972
if (defined ($interface)) {
973
$interface->signature->type($returnType);
977
$self->assertUnexpectedToken($next->value(), __LINE__);
983
my $extendedAttributeList = shift;
985
my $next = $self->nextToken();
986
if ($next->value() =~ /$nextAttributeOld_1/) {
987
$self->parseInherit();
988
return $self->parseAttributeRest($extendedAttributeList);
990
$self->assertUnexpectedToken($next->value(), __LINE__);
993
sub parseAttributeRest
996
my $extendedAttributeList = shift;
998
my $next = $self->nextToken();
999
if ($next->value() =~ /$nextAttributeRest_1/) {
1000
my $newDataNode = domAttribute->new();
1001
if ($self->parseReadOnly()) {
1002
$newDataNode->type("readonly attribute");
1004
$newDataNode->type("attribute");
1006
$self->assertTokenValue($self->getToken(), "attribute", __LINE__);
1007
$newDataNode->signature(domSignature->new());
1008
$newDataNode->signature->type($self->parseType());
1009
my $token = $self->getToken();
1010
$self->assertTokenType($token, IdentifierToken);
1011
$newDataNode->signature->name($token->value());
1012
my $getRef = $self->parseGet();
1013
if (defined $getRef) {
1014
push(@{$newDataNode->getterExceptions}, @{$getRef->{"getraises"}});
1015
push(@{$newDataNode->setterExceptions}, @{$getRef->{"setraises"}});
1017
$self->assertTokenValue($self->getToken(), ";", __LINE__);
1018
$newDataNode->signature->extendedAttributes($extendedAttributeList);
1019
return $newDataNode;
1021
$self->assertUnexpectedToken($next->value(), __LINE__);
1027
my $next = $self->nextToken();
1028
if ($next->value() eq "inherit") {
1029
$self->assertTokenValue($self->getToken(), "inherit", __LINE__);
1038
my $next = $self->nextToken();
1039
if ($next->value() eq "readonly") {
1040
$self->assertTokenValue($self->getToken(), "readonly", __LINE__);
1046
sub parseOperationOrIterator
1049
my $extendedAttributeList = shift;
1051
my $next = $self->nextToken();
1052
if ($next->value() =~ /$nextSpecials_1/) {
1053
return $self->parseSpecialOperation($extendedAttributeList);
1055
if ($next->type() == IdentifierToken || $next->value() =~ /$nextAttributeOrOperationRest_1/) {
1056
my $returnType = $self->parseReturnType();
1057
my $interface = $self->parseOperationOrIteratorRest($extendedAttributeList);
1058
if (defined ($interface)) {
1059
$interface->signature->type($returnType);
1063
$self->assertUnexpectedToken($next->value(), __LINE__);
1066
sub parseSpecialOperation
1069
my $extendedAttributeList = shift;
1071
my $next = $self->nextToken();
1072
if ($next->value() =~ /$nextSpecials_1/) {
1073
$self->parseSpecial();
1074
$self->parseSpecials();
1075
my $returnType = $self->parseReturnType();
1076
my $interface = $self->parseOperationRest($extendedAttributeList);
1077
if (defined ($interface)) {
1078
$interface->signature->type($returnType);
1082
$self->assertUnexpectedToken($next->value(), __LINE__);
1090
my $next = $self->nextToken();
1091
if ($next->value() =~ /$nextSpecials_1/) {
1092
$self->parseSpecial();
1103
my $next = $self->nextToken();
1104
if ($next->value() eq "getter") {
1105
$self->assertTokenValue($self->getToken(), "getter", __LINE__);
1108
if ($next->value() eq "setter") {
1109
$self->assertTokenValue($self->getToken(), "setter", __LINE__);
1112
if ($next->value() eq "creator") {
1113
$self->assertTokenValue($self->getToken(), "creator", __LINE__);
1116
if ($next->value() eq "deleter") {
1117
$self->assertTokenValue($self->getToken(), "deleter", __LINE__);
1120
if ($next->value() eq "legacycaller") {
1121
$self->assertTokenValue($self->getToken(), "legacycaller", __LINE__);
1122
return "legacycaller";
1124
$self->assertUnexpectedToken($next->value(), __LINE__);
1127
sub parseOperationOrIteratorRest
1130
my $extendedAttributeList = shift;
1132
my $next = $self->nextToken();
1133
if ($next->value() eq "iterator") {
1134
return $self->parseIteratorRest($extendedAttributeList);
1136
if ($next->type() == IdentifierToken || $next->value() eq "(") {
1137
return $self->parseOperationRest($extendedAttributeList);
1139
$self->assertUnexpectedToken($next->value(), __LINE__);
1142
sub parseIteratorRest
1145
my $extendedAttributeList = shift;
1147
my $next = $self->nextToken();
1148
if ($next->value() eq "iterator") {
1149
$self->assertTokenValue($self->getToken(), "iterator", __LINE__);
1150
$self->parseOptionalIteratorInterfaceOrObject($extendedAttributeList);
1151
$self->assertTokenValue($self->getToken(), ";", __LINE__);
1154
$self->assertUnexpectedToken($next->value(), __LINE__);
1157
sub parseOptionalIteratorInterfaceOrObject
1160
my $extendedAttributeList = shift;
1162
my $next = $self->nextToken();
1163
if ($next->value() =~ /$nextOptionalIteratorInterfaceOrObject_1/) {
1164
return $self->parseOptionalIteratorInterface($extendedAttributeList);
1166
if ($next->value() eq "object") {
1167
$self->assertTokenValue($self->getToken(), "object", __LINE__);
1170
$self->assertUnexpectedToken($next->value(), __LINE__);
1173
sub parseOptionalIteratorInterface
1176
my $extendedAttributeList = shift;
1178
my $next = $self->nextToken();
1179
if ($next->value() eq "=") {
1180
$self->assertTokenValue($self->getToken(), "=", __LINE__);
1181
$self->assertTokenType($self->getToken(), IdentifierToken);
1185
sub parseOperationRest
1188
my $extendedAttributeList = shift;
1190
my $next = $self->nextToken();
1191
if ($next->type() == IdentifierToken || $next->value() eq "(") {
1192
my $newDataNode = domFunction->new();
1193
$newDataNode->signature(domSignature->new());
1194
my $name = $self->parseOptionalIdentifier();
1195
$newDataNode->signature->name($name);
1196
$self->assertTokenValue($self->getToken(), "(", $name, __LINE__);
1197
push(@{$newDataNode->parameters}, @{$self->parseArgumentList()});
1198
$self->assertTokenValue($self->getToken(), ")", __LINE__);
1199
push(@{$newDataNode->raisesExceptions}, @{$self->parseRaises()});
1200
$self->assertTokenValue($self->getToken(), ";", __LINE__);
1201
$newDataNode->signature->extendedAttributes($extendedAttributeList);
1202
return $newDataNode;
1204
$self->assertUnexpectedToken($next->value(), __LINE__);
1207
sub parseOptionalIdentifier
1210
my $next = $self->nextToken();
1211
if ($next->type() == IdentifierToken) {
1212
my $token = $self->getToken();
1213
return $token->value();
1218
sub parseArgumentList
1223
my $next = $self->nextToken();
1224
if ($next->type() == IdentifierToken || $next->value() =~ /$nextArgumentList_1/) {
1225
push(@arguments, $self->parseArgument());
1226
push(@arguments, @{$self->parseArguments()});
1237
my $next = $self->nextToken();
1238
if ($next->value() eq ",") {
1239
$self->assertTokenValue($self->getToken(), ",", __LINE__);
1240
push(@arguments, $self->parseArgument());
1251
my $next = $self->nextToken();
1252
if ($next->type() == IdentifierToken || $next->value() =~ /$nextArgumentList_1/) {
1253
my $in = $self->parseIn();
1254
my $extendedAttributeList = $self->parseExtendedAttributeListAllowEmpty();
1255
my $argument = $self->parseOptionalOrRequiredArgument($extendedAttributeList);
1256
$argument->direction($self->parseIn());
1259
$self->assertUnexpectedToken($next->value(), __LINE__);
1262
sub parseOptionalOrRequiredArgument
1265
my $extendedAttributeList = shift;
1267
my $paramDataNode = domSignature->new();
1268
$paramDataNode->extendedAttributes($extendedAttributeList);
1270
my $next = $self->nextToken();
1271
if ($next->value() eq "optional") {
1272
$self->assertTokenValue($self->getToken(), "optional", __LINE__);
1273
my $type = $self->parseType();
1274
# domDataNode can only consider last "?".
1275
if ($type =~ /\?$/) {
1276
$paramDataNode->isNullable(1);
1278
$paramDataNode->isNullable(0);
1280
# Remove all "?" if exists, e.g. "object?[]?" -> "object[]".
1282
$paramDataNode->type($type);
1283
$paramDataNode->name($self->parseArgumentName());
1284
$self->parseDefault();
1285
return $paramDataNode;
1287
if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) {
1288
my $type = $self->parseType();
1289
# domDataNode can only consider last "?".
1290
if ($type =~ /\?$/) {
1291
$paramDataNode->isNullable(1);
1293
$paramDataNode->isNullable(0);
1295
# Remove all "?" if exists, e.g. "object?[]?" -> "object[]".
1297
$paramDataNode->type($type);
1298
$paramDataNode->isVariadic($self->parseEllipsis());
1299
$paramDataNode->name($self->parseArgumentName());
1300
return $paramDataNode;
1302
$self->assertUnexpectedToken($next->value(), __LINE__);
1305
sub parseArgumentName
1308
my $next = $self->nextToken();
1309
if ($next->value() =~ /$nextArgumentName_1/) {
1310
return $self->parseArgumentNameKeyword();
1312
if ($next->type() == IdentifierToken) {
1313
return $self->getToken()->value();
1315
$self->assertUnexpectedToken($next->value(), __LINE__);
1321
my $next = $self->nextToken();
1322
if ($next->value() eq "...") {
1323
$self->assertTokenValue($self->getToken(), "...", __LINE__);
1329
sub parseExceptionMember
1332
my $extendedAttributeList = shift;
1334
my $next = $self->nextToken();
1335
if ($next->value() eq "const") {
1336
return $self->parseConst($extendedAttributeList);
1338
if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) {
1339
return $self->parseExceptionField($extendedAttributeList);
1341
$self->assertUnexpectedToken($next->value(), __LINE__);
1344
sub parseExceptionField
1347
my $extendedAttributeList = shift;
1349
my $next = $self->nextToken();
1350
if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) {
1351
my $newDataNode = domAttribute->new();
1352
$newDataNode->type("readonly attribute");
1353
$newDataNode->signature(domSignature->new());
1354
$newDataNode->signature->type($self->parseType());
1355
my $token = $self->getToken();
1356
$self->assertTokenType($token, IdentifierToken);
1357
$newDataNode->signature->name($token->value());
1358
$self->assertTokenValue($self->getToken(), ";", __LINE__);
1359
$newDataNode->signature->extendedAttributes($extendedAttributeList);
1360
return $newDataNode;
1362
$self->assertUnexpectedToken($next->value(), __LINE__);
1365
sub parseExtendedAttributeListAllowEmpty
1368
my $next = $self->nextToken();
1369
if ($next->value() eq "[") {
1370
return $self->parseExtendedAttributeList();
1375
sub copyExtendedAttributes
1377
my $extendedAttributeList = shift;
1380
for my $key (keys %{$attr}) {
1381
if ($key eq "Constructor") {
1382
push(@{$extendedAttributeList->{"Constructors"}}, $attr->{$key});
1383
} elsif ($key eq "Constructors") {
1384
my @constructors = @{$attr->{$key}};
1385
foreach my $constructor (@constructors) {
1386
push(@{$extendedAttributeList->{"Constructors"}}, $constructor);
1389
$extendedAttributeList->{$key} = $attr->{$key};
1394
sub parseExtendedAttributeList
1397
my $next = $self->nextToken();
1398
if ($next->value() eq "[") {
1399
$self->assertTokenValue($self->getToken(), "[", __LINE__);
1400
my $extendedAttributeList = {};
1401
my $attr = $self->parseExtendedAttribute();
1402
copyExtendedAttributes($extendedAttributeList, $attr);
1403
$attr = $self->parseExtendedAttributes();
1404
copyExtendedAttributes($extendedAttributeList, $attr);
1405
$self->assertTokenValue($self->getToken(), "]", __LINE__);
1406
return $extendedAttributeList;
1408
$self->assertUnexpectedToken($next->value(), __LINE__);
1411
sub parseExtendedAttributes
1414
my $extendedAttributeList = {};
1417
my $next = $self->nextToken();
1418
if ($next->value() eq ",") {
1419
$self->assertTokenValue($self->getToken(), ",", __LINE__);
1420
my $attr = $self->parseExtendedAttribute2();
1421
copyExtendedAttributes($extendedAttributeList, $attr);
1426
return $extendedAttributeList;
1429
sub parseExtendedAttribute
1432
my $next = $self->nextToken();
1433
if ($next->type() == IdentifierToken || $next->value() eq "::") {
1434
my $scopedName = $self->parseScopedName();
1435
return $self->parseExtendedAttributeRest($scopedName);
1437
# backward compatibility. Spec doesn' allow "[]". But WebKit requires.
1438
if ($next->value() eq ']') {
1441
$self->assertUnexpectedToken($next->value(), __LINE__);
1444
sub parseExtendedAttribute2
1447
my $next = $self->nextToken();
1448
if ($next->type() == IdentifierToken || $next->value() eq "::") {
1449
my $scopedName = $self->parseScopedName();
1450
return $self->parseExtendedAttributeRest($scopedName);
1455
sub parseExtendedAttributeRest
1461
my $next = $self->nextToken();
1462
if ($next->value() eq "(") {
1463
$self->assertTokenValue($self->getToken(), "(", __LINE__);
1464
$attrs->{$name} = $self->parseArgumentList();
1465
$self->assertTokenValue($self->getToken(), ")", __LINE__);
1468
if ($next->value() eq "=") {
1469
$self->assertTokenValue($self->getToken(), "=", __LINE__);
1470
$attrs->{$name} = $self->parseExtendedAttributeRest2();
1474
if ($name eq "Constructor") {
1475
$attrs->{$name} = [];
1477
$attrs->{$name} = "VALUE_IS_MISSING";
1482
sub parseExtendedAttributeRest2
1485
my $next = $self->nextToken();
1486
if ($next->type() == IdentifierToken || $next->value() eq "::") {
1487
my $scopedName = $self->parseScopedName();
1488
return $self->parseExtendedAttributeRest3($scopedName);
1490
if ($next->type() == IntegerToken) {
1491
my $token = $self->getToken();
1492
return $token->value();
1494
$self->assertUnexpectedToken($next->value(), __LINE__);
1497
sub parseExtendedAttributeRest3
1502
my $next = $self->nextToken();
1503
if ($next->value() eq "&") {
1504
$self->assertTokenValue($self->getToken(), "&", __LINE__);
1505
my $rightValue = $self->parseScopedName();
1506
return $name . "&" . $rightValue;
1508
if ($next->value() eq "|") {
1509
$self->assertTokenValue($self->getToken(), "|", __LINE__);
1510
my $rightValue = $self->parseScopedName();
1511
return $name . "|" . $rightValue;
1513
if ($next->value() eq "(") {
1515
$self->assertTokenValue($self->getToken(), "(", __LINE__);
1516
$attr->{$name} = $self->parseArgumentList();
1517
$self->assertTokenValue($self->getToken(), ")", __LINE__);
1520
if ($next->type() == IdentifierToken || $next->value() =~ /$nextExtendedAttributeRest3_1/) {
1522
push(@names, $name);
1523
push(@names, @{$self->parseScopedNameListNoComma()});
1524
return join(' ', @names);
1526
$self->assertUnexpectedToken($next->value());
1529
sub parseScopedNameListNoComma
1535
my $next = $self->nextToken();
1536
if ($next->type() == IdentifierToken || $next->value() eq "::") {
1537
push(@names, $self->parseScopedName());
1545
sub parseArgumentNameKeyword
1548
my $next = $self->nextToken();
1549
if ($next->value() eq "attribute") {
1550
return $self->getToken()->value();
1552
if ($next->value() eq "callback") {
1553
return $self->getToken()->value();
1555
if ($next->value() eq "const") {
1556
return $self->getToken()->value();
1558
if ($next->value() eq "creator") {
1559
return $self->getToken()->value();
1561
if ($next->value() eq "deleter") {
1562
return $self->getToken()->value();
1564
if ($next->value() eq "dictionary") {
1565
return $self->getToken()->value();
1567
if ($next->value() eq "enum") {
1568
return $self->getToken()->value();
1570
if ($next->value() eq "exception") {
1571
return $self->getToken()->value();
1573
if ($next->value() eq "getter") {
1574
return $self->getToken()->value();
1576
if ($next->value() eq "implements") {
1577
return $self->getToken()->value();
1579
if ($next->value() eq "inherit") {
1580
return $self->getToken()->value();
1582
if ($next->value() eq "interface") {
1583
return $self->getToken()->value();
1585
if ($next->value() eq "legacycaller") {
1586
return $self->getToken()->value();
1588
if ($next->value() eq "partial") {
1589
return $self->getToken()->value();
1591
if ($next->value() eq "serializer") {
1592
return $self->getToken()->value();
1594
if ($next->value() eq "setter") {
1595
return $self->getToken()->value();
1597
if ($next->value() eq "static") {
1598
return $self->getToken()->value();
1600
if ($next->value() eq "stringifier") {
1601
return $self->getToken()->value();
1603
if ($next->value() eq "typedef") {
1604
return $self->getToken()->value();
1606
if ($next->value() eq "unrestricted") {
1607
return $self->getToken()->value();
1609
$self->assertUnexpectedToken($next->value(), __LINE__);
1615
my $next = $self->nextToken();
1616
if ($next->value() eq "(") {
1617
$self->parseUnionType();
1618
$self->parseTypeSuffix();
1621
if ($next->type() == IdentifierToken || $next->value() =~ /$nextType_1/) {
1622
return $self->parseSingleType();
1624
$self->assertUnexpectedToken($next->value(), __LINE__);
1630
my $next = $self->nextToken();
1631
if ($next->value() eq "any") {
1632
$self->assertTokenValue($self->getToken(), "any", __LINE__);
1633
return "any" . $self->parseTypeSuffixStartingWithArray();
1635
if ($next->type() == IdentifierToken || $next->value() =~ /$nextSingleType_1/) {
1636
return $self->parseNonAnyType();
1638
$self->assertUnexpectedToken($next->value(), __LINE__);
1644
my $next = $self->nextToken();
1645
if ($next->value() eq "(") {
1646
$self->assertTokenValue($self->getToken(), "(", __LINE__);
1647
$self->parseUnionMemberType();
1648
$self->assertTokenValue($self->getToken(), "or", __LINE__);
1649
$self->parseUnionMemberType();
1650
$self->parseUnionMemberTypes();
1651
$self->assertTokenValue($self->getToken(), ")", __LINE__);
1654
$self->assertUnexpectedToken($next->value(), __LINE__);
1657
sub parseUnionMemberType
1660
my $next = $self->nextToken();
1661
if ($next->value() eq "(") {
1662
$self->parseUnionType();
1663
$self->parseTypeSuffix();
1666
if ($next->value() eq "any") {
1667
$self->assertTokenValue($self->getToken(), "any", __LINE__);
1668
$self->assertTokenValue($self->getToken(), "[", __LINE__);
1669
$self->assertTokenValue($self->getToken(), "]", __LINE__);
1670
$self->parseTypeSuffix();
1673
if ($next->type() == IdentifierToken || $next->value() =~ /$nextSingleType_1/) {
1674
$self->parseNonAnyType();
1677
$self->assertUnexpectedToken($next->value(), __LINE__);
1680
sub parseUnionMemberTypes
1683
my $next = $self->nextToken();
1684
if ($next->value() eq "or") {
1685
$self->assertTokenValue($self->getToken(), "or", __LINE__);
1686
$self->parseUnionMemberType();
1687
$self->parseUnionMemberTypes();
1694
my $next = $self->nextToken();
1695
if ($next->value() =~ /$nextNonAnyType_1/) {
1696
return $self->parsePrimitiveType() . $self->parseTypeSuffix();
1698
if ($next->value() eq "ByteString") {
1699
$self->assertTokenValue($self->getToken(), "ByteString", __LINE__);
1700
return "ByteString" . $self->parseTypeSuffix();
1702
if ($next->value() eq "DOMString") {
1703
$self->assertTokenValue($self->getToken(), "DOMString", __LINE__);
1704
return "DOMString" . $self->parseTypeSuffix();
1706
if ($next->value() eq "sequence") {
1707
$self->assertTokenValue($self->getToken(), "sequence", __LINE__);
1708
$self->assertTokenValue($self->getToken(), "<", __LINE__);
1709
my $type = $self->parseType();
1710
$self->assertTokenValue($self->getToken(), ">", __LINE__);
1711
return "sequence<" . $type . ">" . $self->parseNull();
1713
if ($next->value() eq "object") {
1714
$self->assertTokenValue($self->getToken(), "object", __LINE__);
1715
return "object" . $self->parseTypeSuffix();
1717
if ($next->value() eq "Date") {
1718
$self->assertTokenValue($self->getToken(), "Date", __LINE__);
1719
return "Date" . $self->parseTypeSuffix();
1721
if ($next->type() == IdentifierToken || $next->value() eq "::") {
1722
my $name = $self->parseScopedName();
1723
return $name . $self->parseTypeSuffix();
1725
$self->assertUnexpectedToken($next->value(), __LINE__);
1731
my $next = $self->nextToken();
1732
if ($next->value() =~ /$nextNonAnyType_1/) {
1733
return $self->parsePrimitiveType() . $self->parseNull();
1735
if ($next->type() == IdentifierToken) {
1736
my $token = $self->getToken();
1737
return $token->value() . $self->parseNull();
1739
$self->assertUnexpectedToken($next->value(), __LINE__);
1742
sub parsePrimitiveType
1745
my $next = $self->nextToken();
1746
if ($next->value() =~ /$nextPrimitiveType_1/) {
1747
return $self->parseUnsignedIntegerType();
1749
if ($next->value() =~ /$nextPrimitiveType_2/) {
1750
return $self->parseUnrestrictedFloatType();
1752
if ($next->value() eq "boolean") {
1753
$self->assertTokenValue($self->getToken(), "boolean", __LINE__);
1756
if ($next->value() eq "byte") {
1757
$self->assertTokenValue($self->getToken(), "byte", __LINE__);
1760
if ($next->value() eq "octet") {
1761
$self->assertTokenValue($self->getToken(), "octet", __LINE__);
1764
$self->assertUnexpectedToken($next->value(), __LINE__);
1767
sub parseUnrestrictedFloatType
1770
my $next = $self->nextToken();
1771
if ($next->value() eq "unrestricted") {
1772
$self->assertTokenValue($self->getToken(), "unrestricted", __LINE__);
1773
return "unrestricted" . $self->parseFloatType();
1775
if ($next->value() =~ /$nextUnrestrictedFloatType_1/) {
1776
return $self->parseFloatType();
1778
$self->assertUnexpectedToken($next->value(), __LINE__);
1784
my $next = $self->nextToken();
1785
if ($next->value() eq "float") {
1786
$self->assertTokenValue($self->getToken(), "float", __LINE__);
1789
if ($next->value() eq "double") {
1790
$self->assertTokenValue($self->getToken(), "double", __LINE__);
1793
$self->assertUnexpectedToken($next->value(), __LINE__);
1796
sub parseUnsignedIntegerType
1799
my $next = $self->nextToken();
1800
if ($next->value() eq "unsigned") {
1801
$self->assertTokenValue($self->getToken(), "unsigned", __LINE__);
1802
return "unsigned " . $self->parseIntegerType();
1804
if ($next->value() =~ /$nextUnsignedIntegerType_1/) {
1805
return $self->parseIntegerType();
1807
$self->assertUnexpectedToken($next->value(), __LINE__);
1810
sub parseIntegerType
1813
my $next = $self->nextToken();
1814
if ($next->value() eq "short") {
1815
$self->assertTokenValue($self->getToken(), "short", __LINE__);
1818
if ($next->value() eq "int") {
1819
$self->assertTokenValue($self->getToken(), "int", __LINE__);
1822
if ($next->value() eq "long") {
1823
$self->assertTokenValue($self->getToken(), "long", __LINE__);
1824
if ($self->parseOptionalLong()) {
1829
$self->assertUnexpectedToken($next->value(), __LINE__);
1832
sub parseOptionalLong
1835
my $next = $self->nextToken();
1836
if ($next->value() eq "long") {
1837
$self->assertTokenValue($self->getToken(), "long", __LINE__);
1846
my $next = $self->nextToken();
1847
if ($next->value() eq "[") {
1848
$self->assertTokenValue($self->getToken(), "[", __LINE__);
1849
$self->assertTokenValue($self->getToken(), "]", __LINE__);
1850
return "[]" . $self->parseTypeSuffix();
1852
if ($next->value() eq "?") {
1853
$self->assertTokenValue($self->getToken(), "?", __LINE__);
1854
return "?" . $self->parseTypeSuffixStartingWithArray();
1859
sub parseTypeSuffixStartingWithArray
1862
my $next = $self->nextToken();
1863
if ($next->value() eq "[") {
1864
$self->assertTokenValue($self->getToken(), "[", __LINE__);
1865
$self->assertTokenValue($self->getToken(), "]", __LINE__);
1866
return "[]" . $self->parseTypeSuffix();
1874
my $next = $self->nextToken();
1875
if ($next->value() eq "?") {
1876
$self->assertTokenValue($self->getToken(), "?", __LINE__);
1885
my $next = $self->nextToken();
1886
if ($next->value() eq "void") {
1887
$self->assertTokenValue($self->getToken(), "void", __LINE__);
1890
if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) {
1891
return $self->parseType();
1893
$self->assertUnexpectedToken($next->value(), __LINE__);
1899
my $next = $self->nextToken();
1900
if ($next->value() eq "inherits") {
1902
$self->parseInheritsGetter();
1903
$attr->{"inherits"} = 1;
1904
$attr->{"getraises"} = [];
1905
$attr->{"setraises"} = $self->parseSetRaises();
1908
if ($next->value() =~ /$nextGet_1/) {
1909
return $self->parseSetGetRaises();
1913
sub parseInheritsGetter
1916
my $next = $self->nextToken();
1917
if ($next->value() eq "inherits") {
1918
$self->assertTokenValue($self->getToken(), "inherits", __LINE__);
1919
$self->assertTokenValue($self->getToken(), "getter", __LINE__);
1922
$self->assertUnexpectedToken($next->value(), __LINE__);
1925
sub parseSetGetRaises
1929
$attr->{"inherits"} = 0;
1931
my $next = $self->nextToken();
1932
if ($next->value() eq "setter") {
1933
$attr->{"setraises"} = $self->parseSetRaises();
1934
$attr->{"getraises"} = $self->parseGetRaises2();
1937
if ($next->value() eq "getter") {
1938
$attr->{"setraises"} = [];
1939
$attr->{"getraises"} = $self->parseGetRaises();
1942
if ($next->value() =~ /$nextSetGetRaises2_1/) {
1943
return $self->parseSetGetRaises2();
1945
$self->assertUnexpectedToken($next->value(), __LINE__);
1951
my $next = $self->nextToken();
1953
if ($next->value() eq "getter") {
1954
$self->assertTokenValue($self->getToken(), "getter", __LINE__);
1955
$self->assertTokenValue($self->getToken(), "raises", __LINE__);
1956
return $self->parseExceptionList();
1958
$self->assertUnexpectedToken($next->value(), __LINE__);
1964
my $next = $self->nextToken();
1966
if ($next->value() eq ",") {
1967
$self->assertTokenValue($self->getToken(), ",", __LINE__);
1968
$self->assertTokenValue($self->getToken(), "getter", __LINE__);
1969
$self->assertTokenValue($self->getToken(), "raises", __LINE__);
1970
return $self->parseExceptionList();
1978
my $next = $self->nextToken();
1979
if ($next->value() eq "setter") {
1980
$self->assertTokenValue($self->getToken(), "setter", __LINE__);
1981
$self->assertTokenValue($self->getToken(), "raises", __LINE__);
1982
return $self->parseExceptionList();
1984
$self->assertUnexpectedToken($next->value(), __LINE__);
1987
sub parseSetGetRaises2
1990
my $next = $self->nextToken();
1991
if ($next->value() =~ /$nextSetGetRaises2_1/) {
1993
$attr->{"inherits"} = 0;
1994
$attr->{"getraises"} = $self->parseGetRaises3();
1995
$attr->{"setraises"} = $self->parseSetRaises3();
1998
$self->assertUnexpectedToken($next->value(), __LINE__);
2004
my $next = $self->nextToken();
2005
if ($next->value() eq "getraises") {
2006
$self->assertTokenValue($self->getToken(), "getraises", __LINE__);
2007
return $self->parseExceptionList();
2015
my $next = $self->nextToken();
2016
if ($next->value() eq "setraises") {
2017
$self->assertTokenValue($self->getToken(), "setraises", __LINE__);
2018
return $self->parseExceptionList();
2023
sub parseExceptionList
2026
my $next = $self->nextToken();
2027
if ($next->value() eq "(") {
2028
my @exceptions = ();
2029
$self->assertTokenValue($self->getToken(), "(", __LINE__);
2030
push(@exceptions, @{$self->parseScopedNameList()});
2031
$self->assertTokenValue($self->getToken(), ")", __LINE__);
2032
return \@exceptions;
2034
$self->assertUnexpectedToken($next->value(), __LINE__);
2040
my $next = $self->nextToken();
2041
if ($next->value() eq "raises") {
2042
$self->assertTokenValue($self->getToken(), "raises", __LINE__);
2043
return $self->parseExceptionList();
2048
sub parseDefinitionOld
2051
my $next = $self->nextToken();
2052
if ($next->value() =~ /$nextDefinition_1/) {
2053
return $self->parseCallbackOrInterfaceOld();
2055
if ($next->value() eq "partial") {
2056
return $self->parsePartial({});
2058
if ($next->value() eq "dictionary") {
2059
return $self->parseDictionaryOld();
2061
if ($next->value() eq "exception") {
2062
return $self->parseExceptionOld();
2064
if ($next->value() eq "enum") {
2065
return $self->parseEnumOld();
2067
if ($next->value() eq "typedef") {
2068
return $self->parseTypedef({});
2070
if ($next->type() == IdentifierToken || $next->value() eq "::") {
2071
return $self->parseImplementsStatement({});
2073
$self->assertUnexpectedToken($next->value(), __LINE__);
2076
sub parseCallbackOrInterfaceOld
2079
my $next = $self->nextToken();
2080
if ($next->value() eq "callback") {
2081
$self->assertTokenValue($self->getToken(), "callback", __LINE__);
2082
return $self->parseCallbackRestOrInterface({});
2084
if ($next->value() eq "interface") {
2085
return $self->parseInterfaceOld();
2087
$self->assertUnexpectedToken($next->value(), __LINE__);
2090
sub parseInterfaceOld
2093
my $next = $self->nextToken();
2094
if ($next->value() eq "interface") {
2095
my $interface = domInterface->new();
2096
$self->assertTokenValue($self->getToken(), "interface", __LINE__);
2097
my $extendedAttributeList = $self->parseExtendedAttributeListAllowEmpty();
2098
my $token = $self->getToken();
2099
$self->assertTokenType($token, IdentifierToken);
2100
$interface->name($token->value());
2101
$interface->isException(0);
2102
push(@{$interface->parents}, @{$self->parseInheritance()});
2103
$self->assertTokenValue($self->getToken(), "{", __LINE__);
2104
my $interfaceMembers = $self->parseInterfaceMembers();
2105
$self->assertTokenValue($self->getToken(), "}", __LINE__);
2106
$self->assertTokenValue($self->getToken(), ";", __LINE__);
2107
applyMemberList($interface, $interfaceMembers);
2108
applyExtendedAttributeList($interface, $extendedAttributeList);
2111
$self->assertUnexpectedToken($next->value(), __LINE__);
2114
sub parseInterfaceMemberOld
2117
my $next = $self->nextToken();
2118
if ($next->value() eq "const") {
2119
return $self->parseConst({});
2121
if ($next->type() == IdentifierToken || $next->value() =~ /$nextInterfaceMemberOld_1/) {
2122
return $self->parseAttributeOrOperationOrIteratorOld();
2124
$self->assertUnexpectedToken($next->value(), __LINE__);
2127
sub parseDictionaryOld
2130
my $next = $self->nextToken();
2131
if ($next->value() eq "dictionary") {
2132
$self->assertTokenValue($self->getToken(), "dictionary", __LINE__);
2133
$self->parseExtendedAttributeListAllowEmpty();
2134
$self->assertTokenType($self->getToken(), IdentifierToken);
2135
$self->parseInheritance();
2136
$self->assertTokenValue($self->getToken(), "{", __LINE__);
2137
$self->parseDictionaryMembers();
2138
$self->assertTokenValue($self->getToken(), "}", __LINE__);
2139
$self->assertTokenValue($self->getToken(), ";", __LINE__);
2142
$self->assertUnexpectedToken($next->value(), __LINE__);
2145
sub parseDictionaryMemberOld
2148
my $next = $self->nextToken();
2149
if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) {
2151
$self->parseExtendedAttributeListAllowEmpty();
2152
$self->assertTokenType($self->getToken(), IdentifierToken);
2153
$self->parseDefault();
2154
$self->assertTokenValue($self->getToken(), ";", __LINE__);
2157
$self->assertUnexpectedToken($next->value(), __LINE__);
2160
sub parseExceptionOld
2163
my $next = $self->nextToken();
2164
if ($next->value() eq "exception") {
2165
my $interface = domInterface->new();
2166
$self->assertTokenValue($self->getToken(), "exception", __LINE__);
2167
my $extendedAttributeList = $self->parseExtendedAttributeListAllowEmpty();
2168
my $token = $self->getToken();
2169
$self->assertTokenType($token, IdentifierToken);
2170
$interface->name($token->value());
2171
$interface->isException(1);
2172
push(@{$interface->parents}, @{$self->parseInheritance()});
2173
$self->assertTokenValue($self->getToken(), "{", __LINE__);
2174
my $exceptionMembers = $self->parseInterfaceMembers();
2175
#$self->parseExceptionMembers();
2176
$self->assertTokenValue($self->getToken(), "}", __LINE__);
2177
$self->assertTokenValue($self->getToken(), ";", __LINE__);
2178
applyMemberList($interface, $exceptionMembers);
2179
applyExtendedAttributeList($interface, $extendedAttributeList);
2182
$self->assertUnexpectedToken($next->value(), __LINE__);
2188
my $next = $self->nextToken();
2189
if ($next->value() eq "enum") {
2190
$self->assertTokenValue($self->getToken(), "enum", __LINE__);
2191
$self->parseExtendedAttributeListAllowEmpty();
2192
$self->assertTokenType($self->getToken(), IdentifierToken);
2193
$self->assertTokenValue($self->getToken(), "{", __LINE__);
2194
$self->parseEnumValueList();
2195
$self->assertTokenValue($self->getToken(), "}", __LINE__);
2196
$self->assertTokenValue($self->getToken(), ";", __LINE__);
2199
$self->assertUnexpectedToken($next->value(), __LINE__);
2202
sub parseAttributeOrOperationOrIteratorOld
2205
my $next = $self->nextToken();
2206
if ($next->value() eq "serializer") {
2207
return $self->parseSerializer({});
2209
if ($next->value() =~ /$nextAttributeOrOperationOrIterator_1/) {
2210
my $qualifier = $self->parseQualifier();
2211
my $interface = $self->parseAttributeOrOperationRestOld();
2212
if (defined ($interface) && $qualifier eq "static") {
2213
$interface->isStatic(1);
2217
if ($next->value() =~ /$nextAttributeOld_1/) {
2218
return $self->parseAttributeOld();
2220
if ($next->type() == IdentifierToken || $next->value() =~ /$nextAttributeOrOperationOrIterator_2/) {
2221
return $self->parseOperationOrIterator({});
2223
$self->assertUnexpectedToken($next->value(), __LINE__);
2226
sub parseAttributeOrOperationRestOld
2229
my $next = $self->nextToken();
2230
if ($next->value() =~ /$nextAttributeRest_1/) {
2231
return $self->parseAttributeRestOld();
2233
if ($next->value() eq ";") {
2234
$self->assertTokenValue($self->getToken(), ";", __LINE__);
2237
if ($next->type() == IdentifierToken || $next->value() =~ /$nextAttributeOrOperationRest_1/) {
2238
my $returnType = $self->parseReturnType();
2239
my $interface = $self->parseOperationRest({});
2240
if (defined ($interface)) {
2241
$interface->signature->type($returnType);
2245
$self->assertUnexpectedToken($next->value(), __LINE__);
2248
sub parseAttributeOld
2251
my $next = $self->nextToken();
2252
if ($next->value() =~ /$nextAttributeOld_1/) {
2253
$self->parseInherit();
2254
return $self->parseAttributeRestOld();
2256
$self->assertUnexpectedToken($next->value(), __LINE__);
2259
sub parseAttributeRestOld
2262
my $next = $self->nextToken();
2263
if ($next->value() =~ /$nextAttributeRest_1/) {
2264
my $newDataNode = domAttribute->new();
2265
if ($self->parseReadOnly()) {
2266
$newDataNode->type("readonly attribute");
2268
$newDataNode->type("attribute");
2270
$self->assertTokenValue($self->getToken(), "attribute", __LINE__);
2271
my $extendedAttributeList = $self->parseExtendedAttributeListAllowEmpty();
2272
$newDataNode->signature(domSignature->new());
2273
$newDataNode->signature->type($self->parseType());
2274
$newDataNode->signature->extendedAttributes($extendedAttributeList);
2275
my $token = $self->getToken();
2276
$self->assertTokenType($token, IdentifierToken);
2277
$newDataNode->signature->name($token->value());
2278
my $getRef = $self->parseGet();
2279
if (defined $getRef) {
2280
push(@{$newDataNode->getterExceptions}, @{$getRef->{"getraises"}});
2281
push(@{$newDataNode->setterExceptions}, @{$getRef->{"setraises"}});
2283
$self->assertTokenValue($self->getToken(), ";", __LINE__);
2284
return $newDataNode;
2286
$self->assertUnexpectedToken($next->value(), __LINE__);
2292
my $next = $self->nextToken();
2293
if ($next->value() eq "in") {
2294
$self->assertTokenValue($self->getToken(), "in", __LINE__);
2300
sub parseOptionalSemicolon
2303
my $next = $self->nextToken();
2304
if ($next->value() eq ";") {
2305
$self->assertTokenValue($self->getToken(), ";", __LINE__);
2312
my $next = $self->nextToken();
2313
if ($next->value() eq "::") {
2314
return $self->parseAbsoluteScopedName();
2316
if ($next->type() == IdentifierToken) {
2317
return $self->parseRelativeScopedName();
2319
$self->assertUnexpectedToken($next->value());
2322
sub parseAbsoluteScopedName
2325
my $next = $self->nextToken();
2326
if ($next->value() eq "::") {
2327
$self->assertTokenValue($self->getToken(), "::");
2328
my $token = $self->getToken();
2329
$self->assertTokenType($token, IdentifierToken);
2330
return "::" . $token->value() . $self->parseScopedNameParts();
2332
$self->assertUnexpectedToken($next->value());
2335
sub parseRelativeScopedName
2338
my $next = $self->nextToken();
2339
if ($next->type() == IdentifierToken) {
2340
my $token = $self->getToken();
2341
return $token->value() . $self->parseScopedNameParts();
2343
$self->assertUnexpectedToken($next->value());
2346
sub parseScopedNameParts
2352
my $next = $self->nextToken();
2353
if ($next->value() eq "::") {
2354
$self->assertTokenValue($self->getToken(), "::");
2356
my $token = $self->getToken();
2357
$self->assertTokenType($token, IdentifierToken);
2358
push(@names, $token->value());
2363
return join("", @names);
2366
sub parseScopedNameList
2369
my $next = $self->nextToken();
2370
if ($next->type() == IdentifierToken || $next->value() eq "::") {
2372
push(@names, $self->parseScopedName());
2373
push(@names, @{$self->parseScopedNames()});
2376
$self->assertUnexpectedToken($next->value(), __LINE__);
2379
sub parseScopedNames
2385
my $next = $self->nextToken();
2386
if ($next->value() eq ",") {
2387
$self->assertTokenValue($self->getToken(), ",");
2388
push(@names, $self->parseScopedName());
2398
my $interface = shift;
2399
my $members = shift;
2401
for my $item (@{$members}) {
2402
if (ref($item) eq "domAttribute") {
2403
push(@{$interface->attributes}, $item);
2406
if (ref($item) eq "domConstant") {
2407
push(@{$interface->constants}, $item);
2410
if (ref($item) eq "domFunction") {
2411
push(@{$interface->functions}, $item);
2417
sub applyExtendedAttributeList
2419
my $interface = shift;
2420
my $extendedAttributeList = shift;
2422
if (defined $extendedAttributeList->{"Constructors"}) {
2423
my @constructorParams = @{$extendedAttributeList->{"Constructors"}};
2424
my $index = (@constructorParams == 1) ? 0 : 1;
2425
foreach my $param (@constructorParams) {
2426
my $constructor = domFunction->new();
2427
$constructor->signature(domSignature->new());
2428
$constructor->signature->name("Constructor");
2429
$constructor->signature->extendedAttributes($extendedAttributeList);
2430
$constructor->parameters($param);
2431
$constructor->{overloadedIndex} = $index++;
2432
push(@{$interface->constructors}, $constructor);
2434
delete $extendedAttributeList->{"Constructors"};
2435
$extendedAttributeList->{"Constructor"} = "VALUE_IS_MISSING";
2436
} elsif (defined $extendedAttributeList->{"NamedConstructor"}) {
2437
my $newDataNode = domFunction->new();
2438
$newDataNode->signature(domSignature->new());
2439
$newDataNode->signature->name("NamedConstructor");
2440
$newDataNode->signature->extendedAttributes($extendedAttributeList);
2441
my %attributes = %{$extendedAttributeList->{"NamedConstructor"}};
2442
my @attributeKeys = keys (%attributes);
2443
my $constructorName = $attributeKeys[0];
2444
push(@{$newDataNode->parameters}, @{$attributes{$constructorName}});
2445
$extendedAttributeList->{"NamedConstructor"} = $constructorName;
2446
push(@{$interface->constructors}, $newDataNode);
2448
$interface->extendedAttributes($extendedAttributeList);