我正在研究一种语法,它可以解析潜在的类似大标记的文本代码的文本部分用于构建要评估的AST,而文本的其余部分则被忽略。我实现这一点的方法是读取文本,直到找到"符号(重音符号),然后推送一个"代码"模式,负责解析允许的表达式。下一个重音将弹出此模式并继续循环。
问题是,我在读取大块文本时出现堆栈溢出错误:
Exception in thread "main" java.lang.StackOverflowError
at org.antlr.v4.runtime.CommonToken.<init>(CommonToken.java:113)
at org.antlr.v4.runtime.CommonTokenFactory.create(CommonTokenFactory.java:94)
at org.antlr.v4.runtime.CommonTokenFactory.create(CommonTokenFactory.java:40)
at org.antlr.v4.runtime.Lexer.emit(Lexer.java:269)
at org.antlr.v4.runtime.Lexer.nextToken(Lexer.java:180)
at org.antlr.v4.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:187)
at org.antlr.v4.runtime.BufferedTokenStream.sync(BufferedTokenStream.java:170)
at org.antlr.v4.runtime.BufferedTokenStream.consume(BufferedTokenStream.java:154)
at org.antlr.v4.runtime.Parser.consume(Parser.java:588)
at org.antlr.v4.runtime.Parser.match(Parser.java:220)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:160)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.start_line(TestGrammarParser.java:113)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:168)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.start_line(TestGrammarParser.java:113)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:168)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
at decimill.parser.TestGrammarParser.line(TestGrammarParser.java:161)
...
下面是一个简化到绝对最小值的语法,它再现了我的问题。事实上,我已经将所有内容放在一个语法文件中,以便于重现错误:
grammar TestGrammar;
@header {
package decimill.parser;
}
parse
: start_line
;
start_line
: line
;
line
: ANY line
| EOL start_line
| EOF
;
EOL : [nr]+;
ANY : ~[nr];
输入任何300行以上的文本都会导致上述错误(至少在我的机器上是这样)。我怀疑我做错了什么,但由于我对ANTLR和构建自定义语法分析器还很陌生,我不知道它是什么。请帮忙。
ANTLR生成递归下降解析器。除了少数例外,解析所需的评估堆栈深度直接对应于您在语法中编写的规则调用的深度。
示例:
这需要每个字符有一个堆栈帧。
line
: Character line
| EOF
;
这总共需要一个堆栈帧。
line
: Character* EOF
;