انتلر

**انتلر** (زبان انگلیسی: ANTLR) یک ابزار مولد پارسر است که برای خواندن، پردازش، اجرا یا ترجمه متون ساختار یافته یا فایل‌ها باینری به کار می‌رود. این نرم‌افزار در ابتدا توسط ترنس پر از دانشگاه سانفرانسیسکو به وجود آمد و همچنان در حال توسعه است. انتلر در نسخه ۴ام خود از پارسر (*)LL تطبیقی استفاده می‌کند که یک فناوری جدید برای پارس کردن است که اولین بار توسط خود ترنس پر و سم هارول توسعه پیدا کرد. ویژگی جالب نسخه ۴ام انتلر این است که مشکل چپ گردی گرامر را حل می‌کند (مشروط بر اینکه چپ گردی غیر مستقیم نباشد یعنی مثلاً قاعده x به y و y به x ارجاع داشته باشد) بنابراین انتلر با گرامرهای چپ گرد هم مشکلی ندارد.انتلر ورودی را با توجه به گرامری که به آن می‌دهد توسط یک درخت پارس نمایش می دهد که با گردش روی آن می‌توانید تغیرات لازم را روی ورودی ایجاد کنید. انتلر همچنین در نسخه جدید خود گردش‌کننده درخت پارس را در دو قالب شنونده و بازدیدکننده را به صورت خودکار تولید می‌کند.

## کارکرد
نحوهٔ کارکرد انتلر به این صورت است که ابتدا یک گرامر برای زبان مورد نظرمان تعریف می‌کنیم سپس به کمک ابزار انتلر کدی به زبان مورد نظرمان تولید می‌کنیم که به کمک این کد می‌توانیم تغییرات مورد نظرمان را روی ورودی داشته باشیم. نسخه آخر این نرم‌افزار تولید کد به زبان های E Java, C#, C++ JavaScript, Python2, Python3, Swift و Go را پشتیبانی می‌کند.

## پروژه‌های نوشته شده به کمک انتلر
این نرم‌افزار به صورت گسترده‌ای در صنعت و دانشگاه برای ساختن انواع زبان‌ها، ابزارها و چارچوب‌های نرم‌افزاری استفاده شده‌است که نمونه‌های آن را در زیر می‌بینید:
* گرووی
* جایتون
* هایبرنیت
* نرم افزار Numbers شرکت اپل
* زبان جستار یاب توییتر
* اینتلیج آیدیا و CLion از شرکت جت‌برینز
* آپاچی کسندرا
* نرم‌افزار JabRef
* نرم‌افزار Presto

## مثال و راه‌اندازی
ابتدا با دستورها زیر انتلر را دریافت کنید:

```console
$ cd /usr/local/lib
$ curl -O http://www.antlr.org/download/antlr-4.7.1-complete.jar
```

سپس دستور زیر را وارد کنید که انتلر به وسیله جاوا شناسایی شود:

```console
$ export CLASSPATH=".:/usr/local/lib/antlr-4.7.1-complete.jar:$CLASSPATH"
```

در ادامه دستورها زیر را وارد کنید:

```console
$ alias antlr4='java -jar /usr/local/lib/antlr-4.7.1-complete.jar'
$ alias grun='java org.antlr.v4.runtime.misc.TestRig'
```

به عنوان یک مثال ابتدایی گرامر زیر را در نظر بگیرید و نام ان را Grammar.g4 بگذارید.

```antlr
// define a grammar called Hello
grammar Hello;
r   : 'hello' ID;
ID  : [a-z]+ ;
WS  : [\t\r\n]+ -> skip ;
```

ابتدا توابع enterR که با وارد شدن به قاعده R اجرا می‌شود بدین صورت بازنویسی می‌کنیم
که توکن ID قاعده R را بعد از متن :Entering R بنویسد و تابع exitR رابه این صورت که
عبارت Exiting R را برای ما چاپ کند.

```java
public class HelloWalker extends HelloBaseListener {
  public void enterR(HelloParser.RContext ctx ) {
    System.out.println( "Entering R : " + ctx.ID().getText() );
  }

  public void exitR(HelloParser.RContext ctx ) {
    System.out.println( "Exiting R" );
  }
}
```

کد نهایی به شکل زیر است.

```java
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;

public class HelloWalker extends HelloBaseListener {
  public void enterR(HelloParser.RContext ctx ) {
    System.out.println( "Entering R : " + ctx.ID().getText() );
  }

  public void exitR(HelloParser.RContext ctx ) {
    System.out.println( "Exiting R" );
  }

public class Hello {
  public static void main( String[] args) throws Exception
  {
    HelloLexer lexer = new HelloLexer( new ANTLRFileStream(args[0]));
    CommonTokenStream tokens = new CommonTokenStream( lexer );
    HelloParser parser = new HelloParser( tokens );
    ParseTree tree = parser.r();
    ParseTreeWalker walker = new ParseTreeWalker();
    walker.walk( new HelloWalker(), tree );
  }
}
```

این را مثلاً در فایلی به نام Hello.java ذخیره کنید
در نهایت به صورت زیر می‌توانیم ان را اجرا کنید

```console
$ antlr4 Grammar.g4
```

و سپس:

```console
$ javac Grammar*.java Hello.java
```

و

```console
$ java Hello
```

حالا می‌توانید به صورت دستی ورودی بدهید و با CTRL+D به ورودی دادن خاتمه دهید. همچنین می‌توانید مثلاً توسط دستور زیر درخت عبارت را رسم کنید:

```console
$ grun Hello r -gui
```


## جستارهای وابسته
** پارسنگ اکسپرشن گرامر

## منابع

* 

رده:تولیدکننده‌های تجزیه‌گر
رده:کامپایلرها و مفسرهای آزاد
رده:مقاله‌های ایجادشده توسط ایجادگر
رده:نرم‌افزارهای در مالکیت عمومی
رده:نرم‌افزارهای ۱۹۹۲ (میلادی)
رده:نرم‌افزارهایی که از پروانه بی‌اس‌دی استفاده می‌کنند