ANTLR

ANTLR
Basisdaten

Entwickler Terence Parr
Aktuelle Version 4.13.2[1]
(3. August 2024)
Programmier­sprache Java
Lizenz BSD
www.antlr.org

ANTLR (sprich Antler) ist ein objektorientierter Parsergenerator, der seit 1989 von Terence Parr an der Universität von San Francisco entwickelt wird. Die Abkürzung ANTLR steht für ANother Tool for Language Recognition.[2]

Beschreibung

ANTLR unterstützt die Erzeugung von Parsern, Lexern und TreeParsern für LL(k)-Grammatiken mit beliebigen k. Die verwendete Eingabe-Sprache ist eine Mischung aus formaler Grammatik und Elementen aus objektorientierten Sprachen (Beispiel siehe unten).

Der Übersetzer selbst ist eine Java-Applikation, als freie Software verfügbar und auf der Java-Plattform lauffähig. Eine ältere Version von ANTLR (3.1.x) wurde auch nach C# portiert und ist somit unter .Net-Framework und Mono lauffähig.

ANTLR3 unterstützt als Zielsprachen u. a. ActionScript, Ada95, C, C++, C#, Java, JavaScript, Objective-C und Python.[3][4] Mit dem Erscheinen von ANTLR4 mussten alle Laufzeitbibliotheken neu geschrieben werden, da die gesamte Parselogik in die Laufzeitumgebung verlagert wurde. Es gibt nun Laufzeitpakete für Java, C#, Python 2/3, JavaScript, Go, C++, Swift und PHP.[5] Weitere Sprachen, wie Kotlin und Rust sind in Planung/Arbeit.

Die Laufzeitumgebung stellt hierbei sämtliche Klassen und Funktionen bereit, die zur Kompilierung der generierten Parser und Lexer Dateien benötigt werden. Mit ANTLR3 können während des Parseprozesses abstrakte Syntaxbäume automatisch erstellt werden (zusammen mit einem entsprechende TreeParser). Dies änderte sich mit ANTLR4, wo nun statt dem AST ein Parse Tree (Syntax Tree) generiert wird. Statt eines Tree Parsers werden nun Listener + Visitor Klassen produziert, die es erlauben den Parse Tree auf vielfältige Weise zu durchlaufen.[5]

Beispiel

Im folgenden Beispiel wird ein Parser in ANTLR3 beschrieben, der Summenausdrücke in der Form "1+2+3" erkennen kann:

 // allgemeine Optionen, zum Beispiel die Zielsprache
 options
 {
  language = "CSharp";
 }
 // es folgt der Parser
 class SumParser extends Parser;
 options
 {
   k = 1; ''// Parser-[[Lookahead]]: 1 [[Token (Compilerbau)|Token]]''
 }
 // Definition eines Ausdrucks
 statement : INTEGER (PLUS^ INTEGER)*;
 // hier der Lexer
 class SumLexer extends Lexer;
 options
 {
   k = 1; ''// Lexer-[[Lookahead]]: 1 Zeichen''
 }
 PLUS    : '+';
 DIGIT   : ('0'..'9');
 INTEGER : (DIGIT)+;

Das folgende Listing demonstriert den Aufruf des Parsers in einem Programm:

 TextReader reader;
 // (...) Textreader mit Zeichen füllen
 SumLexer lexer = new SumLexer(reader);
 SumParser parser = new SumParser(lexer);
 parser.expression();

Siehe auch

Literatur

  • Terence Parr: The Definitive ANTLR Reference Guide: Building Domain-Specific Languages. 1. Auflage. The Pragmatic Programmers, 2007, ISBN 978-0-9787392-5-6 (englisch).
  • Terence Parr: The Definitive ANTLR 4 Reference. The Pragmatic Programmers, 2013, ISBN 978-1-934356-99-9 (englisch).

Einzelnachweise

  1. Release 4.13.2. 3. August 2024 (abgerufen am 20. August 2024).
  2. Terence Parr: The Definitive ANTLR Reference. Building Domain-Specific Languages. The Pragmatic Bookshelf, 2007, ISBN 0-9787392-5-6, Preface, S. 15 (amerikanisches Englisch).
  3. ANTLR v3 documentation - Code Generation Targets
  4. Download ANTLR. Abgerufen am 30. Januar 2020.
  5. a b antlr/antlr4. Abgerufen am 30. Januar 2020 (englisch).