انتلر

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

 کارکرد 
نحوهٔ کارکرد انتلر به این صورت است که ابتدا یک گرامر برای زبان مورد نظرمان تعریف می‌کنیم سپس به کمک ابزار انتلر کدی به زبان مورد نظرمان تولید می‌کنیم که به کمک این کد می‌توانیم تغییرات مورد نظرمان را روی ورودی داشته باشیم. نسخه آخر این نرم‌افزار تولید کد به زبان های E Java, C#, C++ JavaScript, Python2, Python3, Swift و GoSML/NJ Language Processing Tools: User Guide را پشتیبانی می‌کند.

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

 مثال و راه‌اندازی 
ابتدا با دستورها زیر انتلر را دریافت کنید:
$ cd /usr/local/lib
$ curl -O http://www.antlr.org/download/antlr-4.7.1-complete.jar
سپس دستور زیر را وارد کنید که انتلر به وسیله جاوا شناسایی شود:
$ export CLASSPATH=".:/usr/local/lib/antlr-4.7.1-complete.jar:$CLASSPATH"
در ادامه دستورها زیر را وارد کنید:
$ alias antlr4='java -jar /usr/local/lib/antlr-4.7.1-complete.jar'
$ alias grun='java org.antlr.v4.runtime.misc.TestRig'
به عنوان یک مثال ابتدایی گرامر زیر را در نظر بگیرید و نام ان را Grammar.g4 بگذارید.
// 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 را برای ما چاپ کند.
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" );
  }
}
کد نهایی به شکل زیر است.
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 ذخیره کنید
در نهایت به صورت زیر می‌توانیم ان را اجرا کنید
$ antlr4 Grammar.g4
و سپس:
$ javac Grammar*.java Hello.java
و
$ java Hello
حالا می‌توانید به صورت دستی ورودی بدهید و با CTRL+D به ورودی دادن خاتمه دهید. همچنین می‌توانید مثلاً توسط دستور زیر درخت عبارت را رسم کنید:
$ grun Hello r -gui

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

 منابع 



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