ANTLR

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

ANTLR(ANother Tool for Language Recognition)은 언어의 문법을 입력으로 받아 해당 언어의 인식기를 생성하는 도구이다. ANTLR은 렉서, 파서, 트리 파서를 생성할 수 있으며, 확장 바커스-나우르 표기법(EBNF)을 사용하여 문맥 자유 문법을 지정한다. ANTLR 3은 다양한 프로그래밍 언어의 코드 생성을 지원했고, ANTLR 4는 C#, C++, Dart, Java, 자바스크립트, Go, PHP, 파이썬, Swift 등을 지원한다. ANTLR은 BSD 라이선스로 배포되며, 다양한 IDE에서 플러그인을 통해 지원된다. ANTLR을 활용한 프로젝트로는 Groovy, Jython, Hibernate 등이 있으며, 깃허브에는 ANTLR 4로 구현된 다양한 문법들이 존재한다.

ANTLR - [IT 관련 정보]에 관한 문서
ANTLR 개요
name: ANTLR
logo:
screenshot:
종류파서 생성기
개발자Terence Parr
Sam Harwell
Eric Vergnaud
최초 릴리스1992년 4월 10일
최신 버전4.13.2
최신 버전 출시일2024년 8월 3일
상태개발 중
프로그래밍 언어자바
플랫폼크로스 플랫폼
라이선스BSD 라이선스
웹사이트www.antlr.org
📚 더 읽어볼만한 페이지
  • 구문 분석기 - GNU bison
    GNU Bison은 Yacc와 호환되면서 재진입성, 다양한 언어 코드 생성, 자동 반례 생성 등의 기능을 제공하는 파서 생성기로, 여러 프로젝트에서 Yacc를 대체하여 널리 사용되고 있으며, Bison으로 생성된 코드는 GPL과 호환되는 라이선스로 배포 가능하다.
  • 구문 분석기 - Yacc
    Yacc은 주어진 문법 규칙에 따라 C 언어 파서를 생성하는 도구로, 컴파일러 개발에 널리 사용되어 다양한 언어 구현에 활용되었으며, Lex와 함께 어휘 및 구문 분석을 수행하며 여러 파생 버전으로 현재까지 활용되고 있다.
  • 퍼블릭 도메인 소프트웨어 - 미스터리 하우스
    미스터리 하우스는 1980년 출시된 어드벤처 게임으로, 그래픽을 도입하여 혁신을 시도했으며, 버려진 저택에서 단서를 찾아 살인자를 밝혀내는 내용을 담고 있다.
  • 퍼블릭 도메인 소프트웨어 - 월드와이드웹
    월드와이드웹은 팀 버너스리가 개발한 최초의 웹 브라우저이며, 1993년 CERN이 소스 코드를 공개하여 웹 기술 발전에 기여했다.
  • BSD 라이선스 소프트웨어 - V8 (자바스크립트 엔진)
    V8은 구글이 개발한 오픈 소스 자바스크립트 엔진으로, 자바스크립트 코드 실행 속도 향상을 위해 여러 컴파일러를 거쳐 크롬, 노드.js 등에서 활용된다.
  • BSD 라이선스 소프트웨어 - VP9
    VP9는 구글이 개발한 오픈 소스 비디오 코덱으로, VP8보다 압축 효율을 높이고 HEVC보다 나은 성능을 목표로 개발되었으며, WebM 형식으로 사용되고 주요 웹 브라우저와 넷플릭스, 유튜브 등에서 지원했으나 AV1의 등장으로 개발이 중단되었다.

2. 사용법

ANTLR은 언어를 지정하는 문법을 입력으로 받아 해당 언어의 인식기에 대한 소스 코드를 출력으로 생성한다.

3 버전은 프로그래밍 언어 Ada95, ActionScript, C, C#, Java, 자바스크립트, Objective-C, Perl, Python, Ruby, Standard ML로 코드 생성을 지원했지만, 현재 4 버전은 C#, C++, Dart, Java, 자바스크립트, Go, PHP, 파이썬 (2 및 3), Swift를 대상으로 한다.

언어는 확장 바커스-나우르 표기법 (EBNF)을 사용하여 표현된 문맥 자유 문법을 사용하여 지정된다. ANTLR은 렉서, 파서, 트리 파서, 그리고 결합된 렉서-파서를 생성할 수 있다. 파서는 파스 트리 또는 추상 구문 트리를 자동으로 생성할 수 있으며, 이를 트리 파서로 추가 처리할 수 있다. ANTLR은 렉서, 파서, 트리 파서를 지정하기 위한 단일 일관된 표기법을 제공한다.

기본적으로 ANTLR은 문법을 읽고 해당 문법에 의해 정의된 언어에 대한 인식기를 생성한다 (즉, 입력 스트림을 읽고 입력 스트림이 문법에 의해 지정된 구문에 부합하지 않으면 오류를 생성하는 프로그램). 구문 오류가 없으면 기본 동작은 어떤 메시지도 출력하지 않고 단순히 종료되는 것이다. 언어로 유용한 작업을 수행하려면 문법의 문법 요소에 액션을 첨부할 수 있다. 이러한 액션은 인식기가 생성되는 프로그래밍 언어로 작성된다. 인식기가 생성될 때, 액션은 적절한 지점에서 인식기의 소스 코드에 포함된다. 액션은 컴파일러의 경우, 심볼 테이블을 구축하고 확인하며 대상 언어로 명령어를 내보내는 데 사용될 수 있다.

렉서 및 파서 외에도 ANTLR은 트리 파서를 생성하는 데 사용될 수 있다. 이는 파서에 의해 자동으로 생성될 수 있는 추상 구문 트리를 처리하는 인식기이다. 이러한 트리 파서는 ANTLR에 고유하며 추상 구문 트리 처리를 돕는다.

3. 라이선스

ANTLR 3와 ANTLR 4는 자유 소프트웨어이며, 세 조항 BSD 라이선스로 배포된다. 이전 버전은 퍼블릭 도메인 소프트웨어로 출시되었다. Parr의 저서 『The Definitive ANTLR 4 Reference』에서 파생된 문서는 BSD 라이선스 ANTLR 4 소스에 포함되어 있다.

이클립스 IDE를 위한 다양한 플러그인이 개발되어 ANTLR 문법을 지원하는데, 여기에는 ANTLR 스튜디오와 같은 독점 소프트웨어 제품뿐만 아니라 SourceForge에서 호스팅되는 이클립스용 "ANTLR 2" 및 "ANTLR 3" 플러그인도 있다.

4. ANTLR 4

ANTLR 4는 직접적인 좌재귀는 올바르게 처리하지만, 일반적인 좌재귀, 즉 문법 규칙 xy를 참조하고 y가 다시 x를 참조하는 경우에는 처리하지 못한다.

==== 개발 환경 ====
ANTLR 프로젝트의 도구 페이지에 따르면, 구문 강조, 구문 오류 검사, 코드 완성 기능 등을 가능하게 하는 플러그인이 가장 일반적인 IDE (IntelliJ IDEA, NetBeans, 이클립스, 비주얼 스튜디오비주얼 스튜디오 코드)에서 자유롭게 사용할 수 있다.

IntelliJ IDEA, 이클립스, 넷빈즈, 마이크로소프트 비주얼 스튜디오용 ANTLR 문법을 지원하는 플러그인이 몇 가지 존재한다. 상용 제품으로는 ANTLR Studio for Eclipse와 ANTLR 4 IDE 등이 있다.

4.1. 개발 환경

ANTLR 프로젝트의 도구 페이지에 따르면, 구문 강조, 구문 오류 검사, 코드 완성 기능 등을 가능하게 하는 플러그인이 가장 일반적인 IDE (IntelliJ IDEA, NetBeans, 이클립스, 비주얼 스튜디오비주얼 스튜디오 코드)에서 자유롭게 사용할 수 있다.

IntelliJ IDEA, 이클립스, 넷빈즈, 마이크로소프트 비주얼 스튜디오용 ANTLR 문법을 지원하는 플러그인이 몇 가지 존재한다. 상용 제품으로는 ANTLR Studio for Eclipse와 ANTLR 4 IDE 등이 있다.

5. ANTLR 활용 프로젝트

ANTLR을 사용하여 제작된 소프트웨어는 다음과 같다.

* Groovy
* Jython
* Hibernate
* ANTLR로 작성된 문법을 기반으로 하는 javac 컴파일러의 OpenJDK 컴파일러 문법 프로젝트 실험적 버전
* Apex, 세일즈포스닷컴(Salesforce.com)의 프로그래밍 언어
* Numbers, 애플(Apple Inc.)의 스프레드시트의 표현식 평가기
* 트위터(Twitter)의 검색 쿼리 언어
* Weblogic 서버
* 아파치 카산드라(Apache Cassandra)
* Processing
* JabRef
* 트리노 (SQL 쿼리 엔진)
* 프레스토 (SQL 쿼리 엔진)
* MySQL Workbench

ANTLR 4로 구현된 200개 이상의 문법이 깃허브(GitHub)에 있다. 이들은 URL에 대한 문법에서 C, Java 및 Go와 같은 전체 언어에 대한 문법에 이르기까지 다양하다.

6. 예제

ANTLR의 파서는 "1 + 2 + 3"과 같은 식의 합을 파싱할 수 있다.

```antlr
// Common options, for example, the target language
options
{
language = "CSharp";
}
// Followed by the parser
class SumParser extends Parser;
options
{
k = 1; // Parser Lookahead: 1 Token
}
// Definition of an expression
statement: INTEGER (PLUS^ INTEGER)*;
// Here is the Lexer
class SumLexer extends Lexer;
options
{
k = 1; // Lexer Lookahead: 1 characters
}
PLUS: '+';
DIGIT: ('0'..'9');
INTEGER: (DIGIT)+;
```

프로그램 내에서 파서를 호출하는 예시는 다음과 같다.

```java
TextReader reader;
// (...) Fill TextReader with character
SumLexer lexer = new SumLexer(reader);
SumParser parser = new SumParser(lexer);

parser.expression();
```
위 코드는 프로그램에서 파서를 호출하는 방법을 보여준다. `SumLexer`는 `TextReader`에 입력된 문자를 기반으로 렉서를 생성한다. `SumParser`는 생성된 렉서를 기반으로 파서를 생성한다. 그리고 `parser.statement()`를 호출하여 파싱을 시작한다.

```java
TextReader reader;
// (...) TextReader를 문자로 채우기
SumLexer lexer = new SumLexer(reader);
SumParser parser = new SumParser(lexer);

parser.statement();
```
위 코드는 프로그램에서 파서를 호출하는 방법을 보여준다. `SumLexer`는 `TextReader`에 입력된 문자를 기반으로 렉서를 생성한다. `SumParser`는 생성된 렉서를 기반으로 파서를 생성한다. 그리고 `parser.statement()`를 호출하여 파싱을 시작한다.

```antlr
// 일반적인 옵션, 예를 들어 대상 언어
options
{
language = "CSharp";
}
// 파서 다음에 옵션
class SumParser extends Parser;
options
{
k = 1; // 파서 룩어헤드: 1 토큰
}
// 표현식의 정의
statement: INTEGER (PLUS^ INTEGER)*;
// 여기는 렉서
class SumLexer extends Lexer;
options
{
k = 1; // 렉서 룩어헤드: 1 문자
}
PLUS: '+';
DIGIT: ('0'..'9');
INTEGER: (DIGIT)+;
```
위의 ANTLR 문법은 "1 + 2 + 3" 형태의 표현식 합계를 파싱하기 위한 것이다.

6.1. ANTLR 문법 예제

ANTLR의 파서는 "1 + 2 + 3"과 같은 식의 합을 파싱할 수 있다.

```antlr
// Common options, for example, the target language
options
{
language = "CSharp";
}
// Followed by the parser
class SumParser extends Parser;
options
{
k = 1; // Parser Lookahead: 1 Token
}
// Definition of an expression
statement: INTEGER (PLUS^ INTEGER)*;
// Here is the Lexer
class SumLexer extends Lexer;
options
{
k = 1; // Lexer Lookahead: 1 characters
}
PLUS: '+';
DIGIT: ('0'..'9');
INTEGER: (DIGIT)+;
```

프로그램 내에서 파서를 호출하는 예시는 다음과 같다.

```java
TextReader reader;
// (...) Fill TextReader with character
SumLexer lexer = new SumLexer(reader);
SumParser parser = new SumParser(lexer);

parser.expression();

6.2. 파서 호출 예제 (Java)

java
TextReader reader;
// (...) TextReader를 문자로 채우기
SumLexer lexer = new SumLexer(reader);
SumParser parser = new SumParser(lexer);

parser.statement();
```
위 코드는 프로그램에서 파서를 호출하는 방법을 보여준다. `SumLexer`는 `TextReader`에 입력된 문자를 기반으로 렉서를 생성한다. `SumParser`는 생성된 렉서를 기반으로 파서를 생성한다. 그리고 `parser.statement()`를 호출하여 파싱을 시작한다.
```antlr
// 일반적인 옵션, 예를 들어 대상 언어
options
{
language = "CSharp";
}
// 파서 다음에 옵션
class SumParser extends Parser;
options
{
k = 1; // 파서 룩어헤드: 1 토큰
}
// 표현식의 정의
statement: INTEGER (PLUS^ INTEGER)*;
// 여기는 렉서
class SumLexer extends Lexer;
options
{
k = 1; // 렉서 룩어헤드: 1 문자
}
PLUS: '+';
DIGIT: ('0'..'9');
INTEGER: (DIGIT)+;
```
위의 ANTLR 문법은 "1 + 2 + 3" 형태의 표현식 합계를 파싱하기 위한 것이다.

7. 이론적 배경

* [http://www.antlr.org/papers/LL-star-PLDI11.pdf LL(*): The Foundation of the ANTLR Parser Generator]
* [http://www.antlr.org/article/1055550346383/antlr.pdf ANTLR: A Predicated-LL(k) Parser Generator]
등을 참고하면 된다.

8. 참고 문헌

테렌스 파는 2007년 5월 17일에 "The Definitive Antlr Reference: Building Domain-Specific Languages" (ISBN 978-0-9787392-5-6)를 출판했으며, 이 책은 376쪽 분량으로 Pragmatic Bookshelf에서 출판되었다. 또한, 테렌스 파는 2009년 12월에 "Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages" (ISBN 978-1-934356-45-6)를 출판했으며, 이 책은 374쪽 분량으로 Pragmatic Bookshelf에서 출판되었다. 2013년 1월 15일에는 "The Definitive ANTLR 4 Reference" (ISBN 978-1-93435-699-9)를 출판했으며, 328쪽 분량으로 Pragmatic Bookshelf에서 출판되었다.