2014-09-26 4 views
1

잠재적으로 큰 markdown-like 텍스트를 구문 분석하는 문법을 연구 중입니다. 텍스트의 '코드'부분은 평가할 AST를 작성하는 데 사용되고 나머지 텍스트는 무시됩니다. 이것을 구현하는 나의 방법은`` '기호 (grave 악센트)가 발견 될 때까지 텍스트를 읽은 다음 허용되는 표현을 분석하는'코드 '모드를 푸는 것입니다. 다음 억음 악센트가이 모드를 팝하고 루프를 계속합니다.ANTLR4는 긴 파일에 java.lang.StackOverflowError를 발생시킵니다.

다음
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) 
    ... 

내 문제를 재현 절대 최소로 감소 문법입니다 :

문제

는 larg의 (어)를 읽는 텍스트의 덩어리 때 내가 스택 오버플로 오류를 얻을 수 있다는 것입니다.

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

관련 문제