0

我正在使用Acorn将一些语法上有效的 JavaScript 代码解析为 ESTree 以进行进一步处理。Acorn 似乎也进行了一些语义检查 - 特别是它会为重复声明引发错误。例如,解析以下代码会引发错误Identifier 'f' has already been declared

function f() { return 1; }
function f() { return 2; }

我不希望检查此类语义错误 - 我正在对生成的 ESTree 进行自定义处理,因此源代码的语义有效性对我来说并不重要。

我已经查看了该parse(input, options)功能的 Acorn 选项,但我找不到任何听起来像我想要的东西。

有没有办法禁用这种语义检查?

4

1 回答 1

0

似乎没有适当的方法来禁用语义验证。raiseRecoverable通过覆盖该方法,我设法通过一个丑陋的黑客获得了我想要的东西。

这对我有用(请注意,我在这里使用 TypeScript,但当然可以在纯 JavaScript 中做同样的事情):

import { Parser } from "acorn";
class SyntacticParser extends Parser {
  raiseRecoverable(pos: any, message: string) {
    if (message.includes("Identifier ") && message.includes(" has already been declared")) return;
    (Parser.prototype as any).raiseRecoverable.call(this, pos, message); // weird call syntax required because the TypeScript types for Parser doesn't contain the `raiseRecoverable` method
  }
}

这是一个丑陋的 hack,因为我正在根据字符串化的错误消息过滤掉重复的声明消息。但是,似乎没有更好的方法。

于 2020-08-14T03:10:44.657 回答