2016-11-16 8 views
1

문법을 SQL 구문 분석에 쓰려고하는데, 단 어제 식별자를 식별하기 위해 어휘 규칙에 문제가 있습니다. 1 행에 4 '': '에서 토큰 인식 오류 :'표현을 구문 분석 예외 - 내 문법 ANTLR을 통해 GUID를 구문 분석하는 중 오류가 발생했습니다.

grammar Sample; 
UID: '^[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}$'; 
literal_value : 
      UID 
      ; 

그리고 내 코드

는하지만 오류가 발생하고 IS-

public void compile() { 
    String expression = "4B66049D-6E1A-4CE6-8FBF-B31CD8B9E6AF" 
    ANTLRInputStream input = new ANTLRInputStream(expression); 
    SampleLexer lexer = new SampleLexer(input); 
    final CommonTokenStream tokens = new CommonTokenStream(lexer); 
    SampleParser parser = new SampleParser(tokens); 
    SampleParser.Literal_valueContext context = parser.literal_value(); 
    System.out.println(context.toStringTree()); 
} 

을 구문 분석하는 '예요 , 위치 0

답변

0

정규 표현식을 ANTLR에 보냈습니다. 그러나 ANTLR은 정규식 엔진이 아닙니다. https://github.com/antlr/antlr4/blob/master/doc/grammars.md

는 우선, 당신은 시작과 끝에서 ^$을 원하지 않는 : 당신은 여기에 설명되어 일부의 문법을 따라야합니다. 그것들은 ANTLR이 아닌 정규식입니다.

0

앵커 ^$은 ANTLR에서 유효하지 않습니다. 또한 {...}은 ANTLR에서 지원하지 않습니다.

은 당신이하고 싶은 것은 이것이다 :

grammar Sample; 

literal_value 
: UID EOF 
; 

UID 
: BLOCK BLOCK '-' BLOCK '-' BLOCK '-' BLOCK '-' BLOCK BLOCK BLOCK 
; 

fragment BLOCK 
: [A-Za-z0-9] [A-Za-z0-9] [A-Za-z0-9] [A-Za-z0-9] 
; 

EOF, 당연한 파일합니다 ($ 앵커)의 끝을 의미 내장 된 토큰 타입입니다. fragment 키워드는 실제 규칙을 생성하는 데 사용되지 않는 규칙을 나타내며 다른 규칙에 의해서만 사용됩니다. 참조 : What does "fragment" mean in ANTLR?