2014-09-26 2 views
1

Я работаю над грамматикой, которая анализирует потенциально большие уцензурные тексты. Компоненты текста «Код» используются для построения 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 и создаю собственные грамматические парсеры, я не могу понять, что это такое. Пожалуйста помоги.

ответ

4

ANTLR генерирует рекурсивные анализаторы спуска. За немногими исключениями глубина стека оценки, необходимая для синтаксического анализа, напрямую соответствует глубине выписок правил, которые вы пишете в грамматике.

Примеры:

Это требует один кадр стека для каждого символа.

line 
    : Character line 
    | EOF 
    ; 

Это требует один кадр стека общая.

line 
    : Character* EOF 
    ; 
+0

Благодарим за подсказку, вы открыли мне глаза! – David