ANTLR
"오늘의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로 구현된 다양한 문법들이 존재한다.
더 읽어볼만한 페이지
- 구문 분석기 - GNU bison
GNU Bison은 Yacc와 호환되면서 재진입성, 다양한 언어 코드 생성, 자동 반례 생성 등의 기능을 제공하는 파서 생성기로, 여러 프로젝트에서 Yacc를 대체하여 널리 사용되고 있으며, Bison으로 생성된 코드는 GPL과 호환되는 라이선스로 배포 가능하다. - 구문 분석기 - Yacc
Yacc은 주어진 문법 규칙에 따라 C 언어 파서를 생성하는 도구로, 컴파일러 개발에 널리 사용되어 다양한 언어 구현에 활용되었으며, Lex와 함께 어휘 및 구문 분석을 수행하며 여러 파생 버전으로 현재까지 활용되고 있다. - 퍼블릭 도메인 소프트웨어 - 미스터리 하우스
미스터리 하우스는 1980년 출시된 어드벤처 게임으로, 그래픽을 도입하여 혁신을 시도했으며, 버려진 저택에서 단서를 찾아 살인자를 밝혀내는 내용을 담고 있다. - 퍼블릭 도메인 소프트웨어 - 월드와이드웹
월드와이드웹은 팀 버너스리가 개발한 최초의 웹 브라우저이며, 1993년 CERN이 소스 코드를 공개하여 웹 기술 발전에 기여했다. - 1992년 소프트웨어 - 윈도우 3.1x
윈도우 3.1x는 마이크로소프트가 개발한 운영 체제 시리즈로, 윈도우 3.1을 시작으로 다양한 버전이 출시되었으며, 1,000만 개 이상 판매되었고, 간체자 지원, 업무용 버전, 다양한 추가 기능, 인터넷 익스플로러 지원 등의 특징을 가진다. - 1992년 소프트웨어 - 마이크로소프트 액세스
마이크로소프트 액세스는 1992년 출시된 데이터베이스 관리 시스템으로, 테이블, 쿼리, 폼 등을 생성하고 VBA를 통해 솔루션을 개발하며, 윈도우에서 사용 가능하고 다양한 데이터 형식과 통합된다.
ANTLR - [IT 관련 정보]에 관한 문서 | |
---|---|
ANTLR 개요 | |
종류 | 파서 생성기 |
개발자 | Terence Parr Sam Harwell Eric Vergnaud |
최초 릴리스 | 1992년 4월 10일 |
최신 버전 | 4.13.2 |
최신 버전 출시일 | 2024년 8월 3일 |
상태 | 개발 중 |
프로그래밍 언어 | 자바 |
플랫폼 | 크로스 플랫폼 |
라이선스 | BSD 라이선스 |
웹사이트 | www.antlr.org |
2. 사용법
ANTLR은 언어를 지정하는 문법을 입력으로 받아 해당 언어의 인식기에 대한 소스 코드를 출력으로 생성한다.
ANTLR 3와 ANTLR 4는 자유 소프트웨어이며, 세 조항 BSD 라이선스로 배포된다.[7] 이전 버전은 퍼블릭 도메인 소프트웨어로 출시되었다.[8] Parr의 저서 『The Definitive ANTLR 4 Reference』에서 파생된 문서는 BSD 라이선스 ANTLR 4 소스에 포함되어 있다.[7][9]
ANTLR 4는 직접적인 좌재귀는 올바르게 처리하지만, 일반적인 좌재귀, 즉 문법 규칙 ''x''가 ''y''를 참조하고 ''y''가 다시 ''x''를 참조하는 경우에는 처리하지 못한다.[12]
3 버전은 프로그래밍 언어 Ada95, ActionScript, C, C#, Java, 자바스크립트, Objective-C, Perl, Python, Ruby, Standard ML로 코드 생성을 지원했지만,[3] 현재 4 버전은 C#, C++, Dart,[4][5] Java, 자바스크립트, Go, PHP, 파이썬 (2 및 3), Swift를 대상으로 한다.
언어는 확장 바커스-나우르 표기법 (EBNF)을 사용하여 표현된 문맥 자유 문법을 사용하여 지정된다.[6] ANTLR은 렉서, 파서, 트리 파서, 그리고 결합된 렉서-파서를 생성할 수 있다. 파서는 파스 트리 또는 추상 구문 트리를 자동으로 생성할 수 있으며, 이를 트리 파서로 추가 처리할 수 있다. ANTLR은 렉서, 파서, 트리 파서를 지정하기 위한 단일 일관된 표기법을 제공한다.
기본적으로 ANTLR은 문법을 읽고 해당 문법에 의해 정의된 언어에 대한 인식기를 생성한다 (즉, 입력 스트림을 읽고 입력 스트림이 문법에 의해 지정된 구문에 부합하지 않으면 오류를 생성하는 프로그램). 구문 오류가 없으면 기본 동작은 어떤 메시지도 출력하지 않고 단순히 종료되는 것이다. 언어로 유용한 작업을 수행하려면 문법의 문법 요소에 액션을 첨부할 수 있다. 이러한 액션은 인식기가 생성되는 프로그래밍 언어로 작성된다. 인식기가 생성될 때, 액션은 적절한 지점에서 인식기의 소스 코드에 포함된다. 액션은 컴파일러의 경우, 심볼 테이블을 구축하고 확인하며 대상 언어로 명령어를 내보내는 데 사용될 수 있다.[6]
렉서 및 파서 외에도 ANTLR은 트리 파서를 생성하는 데 사용될 수 있다. 이는 파서에 의해 자동으로 생성될 수 있는 추상 구문 트리를 처리하는 인식기이다. 이러한 트리 파서는 ANTLR에 고유하며 추상 구문 트리 처리를 돕는다.[6]
3. 라이선스
이클립스 IDE를 위한 다양한 플러그인이 개발되어 ANTLR 문법을 지원하는데, 여기에는 ANTLR 스튜디오와 같은 독점 소프트웨어 제품뿐만 아니라 SourceForge에서 호스팅되는 이클립스용 "ANTLR 2"[10] 및 "ANTLR 3"[11] 플러그인도 있다.
4. ANTLR 4
==== 개발 환경 ====
ANTLR 프로젝트의 도구 페이지에 따르면, 구문 강조, 구문 오류 검사, 코드 완성 기능 등을 가능하게 하는 플러그인이 가장 일반적인 IDE (IntelliJ IDEA, NetBeans, 이클립스, 비주얼 스튜디오[14] 및 비주얼 스튜디오 코드)에서 자유롭게 사용할 수 있다.[13]
IntelliJ IDEA, 이클립스, 넷빈즈, 마이크로소프트 비주얼 스튜디오용 ANTLR 문법을 지원하는 플러그인이 몇 가지 존재한다. 상용 제품으로는 ANTLR Studio for Eclipse와 ANTLR 4 IDE 등이 있다.
4. 1. 개발 환경
ANTLR 프로젝트의 도구 페이지에 따르면, 구문 강조, 구문 오류 검사, 코드 완성 기능 등을 가능하게 하는 플러그인이 가장 일반적인 IDE (IntelliJ IDEA, NetBeans, 이클립스, 비주얼 스튜디오[14] 및 비주얼 스튜디오 코드)에서 자유롭게 사용할 수 있다.[13]
IntelliJ IDEA, 이클립스, 넷빈즈, 마이크로소프트 비주얼 스튜디오용 ANTLR 문법을 지원하는 플러그인이 몇 가지 존재한다. 상용 제품으로는 ANTLR Studio for Eclipse와 ANTLR 4 IDE 등이 있다.
5. ANTLR 활용 프로젝트
ANTLR을 사용하여 제작된 소프트웨어는 다음과 같다.
- Groovy[15]
- Jython[16]
- Hibernate[17]
- ANTLR로 작성된 문법을 기반으로 하는 javac 컴파일러의 OpenJDK 컴파일러 문법 프로젝트 실험적 버전[18]
- Apex, 세일즈포스닷컴(Salesforce.com)의 프로그래밍 언어
- Numbers, 애플(Apple Inc.)의 스프레드시트의 표현식 평가기
- 트위터(Twitter)의 검색 쿼리 언어[19]
- Weblogic 서버
- 아파치 카산드라(Apache Cassandra)
- Processing
- JabRef
- 트리노 (SQL 쿼리 엔진)
- 프레스토 (SQL 쿼리 엔진)
- MySQL Workbench
ANTLR 4로 구현된 200개 이상의 문법이 깃허브(GitHub)에 있다.[20] 이들은 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)
javaTextReader 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에서 출판되었다.
참조
[1]
웹사이트
Comp.compilers: Purdue Compiler-Construction Tool Set 1.00 available
https://compilers.ie[...]
1992-04-10
[2]
웹사이트
Comp.compilers: More on PCCTS
https://compilers.ie[...]
1992-04-30
[3]
문서
SML/NJ Language Processing Tools: User Guide
http://www.classes.c[...]
[4]
웹사이트
Runtime Libraries and Code Generation Targets
https://github.com/a[...]
2022-01-06
[5]
웹사이트
The ANTLR4 C++ runtime reached home – Soft Gems
https://soft-gems.ne[...]
2016-11-16
[6]
서적
The Definitive ANTLR 4 Reference
https://books.google[...]
Pragmatic Bookshelf
2013-01-15
[7]
웹사이트
antlr4/LICENSE.txt
https://github.com/a[...]
2017-03-30
[8]
간행물
licensing stuff
http://www.antlr.org[...]
2004-02-05
[9]
웹사이트
ANTLR 4 Documentation
https://github.com/a[...]
2017-03-30
[10]
웹사이트
ANTLR plugin for Eclipse
http://antlreclipse.[...]
[11]
웹사이트
ANTLR IDE. An eclipse plugin for ANTLR grammars
http://antlrv3ide.so[...]
[12]
문서
What is the difference between ANTLR 3 & 4
https://github.com/a[...]
[13]
웹사이트
ANTLR Development Tools
http://www.antlr.org[...]
[14]
웹사이트
ANTLR Language Support - Visual Studio Marketplace
https://marketplace.[...]
[15]
웹사이트
GroovyRecognizer (Groovy 2.4.0)
http://docs.groovy-l[...]
[16]
웹사이트
Jython: 31d97f0de5fe
https://hg.python.or[...]
[17]
웹사이트
Hibernate ORM 6.0.0.Alpha1 released
https://in.relation.[...]
2018-12-06
[18]
웹사이트
OpenJDK: Compiler Grammar
https://openjdk.java[...]
[19]
웹사이트
ANTLR Testimonials
https://www.antlr.or[...]
2024-10-30
[20]
Citation
Grammars written for ANTLR v4; expectation that the grammars are free of actions.: antlr/grammars-v4
https://github.com/a[...]
Antlr Project
2019-09-25
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com