这篇文章主要为大家介绍了某视频剪辑软件编译器解析编制源码解析示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
目录
引言解析编制编译源码配置选项属性分别解析最终选项添加警告方法两个特殊的属性处理
引言
在上篇文章某视频剪辑软件编译器源码分析编译函数作用中我们介绍到了,在编译函数方法中:
//编译
var编译=编译(模板,选项);
而真正的编译工作是依托于编制函数,接下来我们详细解析编译。
解析 compile
上述代码在调用编译,其中模板字符串模板,选项参数选择第二个参数传递给编制函数,在章节三种我们知道,这里传递过去的选择如下:
{
应该解码新线条,
shouldDecodeNewlinesForHref,
分隔符,
评论,
警告
}
compile 源码
接下来我们看下编制的源码。
函数createCompilerCreator(基本编译){
返回函数createCompiler(baseOptions) {
函数编译(
模板,
选择
) {
var最终选项=对象。创建(基本选项);
定义变量误差=[];
var tips=[];
finalOptions.warn=function(msg,tip) {
(提示?温馨提示:错误)。推送(味精);
};
如果(选项){
//合并自定义模块
如果(选项。模块){
finalOptions.modules=
(baseOptions.modules || []).concat(选项。模块);
}
//合并自定义指令
if (options.directives) {
finalOptions.directives=extend(
对象。创建(基本选项。指令| |空),
选项。指令
);
}
//复制其他选项
对于(选项中的变量键){
如果(关键!=='模块'键!=='指令'){
最终选项[key]=options[key];
}
}
}
var compiled=base compile(模板,最终选项);{
errors.push.apply(错误,检测错误(已编译。ast));
}
已编译。错误=错误
compiled.tips=tips
返回已编译
}
返回{
编译:编译,
compileToFunctions:createCompileToFunctionFn(编译)
}
}
}
首先可以看到:
var最终选项=对象。创建(基本选项);
配置选项
最终选项所有的配置选项最终都会挂载在这个对象上,基本选项包含编译器在运作的时候所需的配置选项。
var baseOptions={
expectHTML: true,
模块:模块$1,
指令:指令$1,
isPreTag: isPreTag,
isUnaryTag: isUnaryTag,
mustUseProp: mustUseProp,
canBeLeftOpenTag:canBeLeftOpenTag,
isReservedTag: isReservedTag,
getTagNamespace:getTagNamespace,
staticKeys: genStaticKeys(模块$1)
};
属性分别解析
第一个属性:expectHTML被设置为没错。第二个属性:模块
风险值模块$1=[
klass$1,
风格$1,
型号$1
];
var klass$1={
staticKeys: ['staticClass'],
转换节点:转换节点
根数据:根数据
};
var style$1={
staticKeys: ['staticStyle'],
transformNode: transformNode$1
genData: genData$1
};
风险值模型$1={
preTransformNode:preTransformNode
};
我们用到了在细讲。
第三个属性:directives value是三个属性(模型、文本、html)的对象,属性的值都是函数。第四个属性:isPreTag。这是一个通过给定的标签名称检查标签是否是“前”标签的函数。第五个属性:isUnaryTag是makeMap生成的函数,用来检测给定的标签是否为一元标签。第六个属性:mustUseProp。它是一个函数,用于检测一个属性是否应该与标签中的props绑定。第七个属性:canBeLeftOpenTag是makeMap生成的函数。它的作用是检测不是一元的,但可以自己完成和闭合的标签。举个例子,如果div标签是double标签,你需要像这样使用div text /div,但是你还是可以省略掉封闭标签,直接写成这样:div text,浏览器会自动补全。但是有些标签不能这样用。它们是严格的双重标签。第八个属性:isReservedTag它是一个函数,用于检查给定的标签是否是保留标签。第九个属性:getTagNamespace它也是一个函数,它的作用是获取元素(tag)的命名空间。第十个属性:staticKeys。它的值是通过调用以模块为参数的genStaticKeys函数的返回值获得的。它的功能是根据编译器选项的modules选项生成一个静态密钥字符串。
现在简单介绍一下baseOptions中各种属性的作用,然后在我们使用的时候详细讲解一下它们的源代码。
继续往下看:
var误差=[];
var tips=[];
finalOptions.warn=function(msg,tip) {
(提示?温馨提示:错误)。推送(msg);
};
非常简单
finalOptions添加warn 方法
向finalOptions添加了warn方法,该方法接收两个参数:
消息错误或提示的消息提示用于指示消息是错误还是提示。
warn选项主要用于在编译过程中收集错误和提示。如果收集到的信息是错误信息,将被添加到前面定义的errors数组中,如果是提示信息,将被添加到tips数组中。
继续:
if(选项){
//合并自定义模块
if(选项.模块){
finalOptions.modules=
(baseOptions.modules || [])。concat(options . modules);
}
//合并自定义指令
if (options.directives) {
finalOptions.directives=extend(
object . create(base options . directives | | null),
选项.指令
);
}
//复制其他选项
for(选项中的变量键){
如果(关键!=='模块'键!=='指令'){
final options[key]=options[key];
}
}
}
这段代码检查选项是否存在。这里的options是用编译器编译模板时传递的选项参数,也可以简单理解为调用compileToFunctions函数时传递的选项参数。
Baseoptions被理解为编译器的缺省或基本选项,而options是提供定制能力的扩展选项。上述代码的功能是将options对象混合到finalOptions中。
两个特殊的属性处理
Modules:如果options.modules存在,将modules属性添加到finalOptions对象中,其值是由baseOptions.modules和options.modules. Directives两个数字组合而成的新数组:对于Directives,采用原型链的原则,实现扩展属性对基本属性的覆盖。
继续:
var compiled=base compile(template,final options);{
errors.push.apply(errors,detect errors(compiled . ast));
}
compiled.errors=errors
compiled.tips=tips
上述代码调用baseCompile函数,并分别传递字符串模板和最终编译器finalOptions。
Compiled是baseCompile对模板的编译结果,所以上面代码的作用是通过抽象语法树检查模板中是否有错误表达式。它是通过Detectors函数实现的,编译后的. ast作为参数传递给Detectors函数,最终返回一个数组,数组中包含所有错误的集合,最后通过这段代码将错误添加到errors中。
将收集的错误和提示添加到编译的中,并返回它们。
基本编译函数是在createcompilerrcreator函数调用时传递的实参。
//` createcompilerkreator '允许创建使用替代的编译器
//解析器/优化器/codegen,例如苏维埃社会主义共和国优化编译器。
//这里我们只是用默认的部分导出一个默认的编译器。
var create compiler=createCompilerCreator(函数库编译(
模板,
选择
) {
var ast=parse(template.trim(),options);
if (options.optimize!==假){
优化(ast,选项);
}
var code=generate(ast,options);
返回{
ast: ast,
render: code.render,
staticRenderFns:代码。静态呈现Fns
}
});
从某视频剪辑软件编译器源码分析(一)到某视频剪辑软件编译器源码分析(四)我们已经把编译器整体代码组织的结构讲分析了。
从下章节开始,就正式的进入到某视频剪辑软件编译器词法分析阶段,去看下模板对应的AST(抽象语法树)是怎么形成的。
某视频剪辑软件编译器源码大西洋时间抽象语法树
以上就是某视频剪辑软件编译器解析编制源码解析的详细内容,更多关于某视频剪辑软件编译器编制解析的资料请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。