انتلر

انتلر (زبان انگلیسی: ANTLR) بک ابزار مولد پارسر است که برای خواندن، پردازش، اجرا یا ترجمه متون ساختار یافته یا فایل‌ها باینری به کار می‌رود. این نرم‌افزار در ابتدا توسط ترنس پر از دانشگاه سانفرانسیسکو بوجود آمد و همچنان در حال توسعه است . انتلر در نسخه ۴ام خود از پارسر (*)LL تطبیقی استفاده می‌کند که یک فناوری جدیدی برای پارس کردن است که اولین بار توسط خود ترنس پر و سم هارول توسعه پیدا کرد. ویژگی جالب نسخه ۴ام انتلر این است که مشکل چپ گردی گرامر را حل می‌کند (مشروط بر اینکه چپ گردی غیر مستقیم نباشد یعنی مثلا قاعده x به y و y به x ارجاع داشته باشد) بنابراین انتلر با گرامرهای چپ گرد هم مشکلی ندارد.انتلر ورودی را با توجه به گرامری که به ان می‌دهد توسط یک درخت پارس نمایش میده که با گردش روی ان می‌توانید تغیرات لازم را روی ورودی ایجاد کنید. انتلر همچنین در نسخه جدید خود گردش کننده درخت پارس را در دو قالب شنونده و بازدید کننده را به صورت خودکار تولید می‌کند.
کارکرد
نحوه کارکرد انتلر به این صورت است که ابتدا یک گرامر برای زبان مورد نظرمان تعریف می‌کنیم سپس به کمک ابزار انتلر کدی به زبان مورد نظرمان تولید می‌کنیم که به کمک این کد می‌توانیم تغیرات مورد نظرمان را روی ورودی داشته باشیم. نسخه آخر این نرم‌افزار تولید کد به زبان‌هایE Java, C#, C++ JavaScript, Python2, Python3, Swift و Go را پشتیبانی می‌کند.
پروژه‌های نوشته شده به کمک انتلر
این نرم‌افزار به صورت گسترده‌ای در صنعت و دانشگاه برای ساختن انواع زبان‌ها، ابزارها و چارچوب‌های نرم‌افزاری استفاده شده‌است که نمونه‌های ان را در زیر می‌بینید:
گرووی
جایتون
هایبرنیت
نر افزار 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(args0));
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
پارسنگ اکسپرشن گرامر