acorn.js介绍

一个用JavaScript编写的,小巧、快速的JavaScript解析器。

当在CommonJS(node.js)或AMD环境中运行时,可直接使用require或import导入。 在浏览器中加载时(Acorn可以在任何启用JS的浏览器中使用,支持IE5以上),无需任何类型的模块管理,将定义单个全局对象acorn,并将所有导出的属性添加到该对象中。

Main parser

parse(input, options) 这个函数用来解析JavaScript代码,返回值将是由ESTree规范指定的抽象语法树对象。input为string类型参数(即js代码),options可以为undefined或者是如下的值:

  • ecmaVersion 指定要解析的ECMAScript版本。 必须是3,5,6(2015),7(2016)或8(2017)。 这会影响严格模式、保留字集合、和新的语法特征支持。 默认版本为7(ES6)。
    注意:只有“stage4”(finalized)ECMAScript功能正在被Acorn实现。

  • sourceType 指定代码应该被解析的模式。可以是scriptmodule。 这将影响全局的严格模式,和解析 importexport的声明。

  • onInsertedSemicolon 如果有回调函数,则只要解析器插入了一个缺少的分号,就会调用该回调函数。 回调函数将被赋予插入分号的点的字符偏移量作为参数,如果locations被设置,则表示此位置的{line,column}对象。

  • onTrailingCommaonInsertedSemicolon,但是为了跟踪逗号插入。

  • allowReserved 如果为false,则使用保留字会产生错误。 对于ecmaVersion 3,默认为true,对于较高版本,默认为false。 当value为never时,保留字和关键字也不能用作属性名称(如IE低版本浏览器)

  • allowReturnOutsideFunction 默认情况下,顶层的return语句会引发错误。 将其设置为true以接受此类代码。

  • allowImportExportEverywhere 默认情况下,导入和导出声明只能显示在程序的顶层。 将此选项设置为true可以允许在允许语句的任何地方

  • allowHashBang 启用此功能(默认情况下关闭),如果代码以#! 开始(如在shellscript中),第一行将被视为注释。

  • locations 当为true时,每个Node都有一个连接起始和终止子对象的loc对象,每个对象包含{line,column}形式的一个行号和列号。 默认值为false。

  • onToken 如果为此选项传递了一个函数,则每个发现的token将以与从tokenizer() getToken()返回的tokens相同的格式传递。
    如果参数是array,则每个发现的token将被push到array中。
    注意不能从回调中调用解析器,从而破坏其内部状态。

  • onComment 如果为此选项传递函数,每当遇到注释时,将使用以下参数调用该函数:

    • block:如果注释是块注释,则为true,如果是行注释,则为false。
    • text:评论的内容。
    • start:注释开头的字符偏移量。
    • end:注释结尾的字符偏移量。
      locations参数被设置时,注释的开始和结束位置{line,column}将作为
      两个附加参数传递。
      当此选项是array时,每个注释被push到它作为对象以Esprima格式:
{
  "type": "Line" | "Block",
  "value": "comment text",
  "start": Number,
  "end": Number,
  // If `locations` option is on:
  "loc": {
     "start": {line: Number, column: Number}
     "end": {line: Number, column: Number}
   },
  // If `ranges` option is on:
  "range": [Number, Number]
}

请注意,您不能从回调函数中调用解析器,从而破坏其内部状态。

  • ranges 节点的起始和终止字符偏移记录在起始和结束属性中(直接在节点上,而不是保存行/列数据的loc对象),还要添加一个保持[start,end]数组的半标准化范围属性, 使用相同的数字,将ranges设置为true

  • program 通过解析第一个文件生成的树, 作为后续解析中的程序选项传递多个文件,可以将多个文件解析为单个AST。 会将已解析的文件以toplevel形式添加到现有解析树的“Program”(program即顶部节点)节点。

  • sourceFilelocations选项为true时,您可以传递此选项以在每个节点的loc对象中添加一个源属性。 请注意,此选项的内容不以任何方式进行检查或处理; 您可以随意使用您选择的任何格式。

  • directSourceFilesourceFile一样,但是一个sourceFile属性将直接添加到节点,而不是loc对象。

  • preserveParens 如果此选项为true,则括号表达式由(非标准)括号化表达式节点表示,该节点具有包含括号内的表达式的单个表达式属性。

parseExpressionAt(input, offset, options)

将解析字符串中的单个表达式,并返回其AST。 如果表达式之后还有更多的字符串,不会去解析。

getLineInfo(input, offset)

可用于获取给定程序字符串和字符偏移量的{line,column}对象。

tokenizer(input, options)

返回具有getToken方法的对象,该方法可以重复调用以获取下一个token和{start,end,type,value}对象(启用了location选项时添加了loc属性,并且启用了range选项时的range属性)。 当令牌的类型为tokTypes.eof时,您应该停止调用该方法,因为它将永远返回相同的token。

var a = require('./a.js');
image.png

在 type 对应的对象中,label 表示当前标识的一个类型,keyword 就是关键词,像例子中的require,或者 function 之类的。
value 则是当前标识的值,start/end 分别是开始和结束的位置。

更多type解释https://segmentfault.com/a/1190000007473065

在ES6环境中,返回的结果可以用作任何其他符合协议的迭代:

for (let token of acorn.tokenizer(str)) {
  // iterate over the tokens
}

// transform code to array of tokens:
var tokens = [...acorn.tokenizer(str)];

tokTypes拥有将name映射到token object的对象,该对象最终在tokentype属性中。

using with Escodegen
Escodegen支持从AST生成注释,附加在特定于Esprima-specific的格式。 为了在Acorn中模拟相同的格式,请考虑以下示例:

var comments = [], tokens = [];

var ast = acorn.parse('var x = 42; // answer', {
    // collect ranges for each node
    ranges: true,
    // collect comments in Esprima's format
    onComment: comments,
    // collect token ranges
    onToken: tokens
});

// attach comments using collected information
escodegen.attachComments(ast, comments, tokens);

// generate code
console.log(escodegen.generate(ast, {comment: true}));
// > 'var x = 42;    // answer'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容