گرامر پیوست

**گرامر پیوست** نوعی دستور زبان رسمی است . برای توصیف نحو زبان‌ها به صورت عمده زبان‌های کامپیوتری است ، با استفاده از رویکردی بر اساس اینکه چگونه زبان طبیعی صرف می‌شود.

قواعد دستوری یک گرامر پیوستی، قواعد دستور زبان مستقل از متن  است، با این تفاوت که بخش‌های خاصی در نماد های غیر پایانه‌ ( پیوستها ) به عنوان آرگومان استفاده می‌شوند. اگر یک پیوست چندین بار در یک قانون اتفاق بیفتد، مقدار آن باید مطابقت داشته باشد ، یعنی باید در همه جا یکسان باشد. در برخی از انواع گرامر پیوست، روابط پیچیده تری بین مقادیر پیوست امکان پذیر است.

## مثال
ما می توانیم یک قطعه بسیار ساده از زبان انگلیسی را به روش زیر توصیف کنیم

: *جمله* ← *فاعل* *گزاره*
: *فاعل* ← *اسم*
: *گزاره* ← *مفعول* *فعل*
: *مفعول* ← *اسم*
:
: *اسم* ← جان
: *اسم* ← مریم
: *اسم* ← کودکان
: *اسم* ← والدین
:
: *فعل* ← دوست دارند
: *فعل* ←دوست دارد
: *فعل* ← کمک میکنند
: *فعل* ← کمک میکند

این دستور زبان مستقل از متن جملات ساده ای را توصیف میکند مانند:

: جان بچه ها را دوست دارد
: مریم به جان کمک می کند
: کودکان به والدین کمک می کنند
: والدین جان را دوست دارند

با اسامی و افعال بیشتر و قوانین بیشتر برای معرفی بخش های دیگر گفتار، طیف وسیعی از جملات انگلیسی را می توان توصیف کرد. بنابراین این یک رویکرد امیدوارکننده برای توصیف نحو زبان انگلیسی است.

با این حال، دستور زبان داده شده جملاتی مانند زیر را توصیف میکنند:

: جان بچه ها را دوست دارد
: کودکان به والدین کمک می کنند

این جملات اشتباه هستند: در زبان انگلیسی فاعل و فعل دارای یک عدد دستوری هستند که باید مطابقت داشته باشند.

گرامر پیوستی می تواند مستقیماً چنین چیزی را بیان کند:

: *جمله* ← *فاعل* + *عدد پیوست* + *عدد*
: فاعل + *شماره* ← *اسم* + *شماره*
: *پیوست* + *عدد* ← *فعل* + *عدد مفعول*
: *مفعول* ← *اسم* + *عدد*

: *اسم* + *مفرد* ← جان
: *اسم* + *مفرد* ← مریم
: *اسم* + *جمع* ←کودکان
: *اسم* + *جمع* ← والدین
:
: *فعل* + *مفرد* ← دوست دارد
: *فعل* + *جمع* ← دوست دارند
: *فعل* + *مفرد* ← کمک میکند
: *فعل* + *جمع* ← کمک میکنند

این دستور زبان فقط جملات صحیح انگلیسی را توصیف می کند، اگرچه می توان استدلال کرد که:

: جان, جان را دوست دارد

هنوز نادرست است و در عوض باید بخوانید:

: جان خودش را دوست دارد

اگر ابزار توصیف روابط بین مقادیر مختلف پیوست به اندازه کافی قدرتمند باشد، می‌توان آن را با استفاده از پیوست ترکیب کرد. همانطور که در بالا ذکر شد، این ابزارها به نوع گرامر پیوستی انتخاب شده بستگی دارد.

## انواع
در ساده‌ترین نوع از گرامر پیوست، پیوست ها فقط می‌توانند مقادیری را از یک دامنه متناهی بگیرند و مقادیر آنها مانند مثالها فقط از طریق توافق و قانون می‌توانند با هم مرتبط شوند. با استفاده از این روش، پیوست ها فشردگی گرامرها را افزایش می دهند، اما قدرت بیانی را اضافه نمی کنند.

رویکرد دیگر این است که به پیوست‌ها اجازه دهیم رشته‌های دلخواه را به‌عنوان مقادیر بگیرند و اجازه دهیم از ترکیب پیوست‌ها در قوانین استفاده کنند. محدوده مقادیر مجاز برای پیوست ها را می توان با گرامرهای مستقل از متن توصیف کرد. این امر تعریف رسمی گرامرهای دو سطحی را ایجاد می کند که به *گرامرهای Van Wijngaarden* یا گرامرهای *2VW نیز معروف هستند.* این پیوست ها باموفقیت برای توصیف زبان های پیچیده، به ویژه نحو زبان برنامه نویسی Algol 68 استفاده شده اند. با این حال، به نظر می رسد که، حتی اگر مقادیر پیوست را بتوان با ترکیب رشته ها تغییر داد، این تعریف رسمی تورینگ کامل است . از این رو، حتی ابتدایی ترین سؤالات در مورد زبان توصیف شده توسط گرامر دلخواه 2VW به طور کلی غیرقابل تصمیم گیری هستند.

Extended Affix Grammars که در دهه 1980 توسعه یافت، نسخه محدودتری از همین ایده است. آنها عمدتاً برای توصیف گرامر زبان های طبیعی مانند انگلیسی به کار می روند.

امکان دیگر این است که اجازه دهید مقادیر پیوست ها با کد نوشته شده در برخی از زبان های برنامه نویسی محاسبه شوند. دو رویکرد اساسی استفاده شده است:

* در گرامرهای ویژگی ، پیوست ها (که ویژگی نامیده می شود) می توانند مقادیری را از دامنه های دلخواه (مانند اعداد صحیح یا حقیقی، ساختارهای داده پیچیده) بگیرند و همچنین میتوان توابع دلخواهی را مشخص کرد که به هر زبان دلخواهی نوشته شده باشند تا نحوه مشتق شدن مقادیر پیوست در قوانین را از یکدیگر شرح دهند.
* در CDL ( زبان توصیف کامپایلر ) و جانشین آن CDL2 ، که در دهه 1970 توسعه یافت، قطعات کد منبع (معمولاً در زبان اسمبلی ) را می توان بطور معمول به جای سمت راست در قوانین استفاده کرد که اجازه اسکن ورودی و محاسبات ارزش پیوست را می دهد که مستقیما بیان شود. این رویکرد که به عنوان پایه ای برای ساخت کامپایلر های واقعی طراحی شده است، برای نوشتن کامپایلرها و سایر نرم افزارها، به عنوان مثال یک ویرایشگر متن استفاده میشود .

## منابع

رده:چارچوب‌های دستور زبانی
رده:نحو
رده:کامپایلرسازی
رده:زبان‌های صوری