ANTLR

ANTLR

ANTLR (z ang. ANother Tool for Language Recognition) to narzędzie, które wspiera proces tworzenia kompilatorów oraz translatorów na podstawie opisu gramatyki z akcjami w językach takich jak Java, C++, C# czy Python. Jego twórcą jest Terence Parr, który obecnie pracuje na Uniwersytecie w San Francisco.

W odróżnieniu od narzędzi takich jak Bison czy SableCC, ANTLR generuje parsery typu LL(*). Dzięki temu formalny opis analizatora składniowego oraz leksykalnego jest bardzo podobny, a wygenerowany kod cechuje się dużą czytelnością.

Domyślnie ANTLR tworzy lekser i parser w języku Java, a plik z gramatyką posiada rozszerzenie .g.

Historia

ANTLR jest kontynuacją idei zawartych w PCCTS (także stworzonym przez Terence’a Parra), który umożliwia generację parserów i lekserów dla języków C oraz C++. 17 maja 2007 roku opublikowano nową wersję oprogramowania oznaczoną numerem 3.0. Używana jest ona m.in. do tworzenia języka programowania Mantra oraz w implementacji JRuby dla języka Ruby.

Dodatkowe narzędzia

Istnieją dwa rozszerzenia dla Eclipse, które ułatwiają pracę z ANTLR: otwarte ANTLR plugin for Eclipse oraz komercyjne ANTLR Studio, produkowane przez firmę Placid Systems.

Rozwijane jest również niezależne środowisko ANTLRWorks, przeznaczone do pracy z wersją 3 ANTLR.

Przykład

Poniższy przykład, zaczerpnięty z dokumentacji ANTLR, przedstawia implementację prostego kalkulatora.

Analizator leksykalny

class CalcLexer extends Lexer;

WS : (’ ’ | '\t’ | '\n’ | '\r’) { $setType = Token.SKIP; };

LPAREN : '(’ ;

RPAREN : ’)’ ;

STAR : '*’ ;

PLUS : '+’ ;

SEMI : ’;’ ;

INT : (’0′..’9′)+ ;

Analizator składniowy

class CalcParser extends Parser;

options {

buildAST = true;

}

expr : mexpr (PLUS^ mexpr)* SEMI! ;

mexpr : atom (STAR^ atom)* ;

atom : INT ;

Analizator drzewa składni abstrakcyjnej

class CalcTreeWalker extends TreeParser;

expr returns [int r]

{

int a, b;

r = 0;

}

: #(PLUS a=expr b=expr) {r = a+b;}

| #(STAR a=expr b=expr) {r = a*b;}

| i:INT {r = Integer.parseInt(i.getText());}

;

Wywołanie parsera

import java.io.DataInputStream;

import antlr.CommonAST;

class Calc {

public static void main(String[] args) {

try {

CalcLexer lexer = new CalcLexer(new DataInputStream(System.in));

CalcParser parser = new CalcParser(lexer);

// Analiza składniowa

parser.expr();

CommonAST t = (CommonAST)parser.getAST();

CalcTreeWalker walker = new CalcTreeWalker();

// Analiza drzewa składni abstrakcyjnej

// i interpretacja programu

int r = walker.expr(t);

System.out.println(„value is ” + r);

} catch(Exception e) {

System.err.println(„exception: ” + e);

}

}

}

Zobacz też

  • SableCC
  • JavaCC

Linki zewnętrzne