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" "]"
,하지만 그것을 알아낼 수 없었다 . 일반적으로 다른 예제는 문자열 리터럴을 따옴표로 묶어 두거나 공백을 사용하여 입력을 구분합니다. 둘 다 피하고 싶습니다. 이것은 렉서 규칙을 사용하여 수행 할 수 있습니까, 아니면 내가하고있는 것처럼 파서 규칙에서 계속 처리해야합니까?
이 통찰력에 감사드립니다. 이처럼 부제 효과 제를 설정하는 것이 완벽한 해결책처럼 들립니다. '어휘 모드는 렉서 문법에서만 허용됩니다. '라고 말하면서 오류가 발생합니다. 내 문법을'lexer grammar IdPattern; '이라고 선언 할 수는 있지만 파서 규칙을 사용할 수는 없습니다. 내가 뭘 놓치고 있니? – Charles
당신은 당신의 렉서에'렉서 문법 '을 사용할 필요가있을 것이고, 당신의 파서에 대한 별도의 파서 문법 (별도의 파일에)을 사용해야 할 것입니다. –
다음은 다른 사람들을 도울 수있는 링크입니다. http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle