我们使用antlr作为数据点的层次结构,可以相互计算,其中计算由公式表示。
假设我们有来自外部测量系统的基础数据点a1和a2。
然后我们可以定义一个数据点b,通过公式计算为a1和a2之和
“a1 + a2”。
到目前为止一切都有效,但问题是,在通过抛出,捕获和重新抛出NoViableAltException进行解析时,antlr似乎回溯了错误的分支。
我们使用Sam Harwell的Antlr的C#端口并将其与C#一起使用,并在VStudio 2012中进行调试。
Visual Studio捕获并显示第一次机会异常,这是一个相当缓慢的过程。
即使在调试器窗口中,一个选择不显示第一次机会异常,它们仍然会被捕获并减慢调试器的速度。
由于有数百个数据点由公式定义,因此这些第一次机会异常使调试非常慢。
我的问题是:有没有办法改进语法,以减少第一次机会NoViableAltException的数量?
或者更改antlr代码,通过返回值实现回溯而不是抛出/捕获NoViableAltException是否有意义?
答案 0 :(得分:0)
我不确定ANTLR 3如何使用backtrack=true
选项,因为我个人从未在生产中使用该构造。
如果你有能力,你应该考虑updating to ANTLR 4,这不需要为长前瞻序列采用回溯(实际上,ANTLR 4中没有backtrack
选项。) / p>
否则,您应该在成功解析输入时更新语法以删除backtrack=true
选项。即使在调试器之外,这也会显着提高解析器的性能。
backtrack=true
选项应仅视为实验选项。它对生产代码的影响很大,往往导致不可预测和/或无法解释的行为。