انتلر
انتلر (زبان انگلیسی: 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(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
جستارهای وابسته
ویرایشمنابع
ویرایش- Parr, Terence (January 15, 2013), The Definitive ANTLR 4 Reference (1st ed.), Pragmatic Bookshelf, p. 328, ISBN 978-1-934356-99-9