我有一个大的c代码文件(> 9000 LoC)并尝试使用这个语法解析它:
https://github.com/antlr/grammars-v4/blob/master/c/C.g4
我等了一个多小时才流产。该机器是Core 2 Duo L9400,配备4GB内存。最大java vm-heap-size设置为2GB。 它不会产生任何解析错误,但它根本没有完成。
在做了一些研究之后,我将预测模式设置为SLL,产生了一个 “在输入时没有可行的选择”在几秒钟内。
接下来,我将预测模式设置为LL_EXACT_AMBIG_DETECTION,并将DiagnosticErrorListener附加到解析器。这主要产生了很多“歧义报告” 关于声明/声明说明符。我认为这会迫使解析器经常回溯,这可能是长解析时间的解释?
除了尝试重写语法之外,我还能做些什么来提高性能吗?
感谢任何帮助;)
答案 0 :(得分:2)
首先,重要的是要注意ANTLR 4 在解析过程中从不回溯。
您所指的语法不是SLL,这会阻止您以最快的模式使用ANTLR 4。但是,在实验过程中,我们能够确定一条规则,我们将其改为制定语法SLL。您可以通过antlr-interest邮件列表获取更改的语法。我现在正在参加一场音乐会,所以我无法访问它。
答案 1 :(得分:0)
是的。我们从规范中转换出来的只有一个规则的变化就是你可以做到的示范。我们很快就会优化那个。