Я работаю над грамматикой, которая анализирует потенциально большие уцензурные тексты. Компоненты текста «Код» используются для построения AST для оценки, в то время как остальная часть текста игнорируется. Мой способ реализации этого заключался в том, чтобы прочитать текст до тех пор, пока не будет найден символ '' (серьезный акцент), а затем нажмите режим «Код», который позаботится о разборе разрешенных выражений. Следующий серьезный акцент всплыл бы в этом режиме и продолжил бы цикл.ANTLR4 throws java.lang.StackOverflowError для более длинных файлов
Проблема заключается в том, что я получаю ошибку переполнения стека при чтении LARG (эр) куски текста:
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 : [\n\r]+;
ANY : ~[\n\r];
Кормления любого текста 300+ строка вызовет ошибку выше (по крайней мере, на моей машине). Я подозреваю, что делаю что-то очень плохое, но поскольку я совершенно новый для ANTLR и создаю собственные грамматические парсеры, я не могу понять, что это такое. Пожалуйста помоги.
Благодарим за подсказку, вы открыли мне глаза! – David