天天看点

webkit idl parser 模块分析

webkit 中 根据idl接口 语言定义dom对象,然后通过perl 解析模块产生经过包装的c++ 文件。
 与idl解析相关的五个文件如下:



bindings/scripts/CodeGenerator.pm 

bindings/scripts/CodeGeneratorV8.pm 

bindings/scripts/IDLParser.pm 

bindings/scripts/IDLStructure.pm 

bindings/scripts/generate-bindings.pl



generate-bindings.pl  为解析 idl文件入口,根据idl文件定义生成 c++头文件及源文件。
generate-bindings.pl  在makefile中被调用。比如android平台上在 webcore/Android.derived.v8bindings.mk 文件中。

generate-bindings.pl 代码:

 首先 获取 参数:

 GetOptions('include=s@' => \@idlDirectories, # 目录, 依赖,输出目录等参数。

            'outputDir=s' => \$outputDirectory,

            'generator=s' => \$generator,

            'defines=s' => \$defines,

            'preprocessor=s' => \$preprocessor,

            'write-dependencies' => \$writeDependencies);



 my $idlFile = $ARGV[0];       # 要解析的idl文件



 $defines =~ s/^\s+|\s+$//g; # 正则表达式去掉空格



 # Parse the given IDL file.

 #创建一个解析器

 my $parser = IDLParser->new(1); # 对应IDLParser.pm  代码

 my $document = $parser->Parse($idlFile, $defines, $preprocessor);



 # Generate desired output for given IDL file.  对应 CodeGenerator.pm 代码。

my $codeGen = CodeGenerator->new(\@idlDirectories, $generator, $outputDirectory, 0, $preprocessor, $writeDependencies);

 #生成头文件及源文件

 $codeGen->ProcessDocument($document, $defines);


 ProcessDocument->GenerateInterface(CodeGeneratorV8.pm)

  


                                         |->GenerateHeader(CodeGeneratorV8.pm) 生成头文件,

 GenerateInterface->   |

                                         |->GenerateImplementation(CodeGeneratorV8.pm) 生成源文件      

继续阅读