2013-05-10 6 views
7

I ANTLR 4에 대한 다음과 같은 문법이 있습니다ANTLR 4 렉서 토큰

grammar Pattern; 

//parser rules 
parse : string LBRACK CHAR DASH CHAR RBRACK ; 
string : (CHAR | DASH)+ ; 

//lexer rules 
DASH : '-' ; 
LBRACK : '[' ; 
RBRACK : ']' ; 
CHAR : [A-Za-z0-9] ; 

은 내가 다음 문자열을 구문 분석하려고 해요

ab-cd[0-9] 

코드가 ab-cd에를 구문 분석 내 응용 프로그램에서 리터럴 문자열로 처리됩니다 왼쪽. 그런 다음 [0-9]을 문자 집합으로 구문 분석합니다.이 경우에는 임의의 숫자로 변환됩니다. 단순히 토큰으로 취급 될 때 (CHAR | DASH)+을 파서 규칙으로 갖고 싶지 않다는 것을 제외하고는 저의 문법이 저에게 효과적입니다. 차라리 렉서는 STRING 토큰을 생성하고 나에게 다음과 같은 토큰을 줄 것이다 : 대신 내가 다른 예를 살펴 보았다이

"ab" "-" "cd" "[" "0" "-" "9" "]" 

"ab-cd" "[" "0" "-" "9" "]" 

,하지만 그것을 알아낼 수 없었다 . 일반적으로 다른 예제는 문자열 리터럴을 따옴표로 묶어 두거나 공백을 사용하여 입력을 구분합니다. 둘 다 피하고 싶습니다. 이것은 렉서 규칙을 사용하여 수행 할 수 있습니까, 아니면 내가하고있는 것처럼 파서 규칙에서 계속 처리해야합니까?

답변

7

ANTLR 4에서는이 경우 렉서 모드를 사용할 수 있습니다.

STRING : [a-z-]+; 
LBRACK : '[' -> pushMode(CharSet); 

mode CharSet; 

DASH : '-'; 
NUMBER : [0-9]+; 
RBRACK : ']' -> popMode; 

[ 문자를 분석 한 결과, 렉서는 ] 문자 도달하고 popMode 명령이 실행될 때까지 CharSet 모드에서 동작한다.

+0

이 통찰력에 감사드립니다. 이처럼 부제 효과 제를 설정하는 것이 완벽한 해결책처럼 들립니다. '어휘 모드는 렉서 문법에서만 허용됩니다. '라고 말하면서 오류가 발생합니다. 내 문법을'lexer grammar IdPattern; '이라고 선언 할 수는 있지만 파서 규칙을 사용할 수는 없습니다. 내가 뭘 놓치고 있니? – Charles

+1

당신은 당신의 렉서에'렉서 문법 '을 사용할 필요가있을 것이고, 당신의 파서에 대한 별도의 파서 문법 (별도의 파일에)을 사용해야 할 것입니다. –

+0

다음은 다른 사람들을 도울 수있는 링크입니다. http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle