当然,我使用ANTLR的树构造函数来构建抽象语法树。虽然通过语法错误继续解析是很好的,这样用户就可以看到所有的错误,但一旦解析完成,我希望得到一个异常或某种输入在语法上无效的指示;这样,我就可以停止编译并告诉用户“对不起,修复您的语法错误,然后再试一次”。我不想让它根据它认为用户想说的话吐出一个不完整的AST,并继续编译的下一个阶段,而没有任何错误的迹象(除了错误消息,我看不到到控制台)。然而,在默认情况下,它正是这样做的。
权威的ANTLR引用提供了一种技术,可以在检测到语法错误时立即停止解析:重写Mismatch
和RecoverFromMismatchedSet
方法以抛出RecognitionException
,并添加@rulecatch
操作来执行相同的操作。这似乎失去了从解析错误中恢复的好处,但更重要的是,它只能部分工作。如果缺少必要的令牌(例如,如果二进制运算符只有一边有一个表达式),它就会像预期的那样抛出异常,但如果添加了一个无关的令牌,ANTLR就会插入它认为属于那里的令牌,并继续其愉快的方式,生成一个AST,除了控制台消息之外,没有语法错误的指示。(更糟糕的是,它插入的令牌是EOF
,因此文件的其余部分甚至没有得到解析。)
我肯定可以通过向解析器添加isvalid
字段来解决这个问题,并重写方法和添加操作,以便在解析结束时,如果有任何错误,它会抛出异常。但是有没有更好的办法呢?我无法想象我正在努力做的事情在ANTLR用户中是不寻常的。
...如果它已经完成了解析,我想得到一个异常或某种输入在语法上无效的指示;这样我就可以停止编译...
在解析之后,可以在lexer和解析器上调用GetNumberOfSyntaxErrors
,以确定是否存在ANTLR暗中容纳的错误。显然,这并没有告诉您这些错误是什么,但我认为这些方法解决了问题中的“一旦解析完成...停止编译”部分。
权威的ANTLR引用提供了一种技术,可以在检测到语法错误时立即停止解析:重写mismatch和recoverFromMismatchedSet方法以抛出RecognitionExceptions,并添加@RuleCatch操作来执行相同的操作。
如果缺少一个必要的令牌…,[重写的代码]会像预期的那样抛出一个异常,但是如果添加了一个无关的令牌,ANTLR会插入它认为属于那里的令牌,并继续它的快乐之路······
方法recoverFromMismatchedToken
通过分别委托给方法MismatchisMissingToken
和MismatchisUnwantedToken
来测试可恢复的丢失和无关标记。如果适当的方法确定插入或删除可以解决问题,则RecoverFromMismatchedToken
进行适当的更正。如果确定没有任何操作解决不匹配的令牌问题,则recoverFromMismatchedToken
抛出MismatchedTokenException
。
如果发生了恢复操作,则调用ReportError
,这将调用DisplayRecognitionError
的详细信息。
这适用于ANTLR V3.4和可能更早的版本。
这至少给了您两个选择:
>
重写recoverFromMismatchedToken
并在细粒度级别上处理错误。从这里,您可以将调用委托给超级实现,滚动您自己的恢复代码,或者使用异常进行保释。无论在什么情况下,您的代码都将被调用,因此将知道发生了不匹配错误,无论是可恢复的还是其他错误。此选项可能相当于重写recoverFromMismatchedSet
。
问题内容: 如何抑制Shell命令的错误消息? 例如,如果目录中只有文件,则运行会显示错误消息: 是否有抑制这种错误消息的选项?我想在bash脚本中使用此命令,但是我想隐藏所有错误。 问题答案: 大多数Unix命令(包括)都会将常规输出写入stdout,并将错误消息写入stderr,因此您可以使用bash重定向来丢弃错误消息,同时将常规输出保留在原处:
问题内容: 每次我都会收到警告: 抑制它的最佳方法是什么?所有软件包都是最新的。 Conf: OSX带有Brew Python 2.7.10(默认,2015年7月13日,12:05:58),pandas == 0.17.0和matplotlib == 1.5.0 问题答案: 您可以禁止所有警告:
问题内容: 因此,我一直在使用ANTLRv3.4在Eclipse中进行语法编写,并且已经编写了一个有效的语法,我想确保在编辑该语法时一切仍然有效。我可以每次都进入口译员的行列,但这似乎很浪费时间。 问题:我已经读过关于gunit的信息,但是它提供了下载gUnit的链接:(http://antlr.org/hudson/job/gUnit/org.antlr $ gunit / lastSucces
我最近开始尝试llvm的< code>clang-tidy工具。现在我正试图抑制来自第三方库代码的错误警告。为此,我想使用命令行选项
如果我们有一个synchronized方法,在使用同一个对象时需要进行同步,那该怎么做呢? 例如,我们有一个 同步函数,如果所有参数在不同的调用中都不同,则可以并行执行,但如果调用 1 中的参数与调用 2 中的参数相同,则不能并行执行: 如果和同时调用函数,我们将如何停止这里的死锁? 我认为和是易失性的,或者基于和的哈希值进行同步,或者通过包含和的新对象进行同步。
问题内容: Ajax使用回调,因为它是同步的。 我希望对远程URL块的调用直到出现一些答案为止 ,就像在Ajax中一样,但是没有异步部分,或者我要说要进行JAX调用。 是否有任何技术可以使以下事情发生(使用JQuery)(…使用JQuery或其他解决方案): 我只是想知道-想学习。 实际上,有时会阻塞直到回复合适为止。我并不是说要浏览器阻止,而只是脚本运行时。 问题答案: 您可以在使用jQuery