ANTLR 란
구문 분석을 위해 LL(*) 문법을 사용하는 Parser generator 이다. (Parser 가 아님에 주의, Parser 생성 도구)
ANTLR 를 통해 문법을 Java로 파싱, 렉싱을 한다.
/* Lexer - 어휘 분석을 한다. 분석하고자 하는 텍스트에서 의미가 있는 단어를 찾으면 token으로 만들어 주는 역할 */
/* Parser - 토큰화된 데이터를 가지고 구조적으로 나타내는 역할 */
ANTLR?(AnotherToolForLanguageRecognition)
– 구문 분석 (Syntax Analysis)을 위해 LL(*) 문법을 사용하는 Parser Generator (Parser 가 아님에 주의, Parser 생성 도구)
LL 파서(LL parser)는 문맥 자유문법의 일부를 파싱할 수 있는 하향식 파서이다. LL 파서는 입력 문자열의 왼쪽(Left)에서부터 파싱을 시작하여, 좌측유도(Leftmost derivation) 방식으로 동작한다. LL 파서로 파싱이 가능한 문법은 LL 문법이라고 부른다.
만약 LL 파서가 lookahead에 최대 k개의 토큰(token)을 사용한다면, 그 파서는 LL(k) 파서라고 부른다. LL(k) 파서로 파싱이 가능한 문법은 LL(k) 문법이라고 부른다.
우리가 사용하는 인텔리제이에서 이 ANTLR 를 설치할 수 있다.
File-> Setting->Plugin 으로 들어가서 ANTLR 를 검색해서 설치할 수 있다.
그 후 프로젝트를 생성한 후
src 폴더 및에 .g4파일을 생성하면 (Grammar 파일)을 생성할 수 있다.
토큰은 대문자로 시작해야 하고 파서는 소문자로 시작해야 한다. 여기서는
INT, ID, NEWLINE, WS 가 토큰이되고, 파서는 prog, stat, expr, nullExpr, atom 같은 것을 말한다.
일단은 가볍게 눈에만 익혀보자.
만약 알파벳이 한개 이상 등장하면 ID 토큰/ 숫자가 1개이상 등장하면 INT 토큰 / 이스케이프문자 \r 은 존재할 수도 존재하지 않을 수도 있고 \n 개행되면 NEWLINE 이다.
해당 파일을 우클릭해서
Generate ANTLR 실행하면 input 에 대한 parse tree 를 확인할 수 있다.
인풋으로는
2+3
x = 1 + 2 * 3 + (a) 를 작성하였다.
파스트리를 살펴보면,
INT : 2 / (expr : +) / INT:3 / NEWLINE:\n / ID: x / = / INT: 1 / (expr: +) / INT : 2 / (multExpr: *) / INT:3 / (expr:+) / (atom: '(') / ID:a / (atom: ')')
로 파싱한다는 것을 알 수 있다.
다음 실습에서 더 자세히 공부해보자
'컴파일러개론' 카테고리의 다른 글
[컴파일러개론 2] 구문분석 (0) | 2023.09.12 |
---|---|
[컴파일러개론 1] 어휘분석 (0) | 2023.09.12 |