2012-06-13 3 views
0

다음과 같은 내용으로 ANTLR로 문법을 만들려고합니다.ANTLR의>와 Whitespaces를 사용할 수 있습니까?

그것은 같은 식별자를 분석 할 수

> 문자가 뒤에있는 경우는 식별자를 포함하고, 다른 사업자보다 그 큰 때문에 푸> 바 식별자이다
foo > bar > 67 

.

그리고 그것은()가 필요

((a = 1) AND (b = 2)) OR (c = 3) 

같은 일을 구문 분석합니다.

저는이 주제와 ANTLR에 정말 익숙하며 누군가 도와 드릴 수 있기를 바랍니다.

나는 현재이 문법

grammar testgrammer; 

start : statement EOF; 

statement 
    : operation (AND operation)*; 

operation 
    : '(' ID OPERATOR INT ')'; 

AND : 'AND'; 

OPERATOR: '=' | '>'; 

ID 
    : ('a'..'z'| 'A'..'Z')+ (WS '>' WS ('a'..'z' | 'A'..'Z')+)? 
    ; 

WS 
    : ' '+ {skip();} 
    ; 

INT : '0'..'9'+ 
    ; 

이있어하지만 난> 연산자와 같은 ID의> 사이 하우투 스위치를 알아낼 수 없습니다.

+0

이미 직접 해봤습니까? –

+0

현재 시도하고 있지만 antlrworks에 대한 몇 가지 문제가 있지만 곧 업데이트하려고합니다. – Sebastian

답변

1

먼저, "foo > bar"을 식별자로 사용하고 표현식을 "foo > 67"으로 설정하는 것은 혼란스러운 일입니다.

이러한 식별자 안에 공백이 허용되므로 "foo > " 이후에 렉서는 "foo > 67"과 같은 입력을 넘어 가게됩니다. "foo > " 이후에는 문자를 소비하려고 시도하지만 숫자가 표시되기 때문입니다. 그리고 렉서는 "foo > "에서 되돌아 가지 않습니다. 왜냐하면 렉서는 하나의 토큰이 없으므로 (렉서는 소비 한 문자를 포기하지 않습니다)!

이 문제를 처리하려면 렉서가 " > "과 몇 문자가 일치하는지 확인해야합니다. 그 규칙은 skip() 메소드를 호출하기 때문에 당신이 Id 내부의 규칙 SpaceChars을 사용할 수 없습니다

Id 
: IdPart ((Spaces? '>' Spaces? IdPart)=> Spaces? '>' Spaces? IdPart)* 
; 

SpaceChars 
: (Spaces | '\r' | '\n') {skip();} 
; 

fragment Digit : '0'..'9'; 
fragment Letter : 'a'..'z' | 'A'..'Z'; 
fragment Spaces : (' ' | '\t')+; 
fragment IdPart : Letter (Letter | Digit)*; 

참고 : 당신은 구문 술어합니다 ((...)=> 부분)를 사용하는 것을 할 수 있습니다.

+0

감사합니다. 약간 혼란 스럽지만 조금만 혼란 스럽습니다. – Sebastian

+0

@Sebastian을 환영합니다. –