2017-11-26 29 views
0

저는 lexer 및 parser 문법을 연구하고 .g4 파일을 기반으로 파서 및 렉서를 작성하기 위해 ANTLR을 사용하고 있습니다. 그러나, 나는 pushMode와 popMode가 일반적으로하는 일 때문에 꽤 혼란 스럽다.렉서 문법에서 pusMode, popMode, mode, OPEN 및 CLOSE은 무엇을 의미합니까?

OPEN    : '[' -> pushMode(BBCODE) ; 
TEXT    : ~('[')+ ; 

mode BBCODE; 

CLOSE    : ']' -> popMode ; 

OPEN, pushMode, BBCODE, CLOSE 및 popMode는 어휘 사전 그램에서 무엇을 의미합니까? 나는이 모드들을 탐색하려했지만, 이것들에 대한 명확한 정의와 설명이 없다.

+3

https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md –

+0

I : - 당신이 ANTLR4에 심각한 몰입감을 계획하는 경우

난 강력하게이 책을 읽을 것을 권장합니다 이 링크를 읽으십시오, 그러나 설명은 충분하지 않았습니다. – CoderX

+0

@coderX : 그런 다음 해당 설명서를 읽을 때 발생하는 * 특정 질문 *을하십시오. – rici

답변

2

pushModepopMode이 사용됩니다 그래서 "섬 문법"또는 동일한 파일에 다른 형식을 다루는 허용 어휘 모드를했다.
기본 아이디어는 특정 문자 시퀀스를 볼 때 모드간에 렉서 스위치를 앞뒤로 전환하는 것입니다. 그것은 디폴트 문법으로 전환한다 ] 만나면 문법 예의

렉서는 (어떤 mode <name> 외부에서 정의 즉 문법)는 디폴트 문법 전환한다 [ 발생
CLOSE : ']' -> popMode ; mode BBCODE; 사이 정의 문법.

섬 문법의 예는 자바 클래스 소스 파일 내의 javadoc 태그입니다.

이론적으로 어휘 모드는 HTML 내부에서 javascript를 구문 분석하는 데 사용될 수도 있습니다.
즉 기본 문법은 HTML을 정의하고 <script ... 태그를 만나면 -> pushMode(javascript)으로 자바 스크립트 문법으로 전환 할 수 있습니다.
</script> 태그를 만나면 popMode이 "기본"HTML 문법으로 돌아갑니다.

OPEN하고 예 CLOSE

대신 당신이 CLOSE를 작성하는 것 ']' -> popMode를 작성 가독성을 향상시키기 위해 파서 문법에 사용할 수 ']''[' 단지 어휘 규칙 이름입니다. The Definitive ANTLR 4 Reference by Terence Parr