我正在从 flex/bison 移植语法,并且大部分似乎都已启动并运行(特别是,我的令牌流似乎很好,并且我的解析器语法正在编译和运行),但似乎遇到了失控的问题即使对我的语法输入非常小/中等大小的堆栈/内存使用。将相同非末端的无界序列链接在一起的首选结构是什么?在我的 Bison 语法中,我有以下形式的产生规则:
statements: statement | statement statements
words: | word words
在 ANTLR 中,如果我保持相同的规则设置,这似乎在小输入(大约 4kB)上表现出色,但会导致较大输入(大约 100kB)的堆栈溢出。在这两种情况下,生成的自动解析树也相当笨拙。
我尝试将这些生产规则更改为具有显式加法(而不是递归形式):
statements: statement+
words: word*
然而,即使是非常小的输入,这似乎也会导致内存使用量(超过 1GB)绝对可怕的爆炸,并且解析器在运行 20 分钟后还没有设法返回解析树。
任何指针将不胜感激。