2016-07-12 3 views
2

문자열 "match 'match content'"과 일치 시키려고 시도하면서 작은 따옴표 안에 일치하는 내용을 추출합니다. 그러나 다음과 같은 예외가 throw됩니다 :Antlr3은 구문 분석을 수행 할 때 java.lang.OutOfMemoryError를보고합니다.

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at org.antlr.runtime.Lexer.emit(Lexer.java:160) 
    at org.antlr.runtime.Lexer.nextToken(Lexer.java:91) 
    at org.antlr.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:133) 
    at org.antlr.runtime.BufferedTokenStream.sync(BufferedTokenStream.java:127) 
    at org.antlr.runtime.CommonTokenStream.consume(CommonTokenStream.java:70) 
    at org.antlr.runtime.BaseRecognizer.match(BaseRecognizer.java:106) 

왜 OOM 예외가 발생하고 도트 g 파일에서 오류 정의를 찾을 수 없는지 알 수 없습니다.

내 도트 g 파일 :

grammar Contains; 

options { 
    language=Java; 
    output=AST; 
    ASTLabelType=CommonTree; 
    backtrack=false; 
    k=3; 
} 

match 
    : 
    KW_MATCH SINGLE_QUOTE (~(SINGLE_QUOTE|'\\') | ('\\' .))+ SINGLE_QUOTE 
    ; 

regexp 
    : 
    KW_REGEXP SINGLE_QUOTE RegexComponent+ SINGLE_QUOTE 
    ; 

range 
    : 
    KW_RANGE SINGLE_QUOTE left=(LPAREN | LSQUARE) start=Number COMMA end = Number right=(RPAREN | RSQUARE) SINGLE_QUOTE 
    ; 


DOT : '.'; // generated as a part of Number rule 
COLON : ':' ; 
COMMA : ',' ; 

LPAREN : '(' ; 
RPAREN : ')' ; 
LSQUARE : '[' ; 
RSQUARE : ']' ; 
LCURLY : '{'; 
RCURLY : '}'; 

PLUS : '+'; 
MINUS : '-'; 
STAR : '*'; 

BITWISEOR : '|'; 
BITWISEXOR : '^'; 
QUESTION : '?'; 
DOLLAR : '$'; 

KW_RANGE : 'RANGE'; 
KW_REGEXP : 'REGEXP'; 
KW_MATCH : 'MATCH'; 

DOUBLE_QUOTE : '\"'; 
SINGLE_QUOTE : '\''; 

fragment 
Digit 
    : 
    '0'..'9' 
    ; 

fragment 
Exponent 
    : 
    ('e' | 'E') (PLUS|MINUS)? (Digit)+ 
    ; 

fragment 
RegexComponent 
    : 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' 
    | PLUS | STAR | QUESTION | MINUS | DOT 
    | LPAREN | RPAREN | LSQUARE | RSQUARE | LCURLY | RCURLY 
    | BITWISEXOR | BITWISEOR | DOLLAR | '\u0080'..'\u00FF' | '\u0400'..'\u04FF' 
    | '\u0600'..'\u06FF' | '\u0900'..'\u09FF' | '\u4E00'..'\u9FFF' | '\u0A00'..'\u0A7F' 
    ; 

Number 
    : 
    (Digit)+ (DOT (Digit)* (Exponent)? | Exponent)? 
    ; 

WS : (' '|'\r'|'\t'|'\n'|'\u000C')* {$channel=HIDDEN;} 
    ; 

답변

1

당신은 변경하여 시작할 수 :

WS : (' '|'\r'|'\t'|'\n'|'\u000C')* {$channel=HIDDEN;} 
    ; 

에 :

WS : (' '|'\r'|'\t'|'\n'|'\u000C')+ {$channel=HIDDEN;} 
    ; 

버전이 무한을 생산할 수있는 빈 문자열을 일치 토큰 양 (OOME을 던질 수 있음)

+0

내 버전은 3.4이지만 길을 사용하려고했지만 예외는 여전히 발생했습니다! – sol

+0

편집 한 문법 파일에서 렉서를 재생성 했습니까? 이 예외를 재현하는 작은 Java 응용 프로그램을 추가 할 수 있습니까? –

+0

그래, OOM은 여전히이 방법으로 재생산합니다. – sol