acorn.js介绍

2017-05-16  本文已影响0人  胡博术

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

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

Main parser

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

{
  "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]
}

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

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'
上一篇下一篇

猜你喜欢

热点阅读