Index: webkit/port/bindings/scripts/IDLParser.pm |
=================================================================== |
--- webkit/port/bindings/scripts/IDLParser.pm (revision 19361) |
+++ webkit/port/bindings/scripts/IDLParser.pm (working copy) |
@@ -1,441 +0,0 @@ |
-# |
-# KDOM IDL parser |
-# |
-# Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org> |
-# |
-# This file is part of the KDE project |
-# |
-# 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 |
-# aint with this library; see the file COPYING.LIB. If not, write to |
-# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
-# Boston, MA 02111-1307, USA. |
-# |
- |
-package IDLParser; |
- |
-use IDLStructure; |
- |
-use constant MODE_UNDEF => 0; # Default mode. |
- |
-use constant MODE_MODULE => 10; # 'module' section |
-use constant MODE_INTERFACE => 11; # 'interface' section |
-use constant MODE_EXCEPTION => 12; # 'exception' section |
-use constant MODE_ALIAS => 13; # 'alias' section |
- |
-# Helper variables |
-my @temporaryContent = ""; |
- |
-my $parseMode = MODE_UNDEF; |
-my $preservedParseMode = MODE_UNDEF; |
- |
-my $beQuiet; # Should not display anything on STDOUT? |
-my $document = 0; # Will hold the resulting 'idlDocument' |
- |
-my $directive = ""; |
- |
-# Default Constructor |
-sub new |
-{ |
- my $object = shift; |
- my $reference = { }; |
- |
- $document = 0; |
- $beQuiet = shift; |
- |
- bless($reference, $object); |
- return $reference; |
-} |
- |
- |
-sub ParseInheritance |
-{ |
- my $object = shift; |
- my $fileName = shift; |
- my $defines = shift; |
- my $preprocessor = shift; |
- |
- $directive = "inheritance"; |
- return $object->ParseImpl($fileName, $defines, $preprocessor); |
-} |
- |
-# Returns the parsed 'idlDocument' |
-sub Parse |
-{ |
- my $object = shift; |
- my $fileName = shift; |
- my $defines = shift; |
- my $preprocessor = shift; |
- |
- $directive = ""; |
- return $object->ParseImpl($fileName, $defines, $preprocessor); |
-} |
- |
-sub ParseImpl |
-{ |
- my $object = shift; |
- my $fileName = shift; |
- my $defines = shift; |
- my $preprocessor = shift; |
- |
- if (!$preprocessor) { |
- $preprocessor = "/usr/bin/gcc -E -P -x c++"; |
- } |
- |
- if (!$defines) { |
- $defines = ""; |
- } |
- |
- print " | *** Starting to parse $fileName...\n |\n" unless $beQuiet; |
- |
- open FILE, $preprocessor . " " . join(" ", (map { "-D$_" } split(/ /, $defines))) . " ". $fileName . "|" or die "Could not open $fileName"; |
- my @documentContent = <FILE>; |
- close FILE; |
- |
- my $dataAvailable = 0; |
- |
- # Simple IDL Parser (tm) |
- foreach (@documentContent) { |
- my $newParseMode = $object->DetermineParseMode($_); |
- |
- if ($newParseMode ne MODE_UNDEF) { |
- if ($dataAvailable eq 0) { |
- $dataAvailable = 1; # Start node building... |
- } else { |
- $object->ProcessSection(); |
- } |
- } |
- |
- # Update detected data stream mode... |
- if ($newParseMode ne MODE_UNDEF) { |
- $parseMode = $newParseMode; |
- } |
- |
- push(@temporaryContent, $_); |
- } |
- |
- # Check if there is anything remaining to parse... |
- if (($parseMode ne MODE_UNDEF) and ($#temporaryContent > 0)) { |
- $object->ProcessSection(); |
- } |
- |
- print " | *** Finished parsing!\n" unless $beQuiet; |
- |
- $document->fileName($fileName); |
- |
- return $document; |
-} |
- |
-sub ParseModule |
-{ |
- my $object = shift; |
- my $dataNode = shift; |
- |
- print " |- Trying to parse module...\n" unless $beQuiet; |
- |
- my $data = join("", @temporaryContent); |
- $data =~ /$IDLStructure::moduleSelector/; |
- |
- my $moduleName = (defined($1) ? $1 : die("Parsing error!\nSource:\n$data\n)")); |
- $dataNode->module($moduleName); |
- |
- print " |----> Module; NAME \"$moduleName\"\n |-\n |\n" unless $beQuiet; |
-} |
- |
-sub dumpExtendedAttributes |
-{ |
- my $padStr = shift; |
- my $attrs = shift; |
- |
- if (!%{$attrs}) { |
- return ""; |
- } |
- |
- my @temp; |
- while (($name, $value) = each(%{$attrs})) { |
- push(@temp, "$name=$value"); |
- } |
- |
- return $padStr . "[" . join(", ", @temp) . "]"; |
-} |
- |
-sub parseExtendedAttributes |
-{ |
- my $str = shift; |
- $str =~ s/\[\s*(.*)\]/$1/g; |
- |
- my %attrs = (); |
- |
- foreach my $value (split(/\s*,\s*/, $str)) { |
- ($name,$value) = split(/\s*=\s*/, $value, 2); |
- |
- # Attributes with no value are set to be true |
- $value = 1 unless defined $value; |
- $attrs{$name} = $value; |
- } |
- |
- return \%attrs; |
-} |
- |
-sub ParseInterface |
-{ |
- my $object = shift; |
- my $dataNode = shift; |
- my $sectionName = shift; |
- |
- my $data = join("", @temporaryContent); |
- |
- # Look for end-of-interface mark |
- $data =~ /};/g; |
- $data = substr($data, index($data, $sectionName), pos($data) - length($data)); |
- |
- $data =~ s/[\n\r]/ /g; |
- |
- # Beginning of the regexp parsing magic |
- if ($sectionName eq "exception") { |
- print " |- Trying to parse exception...\n" unless $beQuiet; |
- |
- my $exceptionName = ""; |
- my $exceptionData = ""; |
- my $exceptionDataName = ""; |
- my $exceptionDataType = ""; |
- |
- # Match identifier of the exception, and enclosed data... |
- $data =~ /$IDLStructure::exceptionSelector/; |
- $exceptionName = (defined($1) ? $1 : die("Parsing error!\nSource:\n$data\n)")); |
- $exceptionData = (defined($2) ? $2 : die("Parsing error!\nSource:\n$data\n)")); |
- |
- ('' =~ /^/); # Reset variables needed for regexp matching |
- |
- # ... parse enclosed data (get. name & type) |
- $exceptionData =~ /$IDLStructure::exceptionSubSelector/; |
- $exceptionDataType = (defined($1) ? $1 : die("Parsing error!\nSource:\n$data\n)")); |
- $exceptionDataName = (defined($2) ? $2 : die("Parsing error!\nSource:\n$data\n)")); |
- |
- # Fill in domClass datastructure |
- $dataNode->name($exceptionName); |
- |
- my $newDataNode = new domAttribute(); |
- $newDataNode->type("readonly attribute"); |
- $newDataNode->signature(new domSignature()); |
- |
- $newDataNode->signature->name($exceptionDataName); |
- $newDataNode->signature->type($exceptionDataType); |
- |
- my $arrayRef = $dataNode->attributes; |
- push(@$arrayRef, $newDataNode); |
- |
- print " |----> Exception; NAME \"$exceptionName\" DATA TYPE \"$exceptionDataType\" DATA NAME \"$exceptionDataName\"\n |-\n |\n" unless $beQuiet; |
- } elsif ($sectionName eq "interface") { |
- print " |- Trying to parse interface...\n" unless $beQuiet; |
- |
- my $interfaceName = ""; |
- my $interfaceData = ""; |
- |
- # Match identifier of the interface, and enclosed data... |
- $data =~ /$IDLStructure::interfaceSelector/; |
- |
- $interfaceExtendedAttributes = (defined($1) ? $1 : " "); chop($interfaceExtendedAttributes); |
- $interfaceName = (defined($2) ? $2 : die("Parsing error!\nSource:\n$data\n)")); |
- $interfaceBase = (defined($3) ? $3 : ""); |
- $interfaceData = (defined($4) ? $4 : die("Parsing error!\nSource:\n$data\n)")); |
- |
- # Fill in known parts of the domClass datastructure now... |
- $dataNode->name($interfaceName); |
- $dataNode->extendedAttributes(parseExtendedAttributes($interfaceExtendedAttributes)); |
- |
- # Inheritance detection |
- my @interfaceParents = split(/,/, $interfaceBase); |
- foreach(@interfaceParents) { |
- my $line = $_; |
- $line =~ s/\s*//g; |
- |
- my $arrayRef = $dataNode->parents; |
- push(@$arrayRef, $line); |
- } |
- |
- return if ($directive eq "inheritance"); |
- |
- $interfaceData =~ s/[\n\r]/ /g; |
- my @interfaceMethods = split(/;/, $interfaceData); |
- |
- foreach my $line (@interfaceMethods) { |
- if ($line =~ /[ \t]attribute[ \t]/) { |
- $line =~ /$IDLStructure::interfaceAttributeSelector/; |
- |
- my $attributeType = (defined($1) ? $1 : die("Parsing error!\nSource:\n$line\n)")); |
- my $attributeExtendedAttributes = (defined($2) ? $2 : " "); chop($attributeExtendedAttributes); |
- |
- my $attributeDataType = (defined($3) ? $3 : die("Parsing error!\nSource:\n$line\n)")); |
- my $attributeDataName = (defined($4) ? $4 : die("Parsing error!\nSource:\n$line\n)")); |
- |
- ('' =~ /^/); # Reset variables needed for regexp matching |
- |
- $line =~ /$IDLStructure::getterRaisesSelector/; |
- my $getterException = (defined($1) ? $1 : ""); |
- |
- $line =~ /$IDLStructure::setterRaisesSelector/; |
- my $setterException = (defined($1) ? $1 : ""); |
- |
- my $newDataNode = new domAttribute(); |
- $newDataNode->type($attributeType); |
- $newDataNode->signature(new domSignature()); |
- |
- $newDataNode->signature->name($attributeDataName); |
- $newDataNode->signature->type($attributeDataType); |
- $newDataNode->signature->extendedAttributes(parseExtendedAttributes($attributeExtendedAttributes)); |
- |
- my $arrayRef = $dataNode->attributes; |
- push(@$arrayRef, $newDataNode); |
- |
- print " | |> Attribute; TYPE \"$attributeType\" DATA NAME \"$attributeDataName\" DATA TYPE \"$attributeDataType\" GET EXCEPTION? \"$getterException\" SET EXCEPTION? \"$setterException\"" . |
- dumpExtendedAttributes("\n | ", $newDataNode->signature->extendedAttributes) . "\n" unless $beQuiet; |
- |
- $getterException =~ s/\s+//g; |
- $setterException =~ s/\s+//g; |
- @{$newDataNode->getterExceptions} = split(/,/, $getterException); |
- @{$newDataNode->setterExceptions} = split(/,/, $setterException); |
- } elsif (($line !~ s/^\s*$//g) and ($line !~ /^\s*const/)) { |
- $line =~ /$IDLStructure::interfaceMethodSelector/ or die "Parsing error!\nSource:\n$line\n)"; |
- |
- my $methodExtendedAttributes = (defined($1) ? $1 : " "); chop($methodExtendedAttributes); |
- my $methodType = (defined($2) ? $2 : die("Parsing error!\nSource:\n$line\n)")); |
- my $methodName = (defined($3) ? $3 : die("Parsing error!\nSource:\n$line\n)")); |
- my $methodSignature = (defined($4) ? $4 : die("Parsing error!\nSource:\n$line\n)")); |
- |
- ('' =~ /^/); # Reset variables needed for regexp matching |
- |
- $line =~ /$IDLStructure::raisesSelector/; |
- my $methodException = (defined($1) ? $1 : ""); |
- |
- my $newDataNode = new domFunction(); |
- |
- $newDataNode->signature(new domSignature()); |
- $newDataNode->signature->name($methodName); |
- $newDataNode->signature->type($methodType); |
- $newDataNode->signature->extendedAttributes(parseExtendedAttributes($methodExtendedAttributes)); |
- |
- print " | |- Method; TYPE \"$methodType\" NAME \"$methodName\" EXCEPTION? \"$methodException\"" . |
- dumpExtendedAttributes("\n | ", $newDataNode->signature->extendedAttributes) . "\n" unless $beQuiet; |
- |
- $methodException =~ s/\s+//g; |
- @{$newDataNode->raisesExceptions} = split(/,/, $methodException); |
- |
- my @params = split(/,/, $methodSignature); |
- foreach(@params) { |
- my $line = $_; |
- |
- $line =~ /$IDLStructure::interfaceParameterSelector/; |
- my $paramExtendedAttributes = (defined($1) ? $1 : " "); chop($paramExtendedAttributes); |
- my $paramType = (defined($2) ? $2 : die("Parsing error!\nSource:\n$line\n)")); |
- my $paramName = (defined($3) ? $3 : die("Parsing error!\nSource:\n$line\n)")); |
- |
- my $paramDataNode = new domSignature(); |
- $paramDataNode->name($paramName); |
- $paramDataNode->type($paramType); |
- $paramDataNode->extendedAttributes(parseExtendedAttributes($paramExtendedAttributes)); |
- |
- my $arrayRef = $newDataNode->parameters; |
- push(@$arrayRef, $paramDataNode); |
- |
- print " | |> Param; TYPE \"$paramType\" NAME \"$paramName\"" . |
- dumpExtendedAttributes("\n | ", $paramDataNode->extendedAttributes) . "\n" unless $beQuiet; |
- } |
- |
- my $arrayRef = $dataNode->functions; |
- push(@$arrayRef, $newDataNode); |
- } elsif ($line =~ /^\s*const/) { |
- $line =~ /$IDLStructure::constantSelector/; |
- my $constType = (defined($1) ? $1 : die("Parsing error!\nSource:\n$line\n)")); |
- my $constName = (defined($2) ? $2 : die("Parsing error!\nSource:\n$line\n)")); |
- my $constValue = (defined($3) ? $3 : die("Parsing error!\nSource:\n$line\n)")); |
- |
- my $newDataNode = new domConstant(); |
- $newDataNode->name($constName); |
- $newDataNode->type($constType); |
- $newDataNode->value($constValue); |
- |
- my $arrayRef = $dataNode->constants; |
- push(@$arrayRef, $newDataNode); |
- |
- print " | |> Constant; TYPE \"$constType\" NAME \"$constName\" VALUE \"$constValue\"\n" unless $beQuiet; |
- } |
- } |
- |
- print " |----> Interface; NAME \"$interfaceName\"" . |
- dumpExtendedAttributes("\n | ", $dataNode->extendedAttributes) . "\n |-\n |\n" unless $beQuiet; |
- } |
-} |
- |
-# Internal helper |
-sub DetermineParseMode |
-{ |
- my $object = shift; |
- my $line = shift; |
- |
- my $mode = MODE_UNDEF; |
- if ($_ =~ /module/) { |
- $mode = MODE_MODULE; |
- } elsif ($_ =~ /interface/) { |
- $mode = MODE_INTERFACE; |
- } elsif ($_ =~ /exception/) { |
- $mode = MODE_EXCEPTION; |
- } elsif ($_ =~ /alias/) { |
- $mode = MODE_ALIAS; |
- } |
- |
- return $mode; |
-} |
- |
-# Internal helper |
-sub ProcessSection |
-{ |
- my $object = shift; |
- |
- if ($parseMode eq MODE_MODULE) { |
- die ("Two modules in one file! Fatal error!\n") if ($document ne 0); |
- $document = new idlDocument(); |
- $object->ParseModule($document); |
- } elsif ($parseMode eq MODE_INTERFACE) { |
- my $node = new domClass(); |
- $object->ParseInterface($node, "interface"); |
- |
- die ("No module specified! Fatal Error!\n") if ($document eq 0); |
- my $arrayRef = $document->classes; |
- push(@$arrayRef, $node); |
- } elsif($parseMode eq MODE_EXCEPTION) { |
- my $node = new domClass(); |
- $object->ParseInterface($node, "exception"); |
- |
- die ("No module specified! Fatal Error!\n") if ($document eq 0); |
- my $arrayRef = $document->classes; |
- push(@$arrayRef, $node); |
- } elsif($parseMode eq MODE_ALIAS) { |
- print " |- Trying to parse alias...\n" unless $beQuiet; |
- |
- my $line = join("", @temporaryContent); |
- $line =~ /$IDLStructure::aliasSelector/; |
- |
- my $interfaceName = (defined($1) ? $1 : die("Parsing error!\nSource:\n$line\n)")); |
- my $wrapperName = (defined($2) ? $2 : die("Parsing error!\nSource:\n$line\n)")); |
- |
- print " |----> Alias; INTERFACE \"$interfaceName\" WRAPPER \"$wrapperName\"\n |-\n |\n" unless $beQuiet; |
- |
- # FIXME: Check if alias is already in aliases |
- my $aliases = $document->aliases; |
- $aliases->{$interfaceName} = $wrapperName; |
- } |
- |
- @temporaryContent = ""; |
-} |
- |
-1; |