dav*_*ers 13 javascript parsing abstract-syntax-tree
我是针对JavaScript和CoffeeScript 的doctest,快速和脏的doctests的作者.我想通过使用JavaScript解析器而不是正则表达式来查找注释来减少库的脏污.
输入:
!function() {
// > toUsername("Jesper Nøhr")
// "jespernhr"
var toUsername = function(text) {
return ('' + text).replace(/\W/g, '').toLowerCase()
}
}()
Run Code Online (Sandbox Code Playgroud)
输出:
!function() {
doctest.input(function() {
return toUsername("Jesper Nøhr")
});
doctest.output(4, function() {
return "jespernhr"
});
var toUsername = function(text) {
return ('' + text).replace(/\W/g, '').toLowerCase()
}
}()
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么做.Acorn提供了一个walker,它接受一个节点类型和一个函数,并在每次遇到指定类型的节点时遍历调用该函数的树.这似乎很有希望,但不适用于评论.
使用Esprima我可以esprima.parse(input, {comment: true, loc: true}).comments用来获取评论,但我不知道如何更新树.
大多数生成 AST 的解析器都会丢弃注释。我不知道 Esprima 或 Acorn 做什么,但这可能就是问题所在。
.... 事实上,Esprima 将评论捕获列为当前错误: http://code.google.com/p/esprima/issues/detail ?id=197
...Acorn 的代码就在 GitHub 中。它似乎也抛弃了评论。
因此,看起来您必须先修复任一解析器以捕获注释,此时您的任务应该很简单,否则您就会陷入困境。
我们的 DMS 软件重组工具包具有 JavaScript 解析器,可以捕获树中的注释。它还具有语言子字符串解析器,可用于将注释文本解析为注释所代表的任何类型的 JavaScript AST(例如,函数声明、表达式、变量声明等),以及移植此类新 AST 的支持机制进入主树。如果您要操作 AST,这种子字符串功能可能很重要:大多数解析器不会解析任意语言片段,它们仅用于解析“整个程序”。对于DMS,没有注释节点可以替换;有与 AST 节点相关的注释,因此嫁接过程比“替换注释节点”要复杂一些。还是很容易的。
我将观察到大多数解析器(包括这些解析器)都会读取源代码,并通过使用或应用正则表达式的等效项将其分解为标记。因此,如果您已经在使用它们来定位注释(这意味着使用它们来定位要丢弃的*非*注释,例如,您需要识别包含类似注释的文本的字符串文字并忽略它们),那么您就是无论如何,在查找注释方面,解析器的表现和解析器一样好。如果您想要做的就是将它们完全替换为它们的内容,则使用注释前缀/后缀 /* */ stripped 来回显源流显然将完全符合您的要求,因此所有这些解析机制似乎都有点矫枉过正。
| 归档时间: |
|
| 查看次数: |
1978 次 |
| 最近记录: |