| Index: Source/bindings/scripts/deprecated_idl_parser.pm | 
| diff --git a/Source/bindings/scripts/deprecated_idl_parser.pm b/Source/bindings/scripts/deprecated_idl_parser.pm | 
| deleted file mode 100644 | 
| index 2affe5e3dbb33b5ce43785ce26ac04113559bbd2..0000000000000000000000000000000000000000 | 
| --- a/Source/bindings/scripts/deprecated_idl_parser.pm | 
| +++ /dev/null | 
| @@ -1,2249 +0,0 @@ | 
| -# | 
| -# KDOM IDL parser | 
| -# | 
| -# Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org> | 
| -# | 
| -# This library is free software; you can redistribute it and/or | 
| -# modify it under the terms of the GNU Library General Public | 
| -# License as published by the Free Software Foundation; either | 
| -# version 2 of the License, or (at your option) any later version. | 
| -# | 
| -# This library is distributed in the hope that it will be useful, | 
| -# but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
| -# Library General Public License for more details. | 
| -# | 
| -# You should have received a copy of the GNU Library General Public License | 
| -# along with this library; see the file COPYING.LIB.  If not, write to | 
| -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 
| -# Boston, MA 02110-1301, USA. | 
| -# | 
| - | 
| -package deprecated_idl_parser; | 
| - | 
| -use strict; | 
| - | 
| -use preprocessor; | 
| -use Class::Struct; | 
| - | 
| -use constant StringToken => 0; | 
| -use constant IntegerToken => 1; | 
| -use constant FloatToken => 2; | 
| -use constant IdentifierToken => 3; | 
| -use constant OtherToken => 4; | 
| -use constant EmptyToken => 5; | 
| - | 
| -# Used to represent a parsed IDL document | 
| -struct( idlDocument => { | 
| -    fileName => '$', # file name | 
| -    callbackFunctions => '@', | 
| -    enumerations => '@', # All parsed enumerations | 
| -    interfaces => '@', # All parsed interfaces | 
| -}); | 
| - | 
| -struct( callbackFunction => { | 
| -    name => '$', | 
| -    type => '$', | 
| -    parameters => '@', | 
| -}); | 
| - | 
| -# Used to represent 'interface' blocks | 
| -struct( domInterface => { | 
| -    name => '$',      # Class identifier | 
| -    parent => '$',      # Parent class identifier | 
| -    constants => '@',    # List of 'domConstant' | 
| -    functions => '@',    # List of 'domFunction' | 
| -    attributes => '@',    # List of 'domAttribute' | 
| -    extendedAttributes => '$', # Extended attributes | 
| -    constructors => '@', # Constructors, list of 'domFunction' | 
| -    customConstructors => '@', # Custom constructors, list of 'domFunction' | 
| -    isException => '$', # Used for exception interfaces | 
| -    isCallback => '$', # Used for callback interfaces | 
| -    isPartial => '$', # Used for partial interfaces | 
| -}); | 
| - | 
| -# Used to represent domInterface contents | 
| -struct( domFunction => { | 
| -    isStatic => '$', | 
| -    name => '$', | 
| -    type => '$', | 
| -    extendedAttributes => '$', # Extended attributes | 
| -    specials => '@',  # Specials | 
| -    parameters => '@',    # List of 'domParameter' | 
| -    overloadedIndex => '$', | 
| -}); | 
| - | 
| -# Used to represent domInterface contents | 
| -struct( domAttribute => { | 
| -    type => '$',              # Attribute type (including namespace) (string or UnionType) | 
| -    name => '$', | 
| -    isNullable => '$', # Is variable type Nullable (T?) | 
| -    isStatic => '$', | 
| -    isReadOnly => '$', | 
| -    getterExceptions => '@',  # Possibly raised exceptions. | 
| -    setterExceptions => '@',  # Possibly raised exceptions. | 
| -    extendedAttributes => '$', # Extended attributes | 
| -}); | 
| - | 
| -# Used to represent a map of 'variable name' <-> 'variable type' | 
| -struct( domParameter => { | 
| -    name => '$',      # Variable name | 
| -    type => '$',      # Variable type (string or UnionType) | 
| -    extendedAttributes => '$', # Extended attributes | 
| -    isOptional => '$', # Is variable optional (optional T) | 
| -    isNullable => '$', # Is variable type Nullable (T?) | 
| -    isVariadic => '$' # Is variable variadic (long... numbers) | 
| -}); | 
| - | 
| -# Used to represent string constants | 
| -struct( domConstant => { | 
| -    name => '$',      # DOM Constant identifier | 
| -    type => '$',      # Type of data | 
| -    value => '$',      # Constant value | 
| -    extendedAttributes => '$', # Extended attributes | 
| -}); | 
| - | 
| -# Used to represent 'enum' definitions | 
| -struct( domEnum => { | 
| -    name => '$', # Enumeration identifier | 
| -    values => '@', # Enumeration values (list of unique strings) | 
| -}); | 
| - | 
| -struct( Token => { | 
| -    type => '$', # type of token | 
| -    value => '$' # value of token | 
| -}); | 
| - | 
| -struct( Typedef => { | 
| -    extendedAttributes => '$', # Extended attributes | 
| -    type => '$', # Type of data | 
| -}); | 
| - | 
| -struct( UnionType => { | 
| -    unionMemberTypes => '@', # (UnionType or string)[] | 
| -}); | 
| - | 
| -# Maps 'typedef name' -> Typedef | 
| -my %typedefs = (); | 
| - | 
| -sub new { | 
| -    my $class = shift; | 
| - | 
| -    my $emptyToken = Token->new(); | 
| -    $emptyToken->type(EmptyToken); | 
| -    $emptyToken->value("empty"); | 
| - | 
| -    my $self = { | 
| -        DocumentContent => "", | 
| -        EmptyToken => $emptyToken, | 
| -        NextToken => $emptyToken, | 
| -        Token => $emptyToken, | 
| -        Line => "", | 
| -        LineNumber => 1 | 
| -    }; | 
| -    return bless $self, $class; | 
| -} | 
| - | 
| -sub assertTokenValue | 
| -{ | 
| -    my $self = shift; | 
| -    my $token = shift; | 
| -    my $value = shift; | 
| -    my $line = shift; | 
| -    my $msg = "Next token should be " . $value . ", but " . $token->value() . " at " . $self->{Line}; | 
| -    if (defined ($line)) { | 
| -        $msg .= " deprecated_idl_parser.pm:" . $line; | 
| -    } | 
| -    die $msg unless $token->value() eq $value; | 
| -} | 
| - | 
| -sub assertTokenType | 
| -{ | 
| -    my $self = shift; | 
| -    my $token = shift; | 
| -    my $type = shift; | 
| -    die "Next token's type should be " . $type . ", but " . $token->type() . " at " . $self->{Line} unless $token->type() eq $type; | 
| -} | 
| - | 
| -sub assertUnexpectedToken | 
| -{ | 
| -    my $self = shift; | 
| -    my $token = shift; | 
| -    my $line = shift; | 
| -    my $msg = "Unexpected token " . $token . " at " . $self->{Line}; | 
| -    if (defined ($line)) { | 
| -        $msg .= " deprecated_idl_parser.pm:" . $line; | 
| -    } | 
| -    die $msg; | 
| -} | 
| - | 
| -sub assertNoExtendedAttributesInTypedef | 
| -{ | 
| -    my $self = shift; | 
| -    my $name = shift; | 
| -    my $line = shift; | 
| -    my $typedef = $typedefs{$name}; | 
| -    my $msg = "Unexpected extendedAttributeList in typedef \"$name\" at " . $self->{Line}; | 
| -    if (defined ($line)) { | 
| -        $msg .= " deprecated_idl_parser.pm:" . $line; | 
| -    } | 
| -    die $msg if %{$typedef->extendedAttributes}; | 
| -} | 
| - | 
| -sub Parse | 
| -{ | 
| -    my $self = shift; | 
| -    my $fileName = shift; | 
| -    my $preprocessor = shift; | 
| -    my $defines = ""; | 
| - | 
| -    my @definitions = (); | 
| - | 
| -    my @lines = applyPreprocessor($fileName, $defines, $preprocessor); | 
| -    $self->{Line} = $lines[0]; | 
| -    $self->{DocumentContent} = join(' ', @lines); | 
| - | 
| -    $self->getToken(); | 
| -    eval { | 
| -        my $result = $self->parseDefinitions(); | 
| -        push(@definitions, @{$result}); | 
| - | 
| -        my $next = $self->nextToken(); | 
| -        $self->assertTokenType($next, EmptyToken); | 
| -    }; | 
| -    die $@ . " in $fileName" if $@; | 
| - | 
| -    my $document = idlDocument->new(); | 
| -    $document->fileName($fileName); | 
| -    foreach my $definition (@definitions) { | 
| -        if (ref($definition) eq "domInterface") { | 
| -            push(@{$document->interfaces}, $definition); | 
| -        } elsif (ref($definition) eq "domEnum") { | 
| -            push(@{$document->enumerations}, $definition); | 
| -        } elsif (ref($definition) eq "callbackFunction") { | 
| -            push(@{$document->callbackFunctions}, $definition); | 
| -        } else { | 
| -            die "Unrecognized IDL definition kind: \"" . ref($definition) . "\""; | 
| -        } | 
| -    } | 
| -    # Sort so output independent of order in IDL file (e.g., for JSON output) | 
| -    @{$document->callbackFunctions} = sort {$a->name cmp $b->name} @{$document->callbackFunctions}; | 
| -    @{$document->enumerations} = sort {$a->name cmp $b->name} @{$document->enumerations}; | 
| -    @{$document->interfaces} = sort {$a->name cmp $b->name} @{$document->interfaces}; | 
| -    return $document; | 
| -} | 
| - | 
| -sub nextToken | 
| -{ | 
| -    my $self = shift; | 
| -    return $self->{NextToken}; | 
| -} | 
| - | 
| -sub getToken | 
| -{ | 
| -    my $self = shift; | 
| -    $self->{Token} = $self->{NextToken}; | 
| -    $self->{NextToken} = $self->getTokenInternal(); | 
| -    return $self->{Token}; | 
| -} | 
| - | 
| -my $whitespaceTokenPattern = '^[\t\n\r ]*[\n\r]'; | 
| -my $floatTokenPattern = '^(-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+))'; | 
| -my $integerTokenPattern = '^(-?[1-9][0-9]*|-?0[Xx][0-9A-Fa-f]+|-?0[0-7]*)'; | 
| -my $stringTokenPattern = '^(\"[^\"]*\")'; | 
| -my $identifierTokenPattern = '^([A-Z_a-z][0-9A-Z_a-z]*)'; | 
| -my $otherTokenPattern = '^(::|\.\.\.|[^\t\n\r 0-9A-Z_a-z])'; | 
| - | 
| -sub getTokenInternal | 
| -{ | 
| -    my $self = shift; | 
| - | 
| -    if ($self->{DocumentContent} =~ /$whitespaceTokenPattern/) { | 
| -        $self->{DocumentContent} =~ s/($whitespaceTokenPattern)//; | 
| -        my $skipped = $1; | 
| -        $self->{LineNumber}++ while ($skipped =~ /\n/g); | 
| -        if ($self->{DocumentContent} =~ /^([^\n\r]+)/) { | 
| -            $self->{Line} = $self->{LineNumber} . ":" . $1; | 
| -        } else { | 
| -            $self->{Line} = "Unknown"; | 
| -        } | 
| -    } | 
| -    $self->{DocumentContent} =~ s/^([\t\n\r ]+)//; | 
| -    if ($self->{DocumentContent} eq "") { | 
| -        return $self->{EmptyToken}; | 
| -    } | 
| - | 
| -    my $token = Token->new(); | 
| -    if ($self->{DocumentContent} =~ /$floatTokenPattern/) { | 
| -        $token->type(FloatToken); | 
| -        $token->value($1); | 
| -        $self->{DocumentContent} =~ s/$floatTokenPattern//; | 
| -        return $token; | 
| -    } | 
| -    if ($self->{DocumentContent} =~ /$integerTokenPattern/) { | 
| -        $token->type(IntegerToken); | 
| -        $token->value($1); | 
| -        $self->{DocumentContent} =~ s/$integerTokenPattern//; | 
| -        return $token; | 
| -    } | 
| -    if ($self->{DocumentContent} =~ /$stringTokenPattern/) { | 
| -        $token->type(StringToken); | 
| -        $token->value($1); | 
| -        $self->{DocumentContent} =~ s/$stringTokenPattern//; | 
| -        return $token; | 
| -    } | 
| -    if ($self->{DocumentContent} =~ /$identifierTokenPattern/) { | 
| -        $token->type(IdentifierToken); | 
| -        (my $value = $1) =~ s/^_//;  # strip leading underscore, used to strope reserved words | 
| -        $token->value($value); | 
| -        $self->{DocumentContent} =~ s/$identifierTokenPattern//; | 
| -        return $token; | 
| -    } | 
| -    if ($self->{DocumentContent} =~ /$otherTokenPattern/) { | 
| -        $token->type(OtherToken); | 
| -        $token->value($1); | 
| -        $self->{DocumentContent} =~ s/$otherTokenPattern//; | 
| -        return $token; | 
| -    } | 
| -    die "Failed in tokenizing at " . $self->{Line}; | 
| -} | 
| - | 
| -sub unquoteString | 
| -{ | 
| -    my $self = shift; | 
| -    my $quotedString = shift; | 
| -    if ($quotedString =~ /^"([^"]*)"$/) { | 
| -        return $1; | 
| -    } | 
| -    die "Failed to parse string (" . $quotedString . ") at " . $self->{Line}; | 
| -} | 
| - | 
| -sub typeHasNullableSuffix | 
| -{ | 
| -    my $type = shift; | 
| -    return $type =~ /\?$/; | 
| -} | 
| - | 
| -sub typeRemoveNullableSuffix | 
| -{ | 
| -    my $type = shift; | 
| -    $type =~ s/\?$//g; | 
| -    return $type; | 
| -} | 
| - | 
| -# Promise is not yet in the Web IDL spec but is going to be speced | 
| -# as primitive types in the future. | 
| -my $nextAttribute_1 = '^(attribute|inherit|readonly)$'; | 
| -my $nextPrimitiveType_1 = '^(int|long|short|unsigned)$'; | 
| -my $nextPrimitiveType_2 = '^(double|float|unrestricted)$'; | 
| -my $nextArgumentList_1 = '^(\(|::|ByteString|DOMString|Promise|Date|\[|any|boolean|byte|double|float|in|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$'; | 
| -my $nextNonAnyType_1 = '^(boolean|byte|double|float|int|long|octet|short|unrestricted|unsigned)$'; | 
| -my $nextInterfaceMember_1 = '^(\(|::|ByteString|DOMString|Promise|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)$'; | 
| -my $nextOptionalIteratorInterfaceOrObject_1 = '^(;|=)$'; | 
| -my $nextAttributeOrOperationOrIterator_1 = '^(static|stringifier)$'; | 
| -my $nextAttributeOrOperationOrIterator_2 = '^(\(|::|ByteString|DOMString|Promise|Date|any|boolean|byte|creator|deleter|double|float|getter|int|legacycaller|long|object|octet|sequence|setter|short|unrestricted|unsigned|void)$'; | 
| -my $nextUnrestrictedFloatType_1 = '^(double|float)$'; | 
| -my $nextExtendedAttributeRest3_1 = '^(\,|::|\])$'; | 
| -my $nextExceptionField_1 = '^(\(|::|ByteString|DOMString|Promise|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$'; | 
| -my $nextType_1 = '^(::|ByteString|DOMString|Promise|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$'; | 
| -my $nextSpecials_1 = '^(creator|deleter|getter|legacycaller|setter)$'; | 
| -my $nextDefinitions_1 = '^(::|callback|dictionary|enum|exception|interface|partial|typedef)$'; | 
| -my $nextExceptionMembers_1 = '^(\(|::|ByteString|DOMString|Promise|Date|\[|any|boolean|byte|const|double|float|int|long|object|octet|optional|sequence|short|unrestricted|unsigned)$'; | 
| -my $nextAttributeRest_1 = '^(attribute|readonly)$'; | 
| -my $nextInterfaceMembers_1 = '^(\(|::|ByteString|DOMString|Promise|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)$'; | 
| -my $nextSingleType_1 = '^(::|ByteString|DOMString|Promise|Date|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned)$'; | 
| -my $nextArgumentName_1 = '^(attribute|callback|const|creator|deleter|dictionary|enum|exception|getter|implements|inherit|interface|legacycaller|partial|serializer|setter|static|stringifier|typedef|unrestricted)$'; | 
| -my $nextConstValue_1 = '^(false|true)$'; | 
| -my $nextConstValue_2 = '^(-|Infinity|NaN)$'; | 
| -my $nextDefinition_1 = '^(callback|interface)$'; | 
| -my $nextAttributeOrOperationRest_1 = '^(\(|::|ByteString|DOMString|Promise|Date|any|boolean|byte|double|float|int|long|object|octet|sequence|short|unrestricted|unsigned|void)$'; | 
| -my $nextUnsignedIntegerType_1 = '^(int|long|short)$'; | 
| -my $nextDefaultValue_1 = '^(-|Infinity|NaN|false|null|true)$'; | 
| - | 
| - | 
| -sub parseDefinitions | 
| -{ | 
| -    my $self = shift; | 
| -    my @definitions = (); | 
| - | 
| -    while (1) { | 
| -        my $extendedAttributeList = $self->parseExtendedAttributeListAllowEmpty(); | 
| -        my $next = $self->nextToken(); | 
| -        my $definition; | 
| -        if ($next->type() == IdentifierToken || $next->value() =~ /$nextDefinitions_1/) { | 
| -            $definition = $self->parseDefinition($extendedAttributeList); | 
| -        } else { | 
| -            last; | 
| -        } | 
| -        if (defined ($definition)) { | 
| -            push(@definitions, $definition); | 
| -        } | 
| -    } | 
| -    $self->applyTypedefs(\@definitions); | 
| -    return \@definitions; | 
| -} | 
| - | 
| -sub applyTypedefs | 
| -{ | 
| -    my $self = shift; | 
| -    my $definitions = shift; | 
| - | 
| -    if (!%typedefs) { | 
| -        return; | 
| -    } | 
| -    foreach my $definition (@$definitions) { | 
| -        if (ref($definition) eq "domInterface") { | 
| -            foreach my $constant (@{$definition->constants}) { | 
| -                if (exists $typedefs{$constant->type}) { | 
| -                    my $typedef = $typedefs{$constant->type}; | 
| -                    $self->assertNoExtendedAttributesInTypedef($constant->type, __LINE__); | 
| -                    $constant->type($typedef->type); | 
| -                } | 
| -            } | 
| -            foreach my $attribute (@{$definition->attributes}) { | 
| -                $self->applyTypedefsForTypedObject($attribute); | 
| -            } | 
| -            foreach my $function (@{$definition->functions}, @{$definition->constructors}, @{$definition->customConstructors}) { | 
| -                $self->applyTypedefsForTypedObject($function); | 
| -                foreach my $parameter (@{$function->parameters}) { | 
| -                    $self->applyTypedefsForTypedObject($parameter); | 
| -                } | 
| -            } | 
| -        } | 
| -    } | 
| -} | 
| - | 
| -sub applyTypedefsForTypedObject | 
| -{ | 
| -    my $self = shift; | 
| -    my $typedObject = shift; | 
| - | 
| -    if (!defined ($typedObject->type)) { | 
| -        return; | 
| -    } | 
| - | 
| -    my $type = $typedObject->type; | 
| -    $type =~ s/[\?\[\]]+$//g; | 
| -    my $typeSuffix = $typedObject->type; | 
| -    $typeSuffix =~ s/^[^\?\[\]]+//g; | 
| -    if (exists $typedefs{$type}) { | 
| -        my $typedef = $typedefs{$type}; | 
| -        $typedObject->type($typedef->type . $typeSuffix); | 
| -        copyExtendedAttributes($typedObject->extendedAttributes, $typedef->extendedAttributes); | 
| -    } | 
| - | 
| -    # Handle union types, sequences and etc. | 
| -    foreach my $name (%typedefs) { | 
| -        if (!exists $typedefs{$name}) { | 
| -            next; | 
| -        } | 
| -        my $typedef = $typedefs{$name}; | 
| -        my $regex = '\\b' . $name . '\\b'; | 
| -        my $replacement = $typedef->type; | 
| -        my $type = $typedObject->type; | 
| -        $type =~ s/($regex)/$replacement/g; | 
| -        $typedObject->type($type); | 
| -    } | 
| -} | 
| - | 
| -sub parseDefinition | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextDefinition_1/) { | 
| -        return $self->parseCallbackOrInterface($extendedAttributeList); | 
| -    } | 
| -    if ($next->value() eq "partial") { | 
| -        return $self->parsePartial($extendedAttributeList); | 
| -    } | 
| -    if ($next->value() eq "dictionary") { | 
| -        return $self->parseDictionary($extendedAttributeList); | 
| -    } | 
| -    if ($next->value() eq "exception") { | 
| -        return $self->parseException($extendedAttributeList); | 
| -    } | 
| -    if ($next->value() eq "enum") { | 
| -        return $self->parseEnum($extendedAttributeList); | 
| -    } | 
| -    if ($next->value() eq "typedef") { | 
| -        return $self->parseTypedef($extendedAttributeList); | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() eq "::") { | 
| -        return $self->parseImplementsStatement($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseCallbackOrInterface | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "callback") { | 
| -        $self->assertTokenValue($self->getToken(), "callback", __LINE__); | 
| -        return $self->parseCallbackRestOrInterface($extendedAttributeList); | 
| -    } | 
| -    if ($next->value() eq "interface") { | 
| -        return $self->parseInterface($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseCallbackRestOrInterface | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "interface") { | 
| -        my $interface = $self->parseInterface($extendedAttributeList); | 
| -        $interface->isCallback(1); | 
| -        return $interface; | 
| -    } | 
| -    if ($next->type() == IdentifierToken) { | 
| -        return $self->parseCallbackRest($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseInterface | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "interface") { | 
| -        my $interface = domInterface->new(); | 
| -        $self->assertTokenValue($self->getToken(), "interface", __LINE__); | 
| -        my $interfaceNameToken = $self->getToken(); | 
| -        $self->assertTokenType($interfaceNameToken, IdentifierToken); | 
| -        $interface->name($interfaceNameToken->value()); | 
| -        $interface->parent($self->parseInheritance()); | 
| -        $self->assertTokenValue($self->getToken(), "{", __LINE__); | 
| -        my $interfaceMembers = $self->parseInterfaceMembers(); | 
| -        $self->assertTokenValue($self->getToken(), "}", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        applyMemberList($interface, $interfaceMembers); | 
| -        applyExtendedAttributeList($interface, $extendedAttributeList); | 
| -        return $interface; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parsePartial | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "partial") { | 
| -        $self->assertTokenValue($self->getToken(), "partial", __LINE__); | 
| -        return $self->parsePartialDefinition($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parsePartialDefinition | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "interface") { | 
| -        my $interface = $self->parseInterface($extendedAttributeList); | 
| -        $interface->isPartial(1); | 
| -        return $interface; | 
| -    } | 
| -    if ($next->value() eq "dictionary") { | 
| -        return $self->parsePartialDictionary($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parsePartialInterface | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "interface") { | 
| -        $self->assertTokenValue($self->getToken(), "interface", __LINE__); | 
| -        $self->assertTokenType($self->getToken(), IdentifierToken); | 
| -        $self->assertTokenValue($self->getToken(), "{", __LINE__); | 
| -        $self->parseInterfaceMembers(); | 
| -        $self->assertTokenValue($self->getToken(), "}", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        return; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseInterfaceMembers | 
| -{ | 
| -    my $self = shift; | 
| -    my @interfaceMembers = (); | 
| - | 
| -    while (1) { | 
| -        my $extendedAttributeList = $self->parseExtendedAttributeListAllowEmpty(); | 
| -        my $next = $self->nextToken(); | 
| -        my $interfaceMember; | 
| -        if ($next->type() == IdentifierToken || $next->value() =~ /$nextInterfaceMembers_1/) { | 
| -            $interfaceMember = $self->parseInterfaceMember($extendedAttributeList); | 
| -        } else { | 
| -            last; | 
| -        } | 
| -        if (defined $interfaceMember) { | 
| -            push(@interfaceMembers, $interfaceMember); | 
| -        } | 
| -    } | 
| -    return \@interfaceMembers; | 
| -} | 
| - | 
| -sub parseInterfaceMember | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "const") { | 
| -        return $self->parseConst($extendedAttributeList); | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextInterfaceMember_1/) { | 
| -        return $self->parseAttributeOrOperationOrIterator($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseDictionary | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "dictionary") { | 
| -        $self->assertTokenValue($self->getToken(), "dictionary", __LINE__); | 
| -        $self->assertTokenType($self->getToken(), IdentifierToken); | 
| -        $self->parseInheritance(); | 
| -        $self->assertTokenValue($self->getToken(), "{", __LINE__); | 
| -        $self->parseDictionaryMembers(); | 
| -        $self->assertTokenValue($self->getToken(), "}", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        return; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseDictionaryMembers | 
| -{ | 
| -    my $self = shift; | 
| - | 
| -    while (1) { | 
| -        my $extendedAttributeList = $self->parseExtendedAttributeListAllowEmpty(); | 
| -        my $next = $self->nextToken(); | 
| -        if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) { | 
| -            $self->parseDictionaryMember($extendedAttributeList); | 
| -        } else { | 
| -            last; | 
| -        } | 
| -    } | 
| -} | 
| - | 
| -sub parseDictionaryMember | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) { | 
| -        $self->parseType(); | 
| -        $self->assertTokenType($self->getToken(), IdentifierToken); | 
| -        $self->parseDefault(); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        return; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parsePartialDictionary | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "dictionary") { | 
| -        $self->assertTokenValue($self->getToken(), "dictionary", __LINE__); | 
| -        $self->assertTokenType($self->getToken(), IdentifierToken); | 
| -        $self->assertTokenValue($self->getToken(), "{", __LINE__); | 
| -        $self->parseDictionaryMembers(); | 
| -        $self->assertTokenValue($self->getToken(), "}", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        return; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseDefault | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "=") { | 
| -        $self->assertTokenValue($self->getToken(), "=", __LINE__); | 
| -        return $self->parseDefaultValue(); | 
| -    } | 
| -} | 
| - | 
| -sub parseDefaultValue | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == FloatToken || $next->type() == IntegerToken || $next->value() =~ /$nextDefaultValue_1/) { | 
| -        return $self->parseConstValue(); | 
| -    } | 
| -    if ($next->type() == StringToken) { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseException | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "exception") { | 
| -        my $interface = domInterface->new(); | 
| -        $self->assertTokenValue($self->getToken(), "exception", __LINE__); | 
| -        my $exceptionNameToken = $self->getToken(); | 
| -        $self->assertTokenType($exceptionNameToken, IdentifierToken); | 
| -        $interface->name($exceptionNameToken->value()); | 
| -        $interface->isException(1); | 
| -        $interface->parent($self->parseInheritance()); | 
| -        $self->assertTokenValue($self->getToken(), "{", __LINE__); | 
| -        my $exceptionMembers = $self->parseExceptionMembers(); | 
| -        $self->assertTokenValue($self->getToken(), "}", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        applyMemberList($interface, $exceptionMembers); | 
| -        applyExtendedAttributeList($interface, $extendedAttributeList); | 
| -        return $interface; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseExceptionMembers | 
| -{ | 
| -    my $self = shift; | 
| -    my @members = (); | 
| - | 
| -    while (1) { | 
| -        my $next = $self->nextToken(); | 
| -        if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionMembers_1/) { | 
| -            my $extendedAttributeList = $self->parseExtendedAttributeListAllowEmpty(); | 
| -            #my $member = $self->parseExceptionMember($extendedAttributeList); | 
| -            my $member = $self->parseInterfaceMember($extendedAttributeList); | 
| -            if (defined ($member)) { | 
| -                push(@members, $member); | 
| -            } | 
| -        } else { | 
| -            last; | 
| -        } | 
| -    } | 
| -    return \@members; | 
| -} | 
| - | 
| -sub parseInheritance | 
| -{ | 
| -    my $self = shift; | 
| -    my $parent; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq ":") { | 
| -        $self->assertTokenValue($self->getToken(), ":", __LINE__); | 
| -        $parent = $self->parseScopedName(); | 
| -    } | 
| -    return $parent; | 
| -} | 
| - | 
| -sub parseEnum | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; # ignored: Extended attributes are not applicable to enumerations | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "enum") { | 
| -        my $enum = domEnum->new(); | 
| -        $self->assertTokenValue($self->getToken(), "enum", __LINE__); | 
| -        my $enumNameToken = $self->getToken(); | 
| -        $self->assertTokenType($enumNameToken, IdentifierToken); | 
| -        $enum->name($enumNameToken->value()); | 
| -        $self->assertTokenValue($self->getToken(), "{", __LINE__); | 
| -        push(@{$enum->values}, @{$self->parseEnumValueList()}); | 
| -        $self->assertTokenValue($self->getToken(), "}", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        return $enum; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseEnumValueList | 
| -{ | 
| -    my $self = shift; | 
| -    my @values = (); | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == StringToken) { | 
| -        my $enumValueToken = $self->getToken(); | 
| -        $self->assertTokenType($enumValueToken, StringToken); | 
| -        my $enumValue = $self->unquoteString($enumValueToken->value()); | 
| -        push(@values, $enumValue); | 
| -        push(@values, @{$self->parseEnumValues()}); | 
| -        return \@values; | 
| -    } | 
| -    # value list must be non-empty | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseEnumValues | 
| -{ | 
| -    my $self = shift; | 
| -    my @values = (); | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq ",") { | 
| -        $self->assertTokenValue($self->getToken(), ",", __LINE__); | 
| -        my $enumValueToken = $self->getToken(); | 
| -        $self->assertTokenType($enumValueToken, StringToken); | 
| -        my $enumValue = $self->unquoteString($enumValueToken->value()); | 
| -        push(@values, $enumValue); | 
| -        push(@values, @{$self->parseEnumValues()}); | 
| -        return \@values; | 
| -    } | 
| -    return \@values; # empty list (end of enumeration-values) | 
| -} | 
| - | 
| -sub parseCallbackRest | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken) { | 
| -        my $callback = callbackFunction->new(); | 
| -        my $name = $self->getToken(); | 
| -        $self->assertTokenType($name, IdentifierToken); | 
| -        $callback->name($name->value()); | 
| -        $self->assertTokenValue($self->getToken(), "=", __LINE__); | 
| -        $callback->type($self->parseReturnType()); | 
| -        $self->assertTokenValue($self->getToken(), "(", __LINE__); | 
| -        $callback->parameters($self->parseArgumentList()); | 
| -        $self->assertTokenValue($self->getToken(), ")", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        return $callback; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseTypedef | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| -    die "Extended attributes are not applicable to typedefs themselves: " . $self->{Line} if %{$extendedAttributeList}; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "typedef") { | 
| -        $self->assertTokenValue($self->getToken(), "typedef", __LINE__); | 
| -        my $typedef = Typedef->new(); | 
| -        $typedef->extendedAttributes($self->parseExtendedAttributeListAllowEmpty()); | 
| -        $typedef->type($self->parseType()); | 
| -        my $nameToken = $self->getToken(); | 
| -        $self->assertTokenType($nameToken, IdentifierToken); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        my $name = $nameToken->value(); | 
| -        die "typedef redefinition for " . $name . " at " . $self->{Line} if (exists $typedefs{$name} && $typedef->type ne $typedefs{$name}->type); | 
| -        $typedefs{$name} = $typedef; | 
| -        return; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseImplementsStatement | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken) { | 
| -        $self->parseScopedName(); | 
| -        $self->assertTokenValue($self->getToken(), "implements", __LINE__); | 
| -        $self->parseScopedName(); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        return; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseConst | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "const") { | 
| -        my $newDataNode = domConstant->new(); | 
| -        $self->assertTokenValue($self->getToken(), "const", __LINE__); | 
| -        $newDataNode->type($self->parseConstType()); | 
| -        my $constNameToken = $self->getToken(); | 
| -        $self->assertTokenType($constNameToken, IdentifierToken); | 
| -        $newDataNode->name($constNameToken->value()); | 
| -        $self->assertTokenValue($self->getToken(), "=", __LINE__); | 
| -        $newDataNode->value($self->parseConstValue()); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        $newDataNode->extendedAttributes($extendedAttributeList); | 
| -        return $newDataNode; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseConstValue | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextConstValue_1/) { | 
| -        return $self->parseBooleanLiteral(); | 
| -    } | 
| -    if ($next->value() eq "null") { | 
| -        $self->assertTokenValue($self->getToken(), "null", __LINE__); | 
| -        return "null"; | 
| -    } | 
| -    if ($next->type() == FloatToken || $next->value() =~ /$nextConstValue_2/) { | 
| -        return $self->parseFloatLiteral(); | 
| -    } | 
| -    # backward compatibility | 
| -    if ($next->type() == StringToken) { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->type() == IntegerToken) { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseBooleanLiteral | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "true") { | 
| -        $self->assertTokenValue($self->getToken(), "true", __LINE__); | 
| -        return "true"; | 
| -    } | 
| -    if ($next->value() eq "false") { | 
| -        $self->assertTokenValue($self->getToken(), "false", __LINE__); | 
| -        return "false"; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseFloatLiteral | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "-") { | 
| -        $self->assertTokenValue($self->getToken(), "-", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), "Infinity", __LINE__); | 
| -        return "-Infinity"; | 
| -    } | 
| -    if ($next->value() eq "Infinity") { | 
| -        $self->assertTokenValue($self->getToken(), "Infinity", __LINE__); | 
| -        return "Infinity"; | 
| -    } | 
| -    if ($next->value() eq "NaN") { | 
| -        $self->assertTokenValue($self->getToken(), "NaN", __LINE__); | 
| -        return "NaN"; | 
| -    } | 
| -    if ($next->type() == FloatToken) { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseAttributeOrOperationOrIterator | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "serializer") { | 
| -        return $self->parseSerializer($extendedAttributeList); | 
| -    } | 
| -    if ($next->value() =~ /$nextAttributeOrOperationOrIterator_1/) { | 
| -        my $qualifier = $self->parseQualifier(); | 
| -        my $newDataNode = $self->parseAttributeOrOperationRest($extendedAttributeList); | 
| -        if (defined($newDataNode) && $qualifier eq "static") { | 
| -            $newDataNode->isStatic(1); | 
| -        } | 
| -        return $newDataNode; | 
| -    } | 
| -    if ($next->value() =~ /$nextAttribute_1/) { | 
| -        return $self->parseAttribute($extendedAttributeList); | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextAttributeOrOperationOrIterator_2/) { | 
| -        return $self->parseOperationOrIterator($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseSerializer | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "serializer") { | 
| -        $self->assertTokenValue($self->getToken(), "serializer", __LINE__); | 
| -        return $self->parseSerializerRest($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseSerializerRest | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "=") { | 
| -        $self->assertTokenValue($self->getToken(), "=", __LINE__); | 
| -        return $self->parseSerializationPattern($extendedAttributeList); | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() eq "(") { | 
| -        return $self->parseOperationRest($extendedAttributeList); | 
| -    } | 
| -} | 
| - | 
| -sub parseSerializationPattern | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "{") { | 
| -        $self->assertTokenValue($self->getToken(), "{", __LINE__); | 
| -        $self->parseSerializationPatternMap(); | 
| -        $self->assertTokenValue($self->getToken(), "}", __LINE__); | 
| -        return; | 
| -    } | 
| -    if ($next->value() eq "[") { | 
| -        $self->assertTokenValue($self->getToken(), "[", __LINE__); | 
| -        $self->parseSerializationPatternList(); | 
| -        $self->assertTokenValue($self->getToken(), "]", __LINE__); | 
| -        return; | 
| -    } | 
| -    if ($next->type() == IdentifierToken) { | 
| -        $self->assertTokenType($self->getToken(), IdentifierToken); | 
| -        return; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseSerializationPatternMap | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "getter") { | 
| -        $self->assertTokenValue($self->getToken(), "getter", __LINE__); | 
| -        return; | 
| -    } | 
| -    if ($next->value() eq "inherit") { | 
| -        $self->assertTokenValue($self->getToken(), "inherit", __LINE__); | 
| -        $self->parseIdentifiers(); | 
| -        return; | 
| -    } | 
| -    if ($next->type() == IdentifierToken) { | 
| -        $self->assertTokenType($self->getToken(), IdentifierToken); | 
| -        $self->parseIdentifiers(); | 
| -    } | 
| -} | 
| - | 
| -sub parseSerializationPatternList | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "getter") { | 
| -        $self->assertTokenValue($self->getToken(), "getter", __LINE__); | 
| -        return; | 
| -    } | 
| -    if ($next->type() == IdentifierToken) { | 
| -        $self->assertTokenType($self->getToken(), IdentifierToken); | 
| -        $self->parseIdentifiers(); | 
| -    } | 
| -} | 
| - | 
| -sub parseIdentifiers | 
| -{ | 
| -    my $self = shift; | 
| -    my @idents = (); | 
| - | 
| -    while (1) { | 
| -        my $next = $self->nextToken(); | 
| -        if ($next->value() eq ",") { | 
| -            $self->assertTokenValue($self->getToken(), ",", __LINE__); | 
| -            my $token = $self->getToken(); | 
| -            $self->assertTokenType($token, IdentifierToken); | 
| -            push(@idents, $token->value()); | 
| -        } else { | 
| -            last; | 
| -        } | 
| -    } | 
| -    return \@idents; | 
| -} | 
| - | 
| -sub parseQualifier | 
| -{ | 
| -    my $self = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "static") { | 
| -        $self->assertTokenValue($self->getToken(), "static", __LINE__); | 
| -        return "static"; | 
| -    } | 
| -    if ($next->value() eq "stringifier") { | 
| -        $self->assertTokenValue($self->getToken(), "stringifier", __LINE__); | 
| -        return "stringifier"; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseAttributeOrOperationRest | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextAttributeRest_1/) { | 
| -        return $self->parseAttributeRest($extendedAttributeList); | 
| -    } | 
| -    if ($next->value() eq ";") { | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        return; | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextAttributeOrOperationRest_1/) { | 
| -        my $returnType = $self->parseReturnType(); | 
| -        my $function = $self->parseOperationRest($extendedAttributeList); | 
| -        if (defined ($function)) { | 
| -            $function->type($returnType); | 
| -        } | 
| -        return $function; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseAttribute | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextAttribute_1/) { | 
| -        $self->parseInherit(); | 
| -        return $self->parseAttributeRest($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseAttributeRest | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextAttributeRest_1/) { | 
| -        my $newDataNode = domAttribute->new(); | 
| -        if ($self->parseReadOnly()) { | 
| -            $newDataNode->isReadOnly(1); | 
| -        } | 
| -        $self->assertTokenValue($self->getToken(), "attribute", __LINE__); | 
| -        my $type = $self->parseType(); | 
| -        $newDataNode->isNullable(typeHasNullableSuffix($type)); | 
| -        # Remove all "?" in the type declaration, e.g. "double?" -> "double". | 
| -        $newDataNode->type(typeRemoveNullableSuffix($type)); | 
| -        my $token = $self->getToken(); | 
| -        $self->assertTokenType($token, IdentifierToken); | 
| -        $newDataNode->name($token->value()); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        # CustomConstructor may also be used on attributes. | 
| -        if (defined $extendedAttributeList->{"CustomConstructors"}) { | 
| -            delete $extendedAttributeList->{"CustomConstructors"}; | 
| -            $extendedAttributeList->{"CustomConstructor"} = "VALUE_IS_MISSING"; | 
| -        } | 
| -        $newDataNode->extendedAttributes($extendedAttributeList); | 
| -        return $newDataNode; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseInherit | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "inherit") { | 
| -        $self->assertTokenValue($self->getToken(), "inherit", __LINE__); | 
| -        return 1; | 
| -    } | 
| -    return 0; | 
| -} | 
| - | 
| -sub parseReadOnly | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "readonly") { | 
| -        $self->assertTokenValue($self->getToken(), "readonly", __LINE__); | 
| -        return 1; | 
| -    } | 
| -    return 0; | 
| -} | 
| - | 
| -sub parseOperationOrIterator | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextSpecials_1/) { | 
| -        return $self->parseSpecialOperation($extendedAttributeList); | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextAttributeOrOperationRest_1/) { | 
| -        my $returnType = $self->parseReturnType(); | 
| -        my $interface = $self->parseOperationOrIteratorRest($extendedAttributeList); | 
| -        if (defined ($interface)) { | 
| -            $interface->type($returnType); | 
| -        } | 
| -        return $interface; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseSpecialOperation | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextSpecials_1/) { | 
| -        my @specials = (); | 
| -        push(@specials, @{$self->parseSpecials()}); | 
| -        my $returnType = $self->parseReturnType(); | 
| -        my $function = $self->parseOperationRest($extendedAttributeList); | 
| -        if (defined ($function)) { | 
| -            $function->type($returnType); | 
| -            $function->specials(\@specials); | 
| -        } | 
| -        return $function; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseSpecials | 
| -{ | 
| -    my $self = shift; | 
| -    my @specials = (); | 
| - | 
| -    while (1) { | 
| -        my $next = $self->nextToken(); | 
| -        if ($next->value() =~ /$nextSpecials_1/) { | 
| -            push(@specials, $self->parseSpecial()); | 
| -        } else { | 
| -            last; | 
| -        } | 
| -    } | 
| -    return \@specials; | 
| -} | 
| - | 
| -sub parseSpecial | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "getter") { | 
| -        $self->assertTokenValue($self->getToken(), "getter", __LINE__); | 
| -        return "getter"; | 
| -    } | 
| -    if ($next->value() eq "setter") { | 
| -        $self->assertTokenValue($self->getToken(), "setter", __LINE__); | 
| -        return "setter"; | 
| -    } | 
| -    if ($next->value() eq "creator") { | 
| -        $self->assertTokenValue($self->getToken(), "creator", __LINE__); | 
| -        return "creator"; | 
| -    } | 
| -    if ($next->value() eq "deleter") { | 
| -        $self->assertTokenValue($self->getToken(), "deleter", __LINE__); | 
| -        return "deleter"; | 
| -    } | 
| -    if ($next->value() eq "legacycaller") { | 
| -        $self->assertTokenValue($self->getToken(), "legacycaller", __LINE__); | 
| -        return "legacycaller"; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseOperationOrIteratorRest | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "iterator") { | 
| -        return $self->parseIteratorRest($extendedAttributeList); | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() eq "(") { | 
| -        return $self->parseOperationRest($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseIteratorRest | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "iterator") { | 
| -        $self->assertTokenValue($self->getToken(), "iterator", __LINE__); | 
| -        $self->parseOptionalIteratorInterfaceOrObject($extendedAttributeList); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        return; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseOptionalIteratorInterfaceOrObject | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextOptionalIteratorInterfaceOrObject_1/) { | 
| -        return $self->parseOptionalIteratorInterface($extendedAttributeList); | 
| -    } | 
| -    if ($next->value() eq "object") { | 
| -        $self->assertTokenValue($self->getToken(), "object", __LINE__); | 
| -        return; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseOptionalIteratorInterface | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "=") { | 
| -        $self->assertTokenValue($self->getToken(), "=", __LINE__); | 
| -        $self->assertTokenType($self->getToken(), IdentifierToken); | 
| -    } | 
| -} | 
| - | 
| -sub parseOperationRest | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken || $next->value() eq "(") { | 
| -        my $newDataNode = domFunction->new(); | 
| -        my $name = $self->parseOptionalIdentifier(); | 
| -        $newDataNode->name($name); | 
| -        $self->assertTokenValue($self->getToken(), "(", __LINE__); | 
| -        push(@{$newDataNode->parameters}, @{$self->parseArgumentList()}); | 
| -        $self->assertTokenValue($self->getToken(), ")", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        $newDataNode->extendedAttributes($extendedAttributeList); | 
| -        return $newDataNode; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseOptionalIdentifier | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken) { | 
| -        my $token = $self->getToken(); | 
| -        return $token->value(); | 
| -    } | 
| -    return ""; | 
| -} | 
| - | 
| -sub parseArgumentList | 
| -{ | 
| -    my $self = shift; | 
| -    my @arguments = (); | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextArgumentList_1/) { | 
| -        push(@arguments, $self->parseArgument()); | 
| -        push(@arguments, @{$self->parseArguments()}); | 
| -    } | 
| -    return \@arguments; | 
| -} | 
| - | 
| -sub parseArguments | 
| -{ | 
| -    my $self = shift; | 
| -    my @arguments = (); | 
| - | 
| -    while (1) { | 
| -        my $next = $self->nextToken(); | 
| -        if ($next->value() eq ",") { | 
| -            $self->assertTokenValue($self->getToken(), ",", __LINE__); | 
| -            push(@arguments, $self->parseArgument()); | 
| -        } else { | 
| -            last; | 
| -        } | 
| -    } | 
| -    return \@arguments; | 
| -} | 
| - | 
| -sub parseArgument | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextArgumentList_1/) { | 
| -        my $extendedAttributeList = $self->parseExtendedAttributeListAllowEmpty(); | 
| -        my $argument = $self->parseOptionalOrRequiredArgument($extendedAttributeList); | 
| -        return $argument; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseOptionalOrRequiredArgument | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $paramDataNode = domParameter->new(); | 
| -    $paramDataNode->extendedAttributes($extendedAttributeList); | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "optional") { | 
| -        $self->assertTokenValue($self->getToken(), "optional", __LINE__); | 
| -        my $type = $self->parseType(); | 
| -        # domDataNode can only consider last "?". | 
| -        $paramDataNode->isNullable(typeHasNullableSuffix($type)); | 
| -        # Remove all "?" if exists, e.g. "object?[]?" -> "object[]". | 
| -        $paramDataNode->type(typeRemoveNullableSuffix($type)); | 
| -        $paramDataNode->isOptional(1); | 
| -        $paramDataNode->name($self->parseArgumentName()); | 
| -        $self->parseDefault(); | 
| -        return $paramDataNode; | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) { | 
| -        my $type = $self->parseType(); | 
| -        # domDataNode can only consider last "?". | 
| -        $paramDataNode->isNullable(typeHasNullableSuffix($type)); | 
| -        # Remove all "?" if exists, e.g. "object?[]?" -> "object[]". | 
| -        $paramDataNode->type(typeRemoveNullableSuffix($type)); | 
| -        $paramDataNode->isOptional(0); | 
| -        $paramDataNode->isVariadic($self->parseEllipsis()); | 
| -        $paramDataNode->name($self->parseArgumentName()); | 
| -        return $paramDataNode; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseArgumentName | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextArgumentName_1/) { | 
| -        return $self->parseArgumentNameKeyword(); | 
| -    } | 
| -    if ($next->type() == IdentifierToken) { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseEllipsis | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "...") { | 
| -        $self->assertTokenValue($self->getToken(), "...", __LINE__); | 
| -        return 1; | 
| -    } | 
| -    return 0; | 
| -} | 
| - | 
| -sub parseExceptionMember | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "const") { | 
| -        return $self->parseConst($extendedAttributeList); | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) { | 
| -        return $self->parseExceptionField($extendedAttributeList); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseExceptionField | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) { | 
| -        my $newDataNode = domAttribute->new(); | 
| -        $newDataNode->type("attribute"); | 
| -        $newDataNode->isReadOnly(1); | 
| -        $newDataNode->type($self->parseType()); | 
| -        my $token = $self->getToken(); | 
| -        $self->assertTokenType($token, IdentifierToken); | 
| -        $newDataNode->name($token->value()); | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -        $newDataNode->extendedAttributes($extendedAttributeList); | 
| -        return $newDataNode; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseExtendedAttributeListAllowEmpty | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "[") { | 
| -        return $self->parseExtendedAttributeList(); | 
| -    } | 
| -    return {}; | 
| -} | 
| - | 
| -sub copyExtendedAttributes | 
| -{ | 
| -    my $extendedAttributeList = shift; | 
| -    my $attr = shift; | 
| - | 
| -    for my $key (keys %{$attr}) { | 
| -        if ($key eq "Constructor") { | 
| -            push(@{$extendedAttributeList->{"Constructors"}}, $attr->{$key}); | 
| -        } elsif ($key eq "Constructors") { | 
| -            my @constructors = @{$attr->{$key}}; | 
| -            foreach my $constructor (@constructors) { | 
| -                push(@{$extendedAttributeList->{"Constructors"}}, $constructor); | 
| -            } | 
| -        } elsif ($key eq "CustomConstructor") { | 
| -            push(@{$extendedAttributeList->{"CustomConstructors"}}, $attr->{$key}); | 
| -        } elsif ($key eq "CustomConstructors") { | 
| -           my @customConstructors = @{$attr->{$key}}; | 
| -            foreach my $customConstructor (@customConstructors) { | 
| -                push(@{$extendedAttributeList->{"CustomConstructors"}}, $customConstructor); | 
| -            } | 
| -        } else { | 
| -            $extendedAttributeList->{$key} = $attr->{$key}; | 
| -        } | 
| -    } | 
| -} | 
| - | 
| -sub parseExtendedAttributeList | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "[") { | 
| -        $self->assertTokenValue($self->getToken(), "[", __LINE__); | 
| -        my $extendedAttributeList = {}; | 
| -        my $attr = $self->parseExtendedAttribute(); | 
| -        copyExtendedAttributes($extendedAttributeList, $attr); | 
| -        $attr = $self->parseExtendedAttributes(); | 
| -        copyExtendedAttributes($extendedAttributeList, $attr); | 
| -        $self->assertTokenValue($self->getToken(), "]", __LINE__); | 
| -        return $extendedAttributeList; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseExtendedAttributes | 
| -{ | 
| -    my $self = shift; | 
| -    my $extendedAttributeList = {}; | 
| - | 
| -    while (1) { | 
| -        my $next = $self->nextToken(); | 
| -        if ($next->value() eq ",") { | 
| -            $self->assertTokenValue($self->getToken(), ",", __LINE__); | 
| -            my $attr = $self->parseExtendedAttribute2(); | 
| -            copyExtendedAttributes($extendedAttributeList, $attr); | 
| -        } else { | 
| -            last; | 
| -        } | 
| -    } | 
| -    return $extendedAttributeList; | 
| -} | 
| - | 
| -sub parseExtendedAttribute | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken || $next->value() eq "::") { | 
| -        my $scopedName = $self->parseScopedName(); | 
| -        return $self->parseExtendedAttributeRest($scopedName); | 
| -    } | 
| -    # backward compatibility. Spec doesn' allow "[]". But WebKit requires. | 
| -    if ($next->value() eq ']') { | 
| -        return {}; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseExtendedAttribute2 | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken || $next->value() eq "::") { | 
| -        my $scopedName = $self->parseScopedName(); | 
| -        return $self->parseExtendedAttributeRest($scopedName); | 
| -    } | 
| -    return {}; | 
| -} | 
| - | 
| -sub parseExtendedAttributeRest | 
| -{ | 
| -    my $self = shift; | 
| -    my $name = shift; | 
| -    my $attrs = {}; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "(") { | 
| -        $self->assertTokenValue($self->getToken(), "(", __LINE__); | 
| -        $attrs->{$name} = $self->parseArgumentList(); | 
| -        $self->assertTokenValue($self->getToken(), ")", __LINE__); | 
| -        return $attrs; | 
| -    } | 
| -    if ($next->value() eq "=") { | 
| -        $self->assertTokenValue($self->getToken(), "=", __LINE__); | 
| -        $attrs->{$name} = $self->parseExtendedAttributeRest2(); | 
| -        return $attrs; | 
| -    } | 
| - | 
| -    if ($name eq "Constructor" || $name eq "CustomConstructor") { | 
| -        $attrs->{$name} = []; | 
| -    } else { | 
| -        $attrs->{$name} = "VALUE_IS_MISSING"; | 
| -    } | 
| -    return $attrs; | 
| -} | 
| - | 
| -sub parseExtendedAttributeRest2 | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken || $next->value() eq "::") { | 
| -        my $scopedName = $self->parseScopedName(); | 
| -        return $self->parseExtendedAttributeRest3($scopedName); | 
| -    } | 
| -    if ($next->type() == IntegerToken) { | 
| -        my $token = $self->getToken(); | 
| -        return $token->value(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseExtendedAttributeRest3 | 
| -{ | 
| -    my $self = shift; | 
| -    my $name = shift; | 
| - | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "&") { | 
| -        $self->assertTokenValue($self->getToken(), "&", __LINE__); | 
| -        my $rightValue = $self->parseScopedName(); | 
| -        return $name . "&" . $rightValue; | 
| -    } | 
| -    if ($next->value() eq "|") { | 
| -        $self->assertTokenValue($self->getToken(), "|", __LINE__); | 
| -        my $rightValue = $self->parseScopedName(); | 
| -        return $name . "|" . $rightValue; | 
| -    } | 
| -    if ($next->value() eq "(") { | 
| -        my $attr = {}; | 
| -        $self->assertTokenValue($self->getToken(), "(", __LINE__); | 
| -        $attr->{$name} = $self->parseArgumentList(); | 
| -        $self->assertTokenValue($self->getToken(), ")", __LINE__); | 
| -        return $attr; | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextExtendedAttributeRest3_1/) { | 
| -        my @names = (); | 
| -        push(@names, $name); | 
| -        push(@names, @{$self->parseScopedNameListNoComma()}); | 
| -        return join(' ', @names); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value()); | 
| -} | 
| - | 
| -sub parseScopedNameListNoComma | 
| -{ | 
| -    my $self = shift; | 
| -    my @names = (); | 
| - | 
| -    while (1) { | 
| -        my $next = $self->nextToken(); | 
| -        if ($next->type() == IdentifierToken || $next->value() eq "::") { | 
| -            push(@names, $self->parseScopedName()); | 
| -        } else { | 
| -            last; | 
| -        } | 
| -    } | 
| -    return \@names; | 
| -} | 
| - | 
| -sub parseArgumentNameKeyword | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "attribute") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "callback") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "const") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "creator") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "deleter") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "dictionary") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "enum") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "exception") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "getter") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "implements") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "inherit") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "interface") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "legacycaller") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "partial") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "serializer") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "setter") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "static") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "stringifier") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "typedef") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    if ($next->value() eq "unrestricted") { | 
| -        return $self->getToken()->value(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "(") { | 
| -        my $unionType = $self->parseUnionType(); | 
| -        my $suffix = $self->parseTypeSuffix(); | 
| -        die "Suffix after UnionType is not supported." if $suffix ne ""; | 
| -        return $unionType; | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextType_1/) { | 
| -        return $self->parseSingleType(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseSingleType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "any") { | 
| -        $self->assertTokenValue($self->getToken(), "any", __LINE__); | 
| -        return "any" . $self->parseTypeSuffixStartingWithArray(); | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextSingleType_1/) { | 
| -        return $self->parseNonAnyType(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseUnionType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "(") { | 
| -        my $unionType = UnionType->new(); | 
| -        $self->assertTokenValue($self->getToken(), "(", __LINE__); | 
| -        push @{$unionType->unionMemberTypes}, $self->parseUnionMemberType(); | 
| -        $self->assertTokenValue($self->getToken(), "or", __LINE__); | 
| -        push @{$unionType->unionMemberTypes}, $self->parseUnionMemberType(); | 
| -        push @{$unionType->unionMemberTypes}, $self->parseUnionMemberTypes(); | 
| -        $self->assertTokenValue($self->getToken(), ")", __LINE__); | 
| -        return $unionType; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -# Returns UnionType or string | 
| -sub parseUnionMemberType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "(") { | 
| -        my $unionType = $self->parseUnionType(); | 
| -        my $suffix = $self->parseTypeSuffix(); | 
| -        die "Suffix after UnionType is not supported." if $suffix ne ""; | 
| -        return $unionType; | 
| -    } | 
| -    if ($next->value() eq "any") { | 
| -        my $type = $self->assertTokenValue($self->getToken(), "any", __LINE__); | 
| -        $type .= $self->assertTokenValue($self->getToken(), "[", __LINE__); | 
| -        $type .= $self->assertTokenValue($self->getToken(), "]", __LINE__); | 
| -        $type .= $self->parseTypeSuffix(); | 
| -        return $type; | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextSingleType_1/) { | 
| -        return $self->parseNonAnyType(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseUnionMemberTypes | 
| -{ | 
| -    my $self = shift; | 
| -    my @types = (); | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "or") { | 
| -        $self->assertTokenValue($self->getToken(), "or", __LINE__); | 
| -        push @types, $self->parseUnionMemberType(); | 
| -        push @types, $self->parseUnionMemberTypes(); | 
| -    } | 
| -    return @types; | 
| -} | 
| - | 
| -sub parseNonAnyType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextNonAnyType_1/) { | 
| -        return $self->parsePrimitiveType() . $self->parseTypeSuffix(); | 
| -    } | 
| -    if ($next->value() eq "ByteString") { | 
| -        $self->assertTokenValue($self->getToken(), "ByteString", __LINE__); | 
| -        return "ByteString" . $self->parseTypeSuffix(); | 
| -    } | 
| -    if ($next->value() eq "DOMString") { | 
| -        $self->assertTokenValue($self->getToken(), "DOMString", __LINE__); | 
| -        return "DOMString" . $self->parseTypeSuffix(); | 
| -    } | 
| -    if ($next->value() eq "Promise") { | 
| -        $self->assertTokenValue($self->getToken(), "Promise", __LINE__); | 
| -        return "Promise" . $self->parseTypeSuffix(); | 
| -    } | 
| -    if ($next->value() eq "sequence") { | 
| -        $self->assertTokenValue($self->getToken(), "sequence", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), "<", __LINE__); | 
| -        my $type = $self->parseType(); | 
| -        $self->assertTokenValue($self->getToken(), ">", __LINE__); | 
| -        return "sequence<" . $type . ">" . $self->parseNull(); | 
| -    } | 
| -    if ($next->value() eq "object") { | 
| -        $self->assertTokenValue($self->getToken(), "object", __LINE__); | 
| -        return "object" . $self->parseTypeSuffix(); | 
| -    } | 
| -    if ($next->value() eq "Date") { | 
| -        $self->assertTokenValue($self->getToken(), "Date", __LINE__); | 
| -        return "Date" . $self->parseTypeSuffix(); | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() eq "::") { | 
| -        my $name = $self->parseScopedName(); | 
| -        return $name . $self->parseTypeSuffix(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseConstType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextNonAnyType_1/) { | 
| -        return $self->parsePrimitiveType() . $self->parseNull(); | 
| -    } | 
| -    if ($next->type() == IdentifierToken) { | 
| -        my $token = $self->getToken(); | 
| -        return $token->value() . $self->parseNull(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parsePrimitiveType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() =~ /$nextPrimitiveType_1/) { | 
| -        return $self->parseUnsignedIntegerType(); | 
| -    } | 
| -    if ($next->value() =~ /$nextPrimitiveType_2/) { | 
| -        return $self->parseUnrestrictedFloatType(); | 
| -    } | 
| -    if ($next->value() eq "boolean") { | 
| -        $self->assertTokenValue($self->getToken(), "boolean", __LINE__); | 
| -        return "boolean"; | 
| -    } | 
| -    if ($next->value() eq "byte") { | 
| -        $self->assertTokenValue($self->getToken(), "byte", __LINE__); | 
| -        return "byte"; | 
| -    } | 
| -    if ($next->value() eq "octet") { | 
| -        $self->assertTokenValue($self->getToken(), "octet", __LINE__); | 
| -        return "octet"; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseUnrestrictedFloatType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "unrestricted") { | 
| -        $self->assertTokenValue($self->getToken(), "unrestricted", __LINE__); | 
| -        return "unrestricted " . $self->parseFloatType(); | 
| -    } | 
| -    if ($next->value() =~ /$nextUnrestrictedFloatType_1/) { | 
| -        return $self->parseFloatType(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseFloatType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "float") { | 
| -        $self->assertTokenValue($self->getToken(), "float", __LINE__); | 
| -        return "float"; | 
| -    } | 
| -    if ($next->value() eq "double") { | 
| -        $self->assertTokenValue($self->getToken(), "double", __LINE__); | 
| -        return "double"; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseUnsignedIntegerType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "unsigned") { | 
| -        $self->assertTokenValue($self->getToken(), "unsigned", __LINE__); | 
| -        return "unsigned " . $self->parseIntegerType(); | 
| -    } | 
| -    if ($next->value() =~ /$nextUnsignedIntegerType_1/) { | 
| -        return $self->parseIntegerType(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseIntegerType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "short") { | 
| -        $self->assertTokenValue($self->getToken(), "short", __LINE__); | 
| -        return "short"; | 
| -    } | 
| -    if ($next->value() eq "int") { | 
| -        $self->assertTokenValue($self->getToken(), "int", __LINE__); | 
| -        return "int"; | 
| -    } | 
| -    if ($next->value() eq "long") { | 
| -        $self->assertTokenValue($self->getToken(), "long", __LINE__); | 
| -        if ($self->parseOptionalLong()) { | 
| -            return "long long"; | 
| -        } | 
| -        return "long"; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseOptionalLong | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "long") { | 
| -        $self->assertTokenValue($self->getToken(), "long", __LINE__); | 
| -        return 1; | 
| -    } | 
| -    return 0; | 
| -} | 
| - | 
| -sub parseTypeSuffix | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "[") { | 
| -        $self->assertTokenValue($self->getToken(), "[", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), "]", __LINE__); | 
| -        return "[]" . $self->parseTypeSuffix(); | 
| -    } | 
| -    if ($next->value() eq "?") { | 
| -        $self->assertTokenValue($self->getToken(), "?", __LINE__); | 
| -        return "?" . $self->parseTypeSuffixStartingWithArray(); | 
| -    } | 
| -    return ""; | 
| -} | 
| - | 
| -sub parseTypeSuffixStartingWithArray | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "[") { | 
| -        $self->assertTokenValue($self->getToken(), "[", __LINE__); | 
| -        $self->assertTokenValue($self->getToken(), "]", __LINE__); | 
| -        return "[]" . $self->parseTypeSuffix(); | 
| -    } | 
| -    return ""; | 
| -} | 
| - | 
| -sub parseNull | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "?") { | 
| -        $self->assertTokenValue($self->getToken(), "?", __LINE__); | 
| -        return "?"; | 
| -    } | 
| -    return ""; | 
| -} | 
| - | 
| -sub parseReturnType | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "void") { | 
| -        $self->assertTokenValue($self->getToken(), "void", __LINE__); | 
| -        return "void"; | 
| -    } | 
| -    if ($next->type() == IdentifierToken || $next->value() =~ /$nextExceptionField_1/) { | 
| -        return $self->parseType(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseExceptionList | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "(") { | 
| -        my @exceptions = (); | 
| -        $self->assertTokenValue($self->getToken(), "(", __LINE__); | 
| -        push(@exceptions, @{$self->parseScopedNameList()}); | 
| -        $self->assertTokenValue($self->getToken(), ")", __LINE__); | 
| -        return \@exceptions; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseRaises | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "raises") { | 
| -        $self->assertTokenValue($self->getToken(), "raises", __LINE__); | 
| -        return $self->parseExceptionList(); | 
| -    } | 
| -    return []; | 
| -} | 
| - | 
| -sub parseOptionalSemicolon | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq ";") { | 
| -        $self->assertTokenValue($self->getToken(), ";", __LINE__); | 
| -    } | 
| -} | 
| - | 
| -sub parseScopedName | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "::") { | 
| -        return $self->parseAbsoluteScopedName(); | 
| -    } | 
| -    if ($next->type() == IdentifierToken) { | 
| -        return $self->parseRelativeScopedName(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value()); | 
| -} | 
| - | 
| -sub parseAbsoluteScopedName | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->value() eq "::") { | 
| -        $self->assertTokenValue($self->getToken(), "::"); | 
| -        my $token = $self->getToken(); | 
| -        $self->assertTokenType($token, IdentifierToken); | 
| -        return "::" . $token->value() . $self->parseScopedNameParts(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value()); | 
| -} | 
| - | 
| -sub parseRelativeScopedName | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken) { | 
| -        my $token = $self->getToken(); | 
| -        return $token->value() . $self->parseScopedNameParts(); | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value()); | 
| -} | 
| - | 
| -sub parseScopedNameParts | 
| -{ | 
| -    my $self = shift; | 
| -    my @names = (); | 
| - | 
| -    while (1) { | 
| -        my $next = $self->nextToken(); | 
| -        if ($next->value() eq "::") { | 
| -            $self->assertTokenValue($self->getToken(), "::"); | 
| -            push(@names, "::"); | 
| -            my $token = $self->getToken(); | 
| -            $self->assertTokenType($token, IdentifierToken); | 
| -            push(@names, $token->value()); | 
| -        } else { | 
| -            last; | 
| -        } | 
| -    } | 
| -    return join("", @names); | 
| -} | 
| - | 
| -sub parseScopedNameList | 
| -{ | 
| -    my $self = shift; | 
| -    my $next = $self->nextToken(); | 
| -    if ($next->type() == IdentifierToken || $next->value() eq "::") { | 
| -        my @names = (); | 
| -        push(@names, $self->parseScopedName()); | 
| -        push(@names, @{$self->parseScopedNames()}); | 
| -        return \@names; | 
| -    } | 
| -    $self->assertUnexpectedToken($next->value(), __LINE__); | 
| -} | 
| - | 
| -sub parseScopedNames | 
| -{ | 
| -    my $self = shift; | 
| -    my @names = (); | 
| - | 
| -    while (1) { | 
| -        my $next = $self->nextToken(); | 
| -        if ($next->value() eq ",") { | 
| -            $self->assertTokenValue($self->getToken(), ","); | 
| -            push(@names, $self->parseScopedName()); | 
| -        } else { | 
| -            last; | 
| -        } | 
| -    } | 
| -    return \@names; | 
| -} | 
| - | 
| -sub applyMemberList | 
| -{ | 
| -    my $interface = shift; | 
| -    my $members = shift; | 
| - | 
| -    for my $item (@{$members}) { | 
| -        if (ref($item) eq "domAttribute") { | 
| -            push(@{$interface->attributes}, $item); | 
| -            next; | 
| -        } | 
| -        if (ref($item) eq "domConstant") { | 
| -            push(@{$interface->constants}, $item); | 
| -            next; | 
| -        } | 
| -        if (ref($item) eq "domFunction") { | 
| -            push(@{$interface->functions}, $item); | 
| -            next; | 
| -        } | 
| -    } | 
| -} | 
| - | 
| -sub applyExtendedAttributeList | 
| -{ | 
| -    my $interface = shift; | 
| -    my $extendedAttributeList = shift; | 
| - | 
| -    if (defined $extendedAttributeList->{"Constructors"}) { | 
| -        my @constructorParams = @{$extendedAttributeList->{"Constructors"}}; | 
| -        my $index = (@constructorParams == 1) ? 0 : 1; | 
| -        foreach my $param (@constructorParams) { | 
| -            my $constructor = domFunction->new(); | 
| -            $constructor->name("Constructor"); | 
| -            $constructor->extendedAttributes($extendedAttributeList); | 
| -            $constructor->parameters($param); | 
| -            $constructor->overloadedIndex($index++); | 
| -            push(@{$interface->constructors}, $constructor); | 
| -        } | 
| -        delete $extendedAttributeList->{"Constructors"}; | 
| -        $extendedAttributeList->{"Constructor"} = "VALUE_IS_MISSING"; | 
| -    } elsif (defined $extendedAttributeList->{"NamedConstructor"}) { | 
| -        my $newDataNode = domFunction->new(); | 
| -        $newDataNode->name("NamedConstructor"); | 
| -        $newDataNode->extendedAttributes($extendedAttributeList); | 
| -        my %attributes = %{$extendedAttributeList->{"NamedConstructor"}}; | 
| -        my @attributeKeys = keys (%attributes); | 
| -        my $constructorName = $attributeKeys[0]; | 
| -        push(@{$newDataNode->parameters}, @{$attributes{$constructorName}}); | 
| -        $extendedAttributeList->{"NamedConstructor"} = $constructorName; | 
| -        push(@{$interface->constructors}, $newDataNode); | 
| -    } | 
| -    if (defined $extendedAttributeList->{"CustomConstructors"}) { | 
| -        my @customConstructorParams = @{$extendedAttributeList->{"CustomConstructors"}}; | 
| -        my $index = (@customConstructorParams == 1) ? 0 : 1; | 
| -        foreach my $param (@customConstructorParams) { | 
| -            my $customConstructor = domFunction->new(); | 
| -            $customConstructor->name("CustomConstructor"); | 
| -            $customConstructor->extendedAttributes($extendedAttributeList); | 
| -            $customConstructor->parameters($param); | 
| -            $customConstructor->overloadedIndex($index++); | 
| -            push(@{$interface->customConstructors}, $customConstructor); | 
| -        } | 
| -        delete $extendedAttributeList->{"CustomConstructors"}; | 
| -        $extendedAttributeList->{"CustomConstructor"} = "VALUE_IS_MISSING"; | 
| -    } | 
| -    $interface->extendedAttributes($extendedAttributeList); | 
| -} | 
| - | 
| -1; | 
|  |