gpt4 book ai didi

javascript - 用从评论内容派生的子树替换 JavaScript AST 中的评论

转载 作者:可可西里 更新时间:2023-11-01 01:53:51 24 4
gpt4 key购买 nike

我是 doctest 的作者,又快又脏doctests适用于 JavaScript 和 CoffeeScript。我想通过使用 JavaScript 解析器而不是正则表达式来定位注释来减少库的污染。

我想使用 EsprimaAcorn执行以下操作:

  1. 创建一个 AST
  2. 遍历树,对于每个评论节点:
    1. 从评论节点的文本创建一个 AST
    2. 用这棵子树替换主树中的注释节点

输入:

!function() {

// > toUsername("Jesper Nøhr")
// "jespernhr"
var toUsername = function(text) {
return ('' + text).replace(/\W/g, '').toLowerCase()
}

}()

输出:

!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()
}

}()

我不知道该怎么做。 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 解析器,可以在树中捕获评论。它还具有语言 substring 解析器,可用于将注释文本解析为注释表示的任何类型的 JavaScript AST(例如,函数声明、表达式、变量声明……),以及支持机制将这些新的 ASTs 移植到主树中。如果您要操作 AST,则此子字符串功能可能很重要:大多数解析器不会解析任意语言片段,它们仅用于解析“整个程序”。对于 DMS,没有要替换的注释节点;有与 AST 节点关联的注释,因此嫁接过程比仅仅“替换注释节点”要棘手一些。仍然很容易。

我会观察到大多数解析器(包括这些解析器)读取源代码并通过使用或应用等效的正则表达式将其分解为标记。因此,如果您已经在使用这些来定位评论(这意味着使用它们来定位*非*评论以丢弃,例如,您需要识别包含类似评论文本的字符串文字并忽略它们),您是在找到评论方面,无论如何,解析器都会做得很好。如果你只想用它们的内容完全替换它们,用注释前缀/后缀/* */stripped 回显源流显然会完全按照你的要求做,所以所有这些解析机制似乎都过分了。

关于javascript - 用从评论内容派生的子树替换 JavaScript AST 中的评论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14722788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com