从antlr解析器获取有意义的语法错误

时间:2017-03-31 21:09:18

标签: syntax-error antlr

我使用Antlr为.Net创建了一个脚本解释器。它工作得很好,但它产生的语法错误是可怕的。 可以找到处于早期开发阶段的库here,并且使用的语法基于此ecma-Script grammar

现在最大的问题是,当我有一个大型脚本文件并且我有一个对象定义说

module.exports = function (req, res, next) {

  User.findOne({ id: token.id }, function (err, user) {
    console.log(user);
    if (err) throw (err);
    if (user.permission === "admin") {
      return next();

    }

    return res.send("You Must be an ADMIN to perform this task");
  });

};

我希望有一条消息说"语法错误在xyz','预期。 但是,对于因缺少逗号而导致的每个后续错误,请在xyz上获取100个没有可行替代方案的列表。

有没有办法获得由丢失的逗号引起的一个错误?它也会完全没问题,如果它会抱怨意外的var2令牌。

1 个答案:

答案 0 :(得分:0)

你可以使用2种方法:

  • 您检查是否识别出最有可能导致大量后续“错误”的错误,并在之后显示所有错误。因此,在出现更多错误之前,必须先修复该错误。然而,这不会改变ANTLR生成的神秘消息......
  • 您可以直接在语法中添加一些常见错误替代方案,并在调用错误监听器时通知错误监听器。有了它,您可以自己指定错误消息。有关此主题的进一步参考,您可以参考有关此章节的Definitive ANTLR 4 reference,或者您可以查看使用此方法进行非平衡括号的a grammar of mine

使用第二种方法时,您还应该摆脱以下错误产生的“错误”,因为语法可以成功匹配给定的输入,因此可以正常继续。
因此,我强烈建议你采用第二种方法