第一次机会NoViableAltException减慢了调试速度

时间:2014-02-26 17:56:37

标签: c# antlr

我们使用antlr作为数据点的层次结构,可以相互计算,其中计算由公式表示。
假设我们有来自外部测量系统的基础数据点a1和a2。 然后我们可以定义一个数据点b,通过公式计算为a1和a2之和 “a1 + a2”。

到目前为止一切都有效,但问题是,在通过抛出,捕获和重新抛出NoViableAltException进行解析时,antlr似乎回溯了错误的分支。

我们使用Sam Harwell的Antlr的C#端口并将其与C#一起使用,并在VStudio 2012中进行调试。 Visual Studio捕获并显示第一次机会异常,这是一个相当缓慢的过程。 即使在调试器窗口中,一个选择不显示第一次机会异常,它们仍然会被捕获并减慢调试器的速度。

由于有数百个数据点由公式定义,因此这些第一次机会异常使调试非常慢。

我的问题是:有没有办法改进语法,以减少第一次机会NoViableAltException的数量?
或者更改antlr代码,通过返回值实现回溯而不是抛出/捕获NoViableAltException是否有意义?

1 个答案:

答案 0 :(得分:0)

我不确定ANTLR 3如何使用backtrack=true选项,因为我个人从未在生产中使用该构造。

  • 如果你有能力,你应该考虑updating to ANTLR 4,这不需要为长前瞻序列采用回溯(实际上,ANTLR 4中没有backtrack选项。) / p>

  • 否则,您应该在成功解析输入时更新语法以删除backtrack=true选项。即使在调试器之外,这也会显着提高解析器的性能。

backtrack=true选项应仅视为实验选项。它对生产代码的影响很大,往往导致不可预测和/或无法解释的行为。

相关问题