ANTLR

ANTLR (ang. ANother Tool for Language Recognition) to narzędzie służące do tworzenia kompilatorów oraz translatorów z opisu gramatyki zawierającego akcje w języku Java, C++, C# lub Python. Autorem jest Terence Parr, pracujący obecnie na Uniwersytecie w San Francisco.

W przeciwieństwie do narzędzi takich jak Bison czy SableCC, ANTLR generuje parser typu LL(*). Z tego powodu formalny opis analizatora składniowego oraz leksera jest bardzo podobny, a generowany kod jest czytelny.

Domyślnie ANTLR generuje lekser i parser w Javie, a plik z gramatyką ma rozszerzenie .g

Historia

ANTLR jest rozwinięciem idei zawartych w PCCTS (również autorstwa Terence Parra), który umożliwia generowanie parserów i lekserów dla języka C i C++. 17 maja 2007 została opublikowana nowa wersja oprogramowania oznaczona numerem 3.0. Jest ona wykorzystywana między innymi do tworzenia języka programowania Mantra oraz w implementacji JRuby języka Ruby.

Dodatkowe narzędzia

Istnieją dwa rozszerzenia dla Eclipse ułatwiające prace z ANTLR: otwarte ANTLR plugin for Eclipse oraz komercyjne ANTLR Studio produkowane przez firmę Placid Systems.

Rozwijane jest także niezależne środowisko ANTLRWorks przeznaczone do pracy z ANTLR w wersji 3.

Przykład

Poniższy przykład, pochodzący z dokumentacji ANTLR, zawiera 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ż

Linki zewnętrzne

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.