前言
babel 的 parser 是基于 acorn 扩展而来的,而 acorn 也不是最早的 js parser,js parser 的历史是怎样的? 各种 parser 之间的关系是什么样的呢?
JS Parser 发展
babel parser 对 estree AST 的扩展
acorn 插件
分词(词法分析)
组装AST(语法分析)
代码
const acorn = require("acorn");
const Parser = acorn.Parser;
const TokenType = acorn.TokenType;
Parser.acorn.keywordTypes["hao"] = new TokenType("hao",{keyword: "hao"});
function wordsRegexp(words) {
return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$")
}
var haoKeyword = function(Parser) {
return class extends Parser {
parse(program) {
let newKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this const class extends export import super";
newKeywords += " hao";
this.keywords = new RegExp("^(?:" + newKeywords.replace(/ /g, "|") + ")$")
return(super.parse(program));
}
parseStatement(context, topLevel, exports) {
var starttype = this.type;
if (starttype == Parser.acorn.keywordTypes["hao"]) {
var node = this.startNode();
return this.parseHaoStatement(node);
}
else {
return(super.parseStatement(context, topLevel, exports));
}
}
parseHaoStatement(node) {
this.next();
return this.finishNode({value: 'hao'},'HaoStatement');//新增加的ssh语句
};
}
}
const newParser = Parser.extend(haoKeyword);