**کامپایلر-کامپایلر** یا **کامپایلرساز** (به انگلیسی: Compiler-compiler) در علوم کامپیوتر ابزاری است که با گرفتن توصیف یک زبان صوری و یک ماشین (مثلاً مجموعه دستورالعمل یک پردازنده) برای آن زبان یک تجزیه‌کننده یا کامپایلر می‌سازد. خروجی به شکل کد منبع کامپایلر یا تجریه‌کنندهٔ مذکور است و ورودی می‌تواند یک فایل متنی باشد که گرامر زبان را شرح دهد (برای نمونه به شکل فرم باکوس نائور). معمولاً کد ارائه شده توسط این ابزارها به تغییراتی نیاز دارد قبل از آن که آماده استفاده باشد.

شمای رفتاری کامپایلر-کامپایلر

تاریخچه
-------

اولین استفاده از لفظ کامپایلر-کامپایلر مربوط است به ۱۹۶۰ میلادی. تونی بروکر که در آن زمان در دانشگاه منچستر فعالیت می‌کرد، برای آسان شدن ساختن کامپایلر برای کامپیوتر اطلس (Atlas Computer) ابزاری با این نام ساخت. در اصطلاح شناسی امروزی، آنچه بروکر انجام داد بیشتر به یک کامپایلر نوعی با قابلیت گسترش نحوی مطابقت دارد تا کامپایلر-کامپایلر و عموماً کامپایلر-کامپایلرهای امروزی فقط تجزیه‌کننده می‌سازند. فراگیر شدن لفظ کامپایلر-کامپایلر بیشتر ناشی از یک (کامپایلر) می‌باشد تا کار بروکر.
از روندهای جدید در این حوزه می‌توان به تلاش برای پیاده‌سازی کامپایلر سازهایی بر طبق معناشناسی زبان (Semantics) اشاره کرد. مقالهٔ بدوین که مربوط به ۱۹۸۲ میلادی است، به بررسی این موضوع می‌پردازد و ادعا می‌کند که این روش اولین گام برای ساخت خودکار کامپایلرهایی بهینه و مطمین، به معنی اینکه صحت برنامه قابل اثبات باشد، است.

مثال
----

برای نمونه کد زیر جمع یک سری عدد را تجریه می‌کند: (بعنوان مثال رشته ی: "۰+۱+۲")

```
 // Common options, for example, the target language
 options
 {
 language = "CSharp";
 }
 // Followed by the parser 
 class SumParser extends Parser;
 options
 {
 k = 1; // Parser Lookahead: 1 Token
 }
 // Definition of an expression
 statement: INTEGER (PLUS^ INTEGER)\*;
 // Here is the Lexer
 class SumLexer extends Lexer;
 options
 {
 k = 1; // Lexer Lookahead: 1 characters
 }
 PLUS: '+';
 DIGIT: ('0'..'9');
 INTEGER: (DIGIT)+;

```

کد بالا برای ANTLR می‌باشد و گرامر سادهٔ ذکر شده را برای ANTLR توصیف می‌کند. با مقداردهی به language در بخش options می‌توان زبان خروجی را تعیین کرد، که ANTLR برنامه تجزیه‌کننده را با آن زبان به ما می‌دهد. همچنین با مقداردهی به k می‌توان الگوریتم تجزیه را تنظیم کرد. ANTLR با LL k کار می‌کند، و می‌توان k را به این شکل تعیین کرد. این عدد تعداد توکن‌هایی که برنامه جلو جلو نگاه می‌کند را مشخص می‌کند.
سپس می‌توانیم در برنامه از تجزیه‌کننده ساخته شده توسط ANTLR کمک بگیریم:

```
 TextReader reader;
 // (...) Fill TextReader with character
 SumLexer lexer = new SumLexer(reader);
 SumParser parser = new SumParser(lexer);

 parser.expression();

```

اینجا با فراخوانی parser می‌توانیم عبارت ورودی را تجزیه کنیم.

انواع
-----

* ANTLR

این ابزار یک تجریه‌کننده بر مبنای الگوریتم LL می‌سازد. این ابزار متن باز می‌باشد و می‌تواند به زبان‌های مختلفی از جمله پایتون و جاوا خروجی را ارائه دهد.

* Bison

گنو بایسون بخشی از پروژه گنو است و با خواندن مشخصات یک زبان مستقل از متن برای آن زبان تجزیه‌کننده می‌سازد. به‌طور پیش فرض، بایسون از LALR استفاده می‌کند اما از GLR هم پشتیبانی می‌کند.

* Coco/R

وجه تمایز این ابزار استفاده از فرم باکوس نائور گسترش یافته برای توصیف زبان است. اسکنری که Coco/R می‌سازد، مانند یک ماشین تعیین‌پذیر حالات متناهی عمل می‌کند و از قابلیت تشخیص پراگما پشتیبانی می‌کند. پراگما توکن‌هایی هستند که بخشی از نحو نیستند اما در هر جایی از ورودی می‌توانند ظاهر شوند، و دستورهایی مختص کامپایلر هستند.

* Lemon

بخشی از پروژه اس‌کیوال لایت می‌باشد. تجزیه‌کننده‌ای که Lemon می‌سازد تجزیه‌کننده ال‌ای‌ال‌آر می‌باشد و خروجی هم به زبان C است.

* Yacc

یک (کامپایلر) این ابزار توسط S.C.Johnson در آزمایشگاه‌های بل توسعه یافته‌است. عموماً به همراه لکس استفاده می‌شود.

* XPL

XPL یک زبان برنامه‌نویسی بر مبنای PL/I می‌باشد به همراه کامپایلری به همین زبان و یک کامپایلر-کامپایلر که به کمک آن بتوان کامپایلرهای مشابهی برای سایر زبان‌ها پیاده‌سازی کرد. XPL جزو اولین کامپایلر-کامپایلرها هست که در ۱۹۶۷ با اهداف آموزشی توسعه یافت.

جستارهای وابسته
---------------

* *علوم کامپیوتر*
* *کامپایلر*

منابع
-----

1. ↑  . پارامتر `|عنوان= یا |title=` ناموجود یا خالی (کمک)
2. ↑  . پارامتر `|عنوان= یا |title=` ناموجود یا خالی (کمک)
3. ↑  . پارامتر `|عنوان= یا |title=` ناموجود یا خالی (کمک)
4. ↑  . پارامتر `|عنوان= یا |title=` ناموجود یا خالی (کمک)
5. ↑  . پارامتر `|عنوان= یا |title=` ناموجود یا خالی (کمک)
6. ↑  . پارامتر `|عنوان= یا |title=` ناموجود یا خالی (کمک)
7. ↑  . پارامتر `|عنوان= یا |title=` ناموجود یا خالی (کمک)
8. ↑  «نسخه آرشیو شده». بایگانی‌شده از اصلی در ۱۱ ژوئیه ۲۰۱۱. دریافت‌شده در ۳ دسامبر ۲۰۱۷.
9. ↑  . پارامتر `|عنوان= یا |title=` ناموجود یا خالی (کمک)

| * ن
* ب
* و
الگوریتم‌های تجزیه‌کننده |
| --- |
| تحلیلگر بالا به پایین | 
* تجزیه‌کننده ال‌ال
* تجزیه‌کننده کاهشی بازگشتی
	+ تجزیه‌کننده بازگشتی دنباله
	+ Pratt parser

 |
| تجزیه از پایین به بالا | 
* Precedence
	+ تجزیه اولویت ساده
	+ تجزیه‌کننده عملگر اولویت
		- Shunting-yard
* Bounded-context
* تجزیه‌کننده ال‌آر
	+ تجزیه‌کننده ال‌آر ساده
	+ تجزیه‌کننده ال‌ای‌ال‌آر
	+ تجزیه‌کننده ال‌آر استاندارد
	+ تجزیه‌کننده جی‌ال‌آر
* الگوریتم سی وای کا
* Recursive ascent
* پارسر انتقال کاهش

 |
| Mixed, other | 
* ترکیب کننده تجزیه‌گر
* Chart
* تجزیه ایرلی

 |
| Related topics | 
* پارسنگ اکسپرشن گرامر
* گرامرهای عبارت قطعی
* برنامه‌نویسی پویا
* مموایز کردن
* کامپایلر-کامپایلر
	+ LALR
* کامپایلر-کامپایلر
* نمودار درختی تجزیه
* درخت نحو انتزاعی
* Scannerless parsing
* تاریخچه ساخت مترجم
* Comparison of parser generators

 |