什么是php的ast结构,什么是AST?Vue源码中AST语法树的解
析
这篇⽂章给⼤家介绍的内容是关于什么是AST?Vue源码中AST语法树的解析,有⼀定的参考价值,有需要的朋友可以参考⼀下,希望对你有所帮助。
什么是AST
AST是指抽象语法树(abstract syntax tree),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式。Vue在mount过程中,template会被编译成AST语法树。
以
请输⼊:
inso
par()var stack = [];
var prerveWhitespace = options.prerveWhitespace !== fal;
var root;
var currentParent;
var inVPre = fal;
var inPre = fal;
var warned = fal;
function warnOnce (msg){
}
function cloElement (element){
}
//调⽤parHTML,这⾥对options的内容省略
parHTML(template,options);电子商务培训
定义⼀些变量,root⽤于存放AST树根节点,currentParent存放当前⽗元素,stack⽤来辅助树建⽴的栈。接着调⽤parHTML函数进⾏转化,传⼊template和options。
options的结构如下:
parHTML()
parHTML内容⼤纲
last = html; //确认html不是类似
if (!lastTag || !isPlainTextElement(lastTag)) {
var textEnd = html.indexOf('<');//判断html字符串是否以<;开头
if (textEnd === 0) {
// 这⾥的Comment是Vue定义的正则表达式,判断html是不是注释
/
/var comment = /^
if (st(html)) {
var commentEnd = html.indexOf('-->');
if (commentEnd >= 0) {
if (options.shouldKeepComment) {
}
advance(commentEnd + 3);
continue
}
}
/
/判断是否处理向下兼容的注释,类似
//var conditionalComment = /^
if (st(html)) {
var conditionalEnd = html.indexOf(']>');
if (conditionalEnd >= 0) {
advance(conditionalEnd + 2);
continue
}
}
//获取/p>
// var doctype = /^^>]+>/i;
var doctypeMatch = html.match(doctype);
if (doctypeMatch) {
advance(doctypeMatch[0].length);
continue
vgl
}
//判断此段html是否结束标签
// var endTag = new RegExp(("^<\\/" + qnameCapture + "[^>]*>")); // var qnameCapture = "((?:" + ncname + "\\:)?" + ncname + ")";
// var ncname = '[a-zA-Z_][\\w\\-\\.]*';
var endTagMatch = html.match(endTag);
if (endTagMatch) {
var curIndex = index;
advance(endTagMatch[0].length);
parEndTag(endTagMatch[1], curIndex, index);
continue
}
// 匹配开始标签,获取match对象
squirrel是什么意思
var startTagMatch = parStartTag();
if (startTagMatch) {
handleStartTag(startTagMatch);
if (shouldIgnoreFirstNewline(lastTag, html)) {
pope francis
advance(1);
}
prent的同义词
continue
}
var text = (void 0), rest = (void 0), next = (void 0);
if (textEnd >= 0) {
rest = html.slice(textEnd);
while (大耳朵
!st(rest) &&
!st(rest) &&
!st(rest) &&
!st(rest) ) {
// 处理⽂本中的<;字符
next = rest.indexOf('<', 1);
if (next < 0) { break }
textEnd += next;
rest = html.slice(textEnd);
深圳新思域}
text = html.substring(0, textEnd); advance(textEnd);
}
if (textEnd < 0) {
text = html;
html = '';
}
if (options.chars && text) { options.chars(text);
}
folicacid
拼音缩写zz的词} el {
//代码省略
}
if (html === last) {
//代码省略
}
}
parHTML使⽤while循环对传进来的html进⾏解析。⾸先获取<;标签索引var textEnd = html.indexOf('<');如果textEnd为0 说明是标签或者,再⽤正则匹配是否为注释标签,如果不是,再判断是否为向下兼容放⼊注释,如(详情见),如果不是,再判断是否已如果不是,再判断当前是否结束
标签。var endTagMatch = html.match(endTag); 匹配不到那么就是开始标签,调⽤parStartTag()函数解析。
parStartTag()function parStartTag () {
var start = html.match(startTagOpen);
if (start) {
var match = {
tagName: start[1],//标签名,本⽂的例⼦p
attrs: [],
start: index//0
};//定义match对象
advance(start[0].length);//index=4,html=" id="test">...
var end, attr;
//match对象的attrs
//index=14
while (!(end = html.match(startTagClo)) && (attr = html.match(attribute))) {
advance(attr[0].length);
match.attrs.push(attr);
}
// 在第⼆次while循环后 end匹配到结束标签 => ['>','']
if (end) {