انگلیسیفرانسویاسپانیایی

اجرای سرورها | Ubuntu > | Fedora > |


فاویکون OnWorks

yaccposix - آنلاین در ابر

اجرای yaccposix در ارائه دهنده هاست رایگان OnWorks از طریق Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS

این دستور yaccposix است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.

برنامه:

نام


yacc - یک کامپایلر کامپایلر دیگر (توسعه)

خلاصه


yacc [−dltv] [file_prefix] [sym_prefix] دستور زبان

شرح


La yacc ابزار باید شرحی از گرامر بدون متن را در آن بخواند دستور زبان و C بنویسید
کد منبع، مطابق با استاندارد ISO C، به یک فایل کد، و به صورت اختیاری هدر
اطلاعات در یک فایل هدر، در فهرست فعلی. کد منبع تولید شده باید
به هیچ رفتار تعریف‌نشده، نامشخص یا تعریف‌شده توسط پیاده‌سازی وابسته نیست، به جز در
مواردی که مستقیماً از دستور زبان ارائه شده کپی شده است، یا در مواردی که هستند
مستند شده توسط اجرا کد C باید یک تابع و روال های مرتبط را تعریف کند
و ماکروها برای خودکاری که یک الگوریتم تجزیه را اجرا می کند که الزامات موجود در آن را برآورده می کند
الگوریتم.

شکل و معنای گرامر در بخش EXTENDED DESCRIPTION توضیح داده شده است.

کد منبع C و فایل هدر باید به شکلی مناسب به عنوان ورودی برای C تولید شود
کامپایلر (نگاه کنید به c99).

OPTIONS


La yacc ابزار باید با حجم تعاریف پایه POSIX.1-2008 مطابقت داشته باشد، بخش
12.2, سودمندی نحو دستورالعمل، به جز دستورالعمل 9.

گزینه های زیر باید پشتیبانی شوند:

file_prefix
استفاده کنید file_prefix بجای y به عنوان پیشوند برای همه نام فایل های خروجی. کد
پرونده y.tab.c، فایل هدر y.tab.h (زمانی ایجاد شد مشخص شده است)، و
فایل توضیحات خروجی y (زمانی ایجاد شد −v مشخص شده است)، به تغییر می یابد
file_prefix.tab.c, file_prefix.tab.hو file_prefixخروجیبود.

فایل هدر را بنویسید. به طور پیش فرض فقط فایل کد نوشته می شود. در #تعريف كردن
عبارات کدهای رمز اختصاص داده شده توسط yacc با کاربر اعلام شده
نام های رمزی این اجازه می دهد تا فایل های منبع غیر از y.tab.c برای دسترسی به توکن
کدها

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

sym_prefix
استفاده کنید sym_prefix بجای yy به عنوان پیشوند برای همه نام های خارجی تولید شده توسط
yacc. اسامی تحت تأثیر باید شامل توابع باشد yyparse() ، yylex()، و
yyerror() و متغیرها ییلوال, yycharو yydebug. (در بقیه
در این بخش، شش نماد ذکر شده با استفاده از نام های پیش فرض خود ارجاع داده می شوند
فقط به عنوان یک راحتی نمادین.) نام های محلی نیز ممکن است تحت تأثیر قرار گیرند
گزینه؛ با این حال گزینه تاثیری نخواهد داشت #تعريف كردن نمادهای تولید شده توسط
yacc.

-t دستورالعمل های کامپایل مشروط را تغییر دهید تا امکان کامپایل اشکال زدایی فراهم شود
کد در فایل کد عبارات اشکال زدایی در زمان اجرا باید همیشه در داخل باشد
فایل کد، اما به‌طور پیش‌فرض دستورالعمل‌های کامپایل شرطی از آنها جلوگیری می‌کند
تلفیقی.

−v فایلی حاوی توضیحات تجزیه کننده و گزارش تداخل بنویسید
ایجاد شده توسط ابهامات در دستور زبان.

عملگرها


عملوند زیر مورد نیاز است:

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

STDIN


استفاده نشده.

INPUT فایل ها


پرونده دستور زبان باید یک فایل متنی باشد که مطابق با توضیحات EXTENDED DESCRIPTION فرمت شده است
بخش.

محیط زیست متغیرها


متغیرهای محیطی زیر باید بر اجرای آن تأثیر بگذارند yacc:

زبان یک مقدار پیش فرض برای متغیرهای بین المللی سازی که تنظیم نشده اند یا
خالی. (به جلد تعاریف پایه POSIX.1-2008 مراجعه کنید، بخش 8.2,
بین المللی کردن متغیر برای تقدم بین المللی شدن
متغیرهایی که برای تعیین مقادیر دسته‌های محلی استفاده می‌شوند.)

LC_ALL اگر روی یک مقدار رشته ای غیر خالی تنظیم شده است، مقادیر بقیه را لغو کنید
متغیرهای بین المللی سازی

LC_CTYPE محلی را برای تفسیر توالی بایت های داده متنی تعیین کنید
به عنوان کاراکتر (به عنوان مثال، تک بایت در مقابل کاراکترهای چند بایتی در
آرگومان ها و فایل های ورودی).

LC_MESSAGES
محلی را که باید برای تأثیرگذاری بر قالب و محتویات استفاده شود، تعیین کنید
پیام های تشخیصی با خطای استاندارد نوشته شده است.

NLSPATH تعیین محل کاتالوگ پیام برای پردازش LC_MESSAGES.

La زبان و LC_* متغیرها بر اجرای yacc سودمندی همانطور که گفته شد در اصلی()
تابع تعریف شده در یاک کتابخانه تماس خواهد گرفت:

setlocale(LC_ALL, "")

و در نتیجه برنامه تولید شده توسط yacc همچنین باید تحت تأثیر محتویات این موارد باشد
متغیرها در زمان اجرا

نامتقارن رویدادها


پیش فرض

STDOUT


استفاده نشده.

STDERR


اگر تضادهای تغییر/کاهش یا کاهش/کاهش در آن شناسایی شود دستور زبان, yacc باید بنویسد
گزارش آن تضادها به خطای استاندارد در قالبی نامشخص.

خطای استاندارد نیز باید برای پیام های تشخیصی استفاده شود.

OUTPUT فایل ها


فایل کد، فایل هدر و فایل توضیحات باید فایل های متنی باشند. همه هستند
در بخش های بعدی شرح داده شده است.

رمز پرونده
این فایل باید حاوی کد منبع C برای yyparse() عملکرد. باید شامل شود
کد برای اقدامات معنایی مختلف با جایگزینی کلان انجام شده بر روی آنها به عنوان
در بخش توضیحات گسترده توضیح داده شده است. همچنین باید یک کپی از #تعريف كردن
عبارات موجود در فایل هدر اگر یک ٪اتحاد. اتصال اعلامیه استفاده می شود، اعلان برای
YYSTYPE نیز باید در این فایل گنجانده شود.

سربرگ پرونده
فایل هدر باید حاوی #تعريف كردن عباراتی که اعداد رمز را با
نام های رمزی این اجازه می دهد تا فایل های منبع غیر از فایل کد به کدهای رمز دسترسی داشته باشند.
اگر یک ٪اتحاد. اتصال اعلان استفاده می شود، اعلان برای YYSTYPE و an بیرونی YYSTYPE ییلوال
اظهارنامه نیز باید در این پرونده درج شود.

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

تمدید شده شرح


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

ورودی دستور زبان شامل قوانینی است که ساختار ورودی زبان مقصد را توصیف می کند و
زمانی که این قوانین برای ارائه معنایی مرتبط به رسمیت شناخته می شوند، کدی فراخوانی می شود
عمل. کدی که باید اجرا شود باید به صورت متنی ظاهر شود که در نظر گرفته شده است C- باشد.
کد زبان این متن نباید حاوی سه گراف زبان C باشد. زبان سی
فرض بر این است که اجزاء در هنگام پردازش توسط یک تابع صحیح تشکیل می دهند yacc به خروجی آن
فایل ها. کد موجود در این روش باید در هنگام شناسایی اجرا شود
زبان مقصد.

با توجه به دستور زبان، yacc utility فایل های شرح داده شده در OUTPUT FILES را تولید می کند
بخش. فایل کد را می توان با استفاده از کامپایل و پیوند داد c99. اگر اعلامیه و
بخش برنامه های فایل گرامر شامل تعاریف نیست اصلی() ، yylex()، و
yyerror()، خروجی کامپایل شده نیاز به پیوند با نسخه های ارائه شده خارجی دارد
کارکرد. نسخه های پیش فرض اصلی() و yyerror() در عرضه می شوند yacc کتابخانه و
می توان با استفاده از -l y عملوند به c99. yacc رابط های کتابخانه نیازی ندارند
پشتیبانی از رابط های غیر از پیش فرض yy پیشوند نماد نرم افزار فراهم می کند
عملکرد تحلیلگر واژگانی، yylex() را سافلکس ابزار به طور خاص طراحی شده است
چنین روتینی را ایجاد کند.

ورودی زبان
برنامه باید اطمینان حاصل کند که هر فایل مشخصات شامل سه بخش است
سفارش: اعلامیه ها, دستور زبان قوانینو برنامه ها، با دو جدا شده است
شخصیت ها ("%%"). بخش های اعلامیه ها و برنامه ها می توانند خالی باشند. اگر دومی باشد
خالی، قبلی "%%" علامت جدا کننده آن از بخش قوانین را می توان حذف کرد.

ورودی متن آزاد است که از ساختار دستور زبان تعریف شده در زیر پیروی می کند.

واژگانی ساختار of la دستور زبان
در ، ، و شخصیت باید نادیده گرفته شود، با این تفاوت که
برنامه باید اطمینان حاصل کند که آنها در اسامی یا چند نویسه رزرو شده ظاهر نمی شوند
نمادها نظرات باید در ضمیمه شود "/* ... */"، و می تواند هر جا که نامی باشد ظاهر شود
معتبر.

نام ها دارای طول دلخواه هستند، از حروف، نقطه تشکیل شده اند ("."، تاکید می کند ('_')، و
ارقام غیر اولیه حروف بزرگ و کوچک متمایز هستند. برنامه های کاربردی مطابق
نباید از اسامی با شروع استفاده شود yy or YY از آنجا که yacc تجزیه کننده از چنین نام هایی استفاده می کند. بسیاری از
نام ها در خروجی نهایی ظاهر می شوند yacc، و بنابراین آنها باید برای مطابقت انتخاب شوند
با هر قانون اضافی ایجاد شده توسط کامپایلر C برای استفاده. به ویژه ظاهر می شوند
in #تعريف كردن بیانیه.

یک لفظ باید از یک کاراکتر منفرد تشکیل شده باشد که در نویسه های تک نقل قول محصور شده است. همه از
توالی های فراری که برای ثابت های کاراکتری توسط استاندارد ISO C پشتیبانی می شوند باید باشند
پشتیبانی شده توسط yacc.

رابطه با تحلیلگر واژگانی به تفصیل در زیر مورد بحث قرار گرفته است.

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

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

معمولا yacc رابطه بین نام‌های نمادینی که تولید می‌کند و آن‌ها را تعیین می‌کند
مقدار عددی زیربنایی بخش اعلامیه ها امکان کنترل
تخصیص این مقادیر

همچنین می توان اطلاعات معنایی مرتبط با توکن هایی را که در حال حاضر فعال هستند حفظ کرد
پشته تجزیه در یک زبان C تعریف شده توسط کاربر اتحادیه، در صورتی که اعضای اتحادیه باشند
مرتبط با نام های مختلف در دستور زبان. بخش اعلامیه ها را فراهم می کند
این نیز

اولین گروه از اعلان کننده های زیر همگی فهرستی از نام ها را به عنوان آرگومان می گیرند. آن لیست می تواند
در صورت اختیاری، نام یکی از اعضای اتحادیه C (به نام a برچسب زیر) ظاهر می شود
در داخل "<" و '>'. (به عنوان یک استثنا از قراردادهای چاپی بقیه موارد
حجم POSIX.1-2008، در این موردبرچسب> نشان دهنده یک متاغیر نیست، اما
کاراکترهای براکت زاویه تحت اللفظی اطراف یک نماد.) استفاده از برچسب مشخص می کند که
توکن های نامگذاری شده در این خط باید از همان نوع C باشند که عضو اتحادیه ارجاع داده شده توسط
برچسب. در ادامه این موضوع با جزئیات بیشتری مورد بحث قرار گرفته است.

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

ذیل اعلام می کند نام نشانه بودن:

٪ نشانه [<برچسب>] نام [عدد] [نام [عدد]]...

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

ذیل اعلام می کند نام نشانه باشد و برای آن اولویت قائل شود:

٪ترک کرد [<برچسب>] نام [عدد] [نام [عدد]]...
٪درست [<برچسب>] نام [عدد] [نام [عدد]]...

یک یا چند خط که هر کدام با یکی از این نمادها شروع می شوند، می توانند در این بخش ظاهر شوند.
همه نشانه های موجود در یک خط دارای سطح تقدم و ارتباط یکسان هستند. خطوط
به ترتیب افزایش تقدم یا قدرت الزام آور هستند. ٪ترک کرد نشان می دهد که
عملگرها در آن خط به صورت انجمنی باقی می مانند و ٪درست به طور مشابه حق را نشان می دهد
اپراتورهای انجمنی اگر برچسب وجود دارد، باید نوع C را برای نامهمانطور که توضیح داده شد
برای ٪ نشانه.

ذیل اعلام می کند نام نشانه باشد و نشان می دهد که نمی توان از آن استفاده کرد
به صورت انجمنی:

% nonassoc [<برچسب>] نام [عدد] [نام [عدد]]...

اگر تجزیه کننده با استفاده از این توکن مواجه شود، یک خطا گزارش می کند. اگر برچسب is
در حال حاضر، باید یک نوع C را برای نامهمانطور که برای ٪ نشانه.

ذیل آن اتحادیه را اعلام می کند نامs غیر پایانه هستند و بنابراین لازم است
داشتن یک برچسب فیلد در ابتدای آن:

نوع٪ <برچسب> نام...

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

هر نامی که در دستور زبان توسط a تعریف نشده است ٪ نشانه, ٪ترک کرد, ٪درست، یا % nonassoc
فرض می شود که اعلان نشان دهنده یک نماد غیر پایانی است. در yacc ابزار باید گزارش دهد
یک خطا برای هر نماد غیر پایانی که در سمت چپ حداقل یکی ظاهر نمی شود
قانون دستور زبان

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

اعلام کننده های زیر از الگوی قبلی پیروی نمی کنند.

موارد زیر غیر ترمینال را اعلام می کند نام برای بودن شروع نماد، که نشان دهنده
بزرگترین و کلی ترین ساختار که توسط قواعد دستور زبان توضیح داده شده است:

%شروع نام

به طور پیش فرض، سمت چپ اولین قانون دستور زبان است. این پیش فرض می تواند باشد
با این اعلامیه لغو شد.

زیر اعلام می کند yacc پشته ارزش ترکیبی از انواع مختلف مقادیر باشد
دلخواه.

٪اتحاد. اتصال { بدن of اتحادیه (in C)}

بدنه اتحادیه نباید حاوی نشانه‌های پیش‌پردازش بریس فرفری نامتعادل باشد.

به‌طور پیش‌فرض، مقادیر بازگردانده شده توسط اکشن‌ها (به زیر مراجعه کنید) و تحلیلگر واژگانی باید باشد
از نوع INT. yacc ابزار، انواع را ردیابی می کند، و باید مربوطه را درج کند
نام اعضای اتحادیه به منظور انجام بررسی دقیق نوع تجزیه کننده حاصل.

متناوبا، با توجه به اینکه حداقل یکیبرچسب> ساختار استفاده می شود، اتحادیه می تواند اعلام شود
در یک فایل هدر (که باید با استفاده از a در بخش اعلامیه ها درج شود #include
ساخت داخل %{ و %}) ، و typedef برای تعریف نماد YYSTYPE برای نشان دادن استفاده می شود
این اتحادیه اثر از ٪اتحاد. اتصال ارائه اعلان YYSTYPE به طور مستقیم از
la yacc ورودی

اعلان‌ها و تعاریف زبان C می‌توانند در بخش اعلان‌ها ظاهر شوند
با علائم زیر:

%{ ... %}

این عبارات باید در فایل کد کپی شده و دارای دامنه جهانی در آن باشد
که می توان از آنها در بخش قوانین و برنامه استفاده کرد. اظهارات نباید حاوی
"%}" خارج از یک نظر، رشته تحت اللفظی یا ثابت چند نویسه.

برنامه باید اطمینان حاصل کند که بخش اعلامیه ها توسط توکن خاتمه یافته است %%.

دستور زبان قوانین in yacc
بخش قواعد دستور زبان عاری از زمینه را برای پذیرفته شدن توسط تابع تعریف می کند yacc
اقدامات زبان C و اولویت اضافی را ایجاد می کند و با آن قوانین مرتبط می کند
اطلاعات گرامر در زیر توضیح داده شده است، و یک تعریف رسمی در زیر آمده است.

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

A : BODY ;

علامت A نشان دهنده یک نام غیر پایانی و BODY نشان دهنده دنباله ای از صفر یا
بیش نامs, تحت اللفظی، و معنایی اقدامs که سپس می تواند توسط اختیاری دنبال شود
تقدم ردس فقط نام ها و لفظ ها در شکل گیری آن شرکت می کنند
دستور زبان؛ اعمال معنایی و قواعد تقدم به روش های دیگری استفاده می شود. در و
را هستند yacc نقطه گذاری. اگر چندین قانون گرامری متوالی با
همان سمت چپ، ('|') می تواند برای جلوگیری از بازنویسی استفاده شود
سمت چپ؛ در این مورد فقط پس از آخرین قانون ظاهر می شود. بدن
قسمت می تواند خالی (یا خالی از نام و لفظ) باشد تا نشان دهد که غیر پایانی است
نماد با رشته خالی مطابقت دارد.

La yacc ابزار یک شماره منحصر به فرد به هر قانون اختصاص می دهد. قوانین با استفاده از نوار عمودی
نشانه گذاری قوانین متمایز هستند. شماره اختصاص داده شده به قانون در توضیحات ظاهر می شود
فایل.

عناصر تشکیل دهنده یک BODY عبارتند از:

نام, تحت اللفظی
اینها قواعد دستور زبان را تشکیل می دهند: نام یا یکی است رمز یا یک غیر ترمینال;
تحت اللفظی مخفف خود است (کمتر از گیومه های مورد نیاز واژگانی).

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

این اقدامات می توانند مقادیر را برگردانند و می توانند مقادیر بازگشتی قبلی را بدست آورند
اقدامات. این مقادیر در اشیایی از نوع YYSTYPE نگهداری می شوند (نگاه کنید به ٪اتحاد. اتصال).
مقدار نتیجه عمل باید در پشته تجزیه با سمت چپ نگه داشته شود
طرف قاعده، که با کاهش های دیگر به عنوان بخشی از سمت راست آنها قابل دسترسی است
سمت. با استفاده ازبرچسب> اطلاعات ارائه شده در بخش اعلامیه ها،
کد تولید شده توسط yacc می تواند به شدت تایپ شود و حاوی دلخواه باشد
اطلاعات علاوه بر این، تحلیلگر واژگانی می تواند انواع مشابهی را ارائه دهد
مقادیر برای توکن ها، در صورت تمایل.

یک عمل یک دستور C دلخواه است و به این ترتیب می تواند ورودی یا خروجی، فراخوانی را انجام دهد
زیر برنامه ها و تغییر متغیرهای خارجی. یک عمل یک یا چند عبارت C است
محصور در بریس های مجعد '{' و '}'. اظهارات نباید حاوی
توکن های پیش پردازش بریس فرفری نامتعادل.

از متغیرهای شبه خاصی می توان در عمل استفاده کرد. اینها ماکروهایی برای دسترسی هستند
به ساختارهای داده شناخته شده داخلی به yacc.

$$ ارزش عمل را می توان با اختصاص دادن آن به $$ تنظیم کرد. اگر تایپ کنید
بررسی فعال است و نوع مقداری که باید تخصیص داده شود نمی تواند باشد
ممکن است یک پیام تشخیصی ایجاد شود.

$عدد این به مقدار بازگردانده شده توسط مؤلفه مشخص شده توسط
رمز عدد در سمت راست یک قانون، خواندن از چپ به راست؛
عدد می تواند صفر یا منفی باشد. اگر عدد صفر یا منفی است، آن است
به داده های مرتبط با نام در پشته تجزیه کننده اشاره دارد
قبل از سمت چپ ترین نماد قانون فعلی. (به این معنا که، "$0"
اشاره به نام بلافاصله قبل از سمت چپ ترین نام در
قانون فعلی که در پشته تجزیه کننده و "$-1" اشاره به
نماد به آن چپ.) اگر عدد به عنصری از جریان گذشته اشاره دارد
نقطه در قانون، یا فراتر از پایین پشته، نتیجه است
تعریف نشده اگر بررسی نوع فعال باشد و نوع مقداری که باید باشد
تعیین نمی شود، ممکن است یک پیام تشخیصی ایجاد شود.

$<برچسب>عدد
اینها دقیقاً با نمادهای مربوطه بدون علامت مطابقت دارند برچسب
گنجاندن، اما امکان بررسی دقیق نوع را فراهم می کند (و از موارد ناخواسته جلوگیری می کند
تبدیل نوع). اثر این است که ماکرو برای استفاده گسترش می یابد برچسب
برای انتخاب یک عنصر از اتحادیه YYSTYPE (با استفاده از dataname.tag).
این به ویژه مفید است اگر عدد مثبت نیست

$<برچسب>$ این نوع عضو اتحادیه ارجاع شده را بر مرجع تحمیل می کند
by برچسب. این ساختار زمانی قابل اجرا است که به سمت چپ ارجاع داده شود
مقدار متن در گرامر رخ می دهد و فراهم می کند yacc با وسیله ای
برای انتخاب یک نوع

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

به طور پیش فرض، مقدار یک قانون باید مقدار اولین عنصر در آن باشد.
اگر عنصر اول یک نوع نداشته باشد (به ویژه در مورد a
به معنای واقعی کلمه) و بررسی نوع توسط روشن است نوع٪، یک پیغام خطا ایجاد می شود.

تقدم
کلمه کلیدی % prec می توان برای تغییر سطح تقدم مرتبط با a استفاده کرد
قاعده گرامری خاص نمونه هایی از این موارد در مواردی است که یک واحد و باینری است
عملگر نمایش نمادین یکسانی دارد، اما باید متفاوت باشد
اولویت‌ها، یا جایی که مدیریت یک ساختار مبهم if-else است
لازم است. نماد رزرو شده % prec می تواند بلافاصله پس از بدن ظاهر شود
قانون دستور زبان است و می تواند با نام رمزی یا تحت اللفظی دنبال شود. باید
باعث شود تقدم قاعده دستور زبان به نشانه زیر تبدیل شود
نام یا تحت اللفظی اقدام برای قانون به عنوان یک کل می تواند دنبال شود % prec.

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

برنامه ها بخش
La برنامه ها بخش می تواند شامل تعریف تحلیلگر واژگانی باشد yylex() و هر کدام
توابع دیگر؛ به عنوان مثال، مواردی که در اقدامات مشخص شده در قوانین دستور زبان استفاده می شوند. آی تی
مشخص نیست که آیا بخش برنامه‌ها قبل از اقدامات معنایی موجود است یا بعد از آن
فایل خروجی؛ بنابراین، اگر برنامه دارای هر گونه تعریف کلان و
اعلامیه های در نظر گرفته شده برای اعمال به کد در اقدامات معنایی، باید آنها را قرار دهد
در داخل "%{ ... %}" در بخش اعلامیه ها

ورودی دستور زبان
ورودی زیر به yacc یک تجزیه کننده برای ورودی به دست می دهد yacc. این نحو رسمی
بر توضیحات نحو متن قبلی اولویت دارد.

ساختار واژگانی با دقت کمتری تعریف شده است. واژگانی ساختار of la دستور زبان تعریف می کند
اکثر شرایط مطابقت بین شرایط قبلی و نشانه های زیر به شرح زیر است
دنبال می کند

مشخص کننده این با مفهوم مطابقت دارد نام، قبلا داده شده است. همچنین شامل می شود
لفظی که قبلاً تعریف شد.

C_IDENTIFIER
این یک نام است و بعلاوه به دنبال آن الف شناخته شده است . آ
literal نمی تواند این نشانه را ارائه دهد.

عدد رشته ای از ارقام (یک عدد صحیح اعشاری غیر منفی).

TYPE, چپ, علامت, LCURL, RCURL
اینها مستقیماً مطابقت دارند نوع٪, ٪ترک کرد, %%, %{و %}.

{ ... } این نشان‌دهنده کد منبع زبان C، با گنجاندن احتمالی است "$"
ماکروها همانطور که قبلاً بحث شد.

/* دستور زبان برای la ورودی به yacc */
/* اساسی ورودی های. */
/* La پیروی هستند به رسمیت شناخته شده by la واژگانی تحلیلگر. */

%token IDENTIFIER /* شامل شناسه ها و لفظ ها */
%token C_IDENTIFIER /* شناسه (اما نه تحت اللفظی)
به دنبال آن یک :. */
% رمز NUMBER /* [0-9][0-9]* */

/* کلمات رزرو شده : %type=>TYPE %left=>LEFT و غیره */

% توکن چپ راست NONASSOC ژتون PREC TYPE START UNION

%token MARK /* علامت %%. */
%token LCURL /* علامت %{. */
%token RCURL /* علامت %}. */

/* کاراکترهای 8 بیتی خود را نشان می دهند. */
/* توکن ها باید برای کاراکترهای چند بایتی تعریف شوند. */

مشخصات %شروع

%%

مشخصات: دم قوانین MARK را تعریف می کند
;
دم: مارک
{
/* در این عمل بقیه فایل را تنظیم کنید. */
}
| /* خالی؛ علامت دوم اختیاری است. */
;
defs: /* خالی. */
| دفس دف
;
def: START IDENTIFIER
| اتحاد. اتصال
{
/* تعریف اتحادیه را در خروجی کپی کنید. */
}
| LCURL
{
/* کد C را در فایل خروجی کپی کنید. */
}
RCURL
| فهرست تگ rword
;
rword : TOKEN
| ترک کرد
| درست
| NONASSOC
| تایپ کنید
;
برچسب: /* خالی: شناسه تگ اتحاد اختیاری است. */
| '<' IDENTIFIER '>'
;
nlist: nmno
| nlist nmno
;
nmno : IDENTIFIER /* توجه: به معنای واقعی کلمه با نوع % نامعتبر است. */
| IDENTIFIER NUMBER /* توجه: با نوع % نامعتبر است. */
;

/* بخش قانون */

قوانین: C_IDENTIFIER rbody prec
| قاعده قوانین
;
قانون: C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody : /* خالی */
| شناسه rbody
| عمل بدن
;
عمل : '{'
{
/* عمل را کپی کنید، $$ را ترجمه کنید، و غیره. */
}
'}'
;
prec : /* خالی */
| PREC IDENTIFIER
| عمل PREC IDENTIFIER
| prec ';'
;

درگیری
تجزیه کننده تولید شده برای گرامر ورودی ممکن است دارای حالت هایی باشد که در آنها تضاد رخ می دهد. در
تضادها به این دلیل رخ می دهند که گرامر اینطور نیست LALR(1). یک دستور زبان مبهم همیشه حاوی
حداقل یکی LALR(1) درگیری در yacc ابزار باید تمام تضادها را با استفاده از یکی حل کند
قوانین پیش فرض یا قوانین اولویت مشخص شده توسط کاربر.

تعارض ها یا تغییر/کاهش تعارض یا کاهش/کاهش تعارض هستند. یک تغییر/کاهش
تضاد جایی است که، برای یک حالت معین و نماد چشم انداز، هم یک عمل تغییر و هم a
کاهش اقدام ممکن است. تعارض کاهش/کاهش جایی است که، برای یک حالت معین و
نماد نگاه پیش رو، کاهش با دو قانون مختلف امکان پذیر است.

قواعد زیر نحوه تعیین اقداماتی را که باید در هنگام بروز تعارض انجام شود، شرح می‌دهد. نه
همه درگیری‌های تغییر/کاهش را می‌توان با موفقیت از این طریق حل کرد، زیرا ممکن است تضاد
ناشی از مواردی غیر از ابهام باشد، بنابراین استفاده بی احتیاطی از این امکانات می تواند باعث شود
زبان پذیرفته شده توسط تجزیه کننده بسیار متفاوت از زبان مورد نظر است. را
فایل توضیحات باید حاوی اطلاعات کافی برای درک علت آن باشد
تعارض. در جایی که ابهام دلیلی است که قوانین پیش‌فرض یا صریح باید وجود داشته باشند
برای تولید یک تجزیه کننده کار کافی است.

اولویت ها و انجمن های اعلام شده (نگاه کنید به اعلامیه ها بخش) عادت دارند
تضادهای تجزیه را به صورت زیر حل کنید:

1. تقدم و تداعی با هر قاعده دستور زبان همراه است. آن است
تقدم و تداعی آخرین نشانه یا لفظ در بدنه قاعده. اگر
la % prec کلمه کلیدی استفاده می شود، این پیش فرض را لغو می کند. برخی از قوانین گرامری ممکن است نباشند
هم تقدم و هم تداعی دارند.

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

3. وقتی تضاد تغییر/کاهش وجود دارد که با قانون 2 قابل حل نیست، تغییر
انجام شده. تضادهای حل شده از این طریق در خروجی تشخیصی که در شرح داده شده است، شمارش می شود
خطا اداره.

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

تعارضات حل شده با تقدم یا تداعی نباید در تغییر/کاهش حساب شود.
و کاهش/کاهش درگیری های گزارش شده توسط yacc روی خطای استاندارد یا در
فایل توضیحات

خطا اداره
نشانه خطا باید برای رسیدگی به خطا رزرو شود. نام خطا قابل استفاده در
قوانین دستور زبان. مکان هایی را نشان می دهد که تجزیه کننده می تواند از یک خطای نحوی بازیابی کند. در
مقدار پیش فرض خطا باید 256 باشد. مقدار آن را می توان با استفاده از a تغییر داد ٪ نشانه اعلام.
تحلیلگر واژگانی نباید مقدار را برگرداند خطا.

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

هنگامی که تجزیه کننده یک خطای نحوی را تشخیص می دهد، معمولاً فراخوانی می کند yyerror() با شخصیت
رشته "نحو خطا" به عنوان استدلال آن اگر تجزیه کننده ثابت باشد تماس برقرار نمی شود
بازیابی از یک خطای قبلی هنگامی که خطا شناسایی شد. تجزیه کننده در نظر گرفته می شود
از یک خطای قبلی بازیابی می شود تا زمانی که تجزیه کننده حداقل به سه مورد تغییر کند
نمادهای ورودی عادی از زمانی که آخرین خطا شناسایی شده یا یک عمل معنایی اجرا شده است
ماکرو yyerrok. تجزیه کننده نباید تماس بگیرد yyerror() هنگامی که YYERROR اجرا می شود.

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

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

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

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

ماکرو YYACCEPT باید باعث شود تجزیه کننده با مقدار صفر برگردد. ماکرو YYABORT
باعث می شود تجزیه کننده با مقدار غیر صفر برگردد.

رابط به la واژگانی آنالایزر
La yylex() تابع یک تابع با مقدار صحیح است که a را برمی گرداند رمز عدد
نشان دهنده نوع نشانه خوانده شده است. اگر مقداری مرتبط با توکن وجود داشته باشد
توسط yylex() (به بحث مراجعه کنید برچسب در بالا)، باید به
متغیر خارجی ییلوال.

اگر تجزیه کننده و yylex() در مورد این اعداد نشانه، ارتباطات قابل اعتماد به توافق نمی رسند
بین آنها نمی تواند رخ دهد. برای لفظهای (نویسه تک بایتی)، نشانه به سادگی همان است
مقدار عددی کاراکتر در مجموعه کاراکترهای فعلی اعداد برای نشانه های دیگر
را می توان انتخاب کرد yacc، یا توسط کاربر انتخاب شده است. در هر صورت، #تعريف كردن ساختن
از C برای اجازه دادن استفاده می شود yylex() برای بازگرداندن این اعداد به صورت نمادین. در #تعريف كردن اظهارات
در فایل کد قرار می گیرند و در صورت درخواست آن فایل، فایل هدر قرار می گیرد. مجموعه ای از
کاراکترهای مجاز توسط yacc در یک شناسه بزرگتر از آن است که توسط C. Token مجاز است
نام‌هایی که حاوی چنین نویسه‌هایی هستند نباید در آن گنجانده شوند #تعريف كردن اعلامیه ها

اگر اعداد رمز توسط yacc، نشانه های غیر از لفظ باید اختصاص داده شوند
اعداد بزرگتر از 256، اگرچه هیچ ترتیبی وجود ندارد. یک نشانه را می توان به صراحت اختصاص داد
یک عدد با دنبال کردن اولین ظاهر آن در بخش اعلامیه ها با یک عدد.
نام ها و لفظ هایی که به این شکل تعریف نشده اند، تعریف پیش فرض خود را حفظ می کنند. همه شماره های رمزی
اختصاص داده شده توسط yacc باید منحصر به فرد و متمایز از اعداد رمزی مورد استفاده برای حرف و
توکن های اختصاص داده شده توسط کاربر اگر اعداد رمز تکراری باعث ایجاد تداخل در تولید تجزیه کننده شوند،
yacc باید یک خطا را گزارش کند. در غیر این صورت، مشخص نیست که آیا تخصیص نشانه است یا خیر
پذیرفته شده یا خطایی گزارش شده است.

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

تکمیل کردن la برنامه
علاوه بر yyparse() و yylex()، توابع yyerror() و اصلی() مورد نیاز است
یک برنامه کامل بسازید برنامه می تواند عرضه کند اصلی() و yyerror()، یا آن ها
روتین ها را می توان از yacc کتابخانه

یاک کتابخانه
توابع زیر فقط در yacc کتابخانه قابل دسترسی از طریق -l y
عملوند به c99; بنابراین می توان آنها را با یک برنامه کاربردی منطبق دوباره تعریف کرد:

INT اصلی(از درجه اعتبار ساقط)
این تابع باید فراخوانی کند yyparse() و با یک مقدار نامشخص خارج شوید. سایر اقدامات
در این تابع نامشخص هستند.

INT yyerror(طراح ارابه *s)
این تابع باید آرگومان پایان یافته NUL را به خطای استاندارد بنویسد و به دنبال آن
آ .

سفارش -l y و -l l عملوندهای داده شده به c99 قابل توجه است؛ درخواست باید
یا خودش را ارائه دهد اصلی() عملکرد یا اطمینان حاصل کنید که -l y مقدم است -l l.

اشکال زدایی la تجزیه کننده
تجزیه کننده تولید شده توسط yacc باید امکانات تشخیصی در آن وجود داشته باشد که می تواند به صورت اختیاری باشد
فعال در زمان کامپایل یا در زمان اجرا (اگر در زمان کامپایل فعال باشد). در
کامپایل کد اشکال زدایی زمان اجرا تحت کنترل YYDEBUG، یک پیش پردازنده است.
نماد. اگر YYDEBUG مقدار غیر صفر داشته باشد، کد اشکال زدایی باید لحاظ شود. اگر آن است
مقدار صفر است، کد شامل نمی شود.

در تجزیه کننده هایی که کد اشکال زدایی گنجانده شده است، خارجی INT yydebug می تواند
برای روشن کردن اشکال زدایی (با مقدار غیر صفر) و خاموش کردن (مقدار صفر) در زمان اجرا استفاده می شود. در
مقدار اولیه از yydebug صفر خواهد بود.

چه زمانی -t مشخص شده است، فایل کد باید طوری ساخته شود که، اگر YYDEBUG قبلاً وجود نداشته باشد
در زمان تدوین (با استفاده از c99 -D گزینه YYDEBUG، برای مثال)، YYDEBUG باید
به صراحت روی 1 تنظیم شود -t مشخص نشده است، فایل کد باید طوری ساخته شود که
اگر YYDEBUG قبلاً تعریف نشده باشد، باید به صراحت روی صفر تنظیم شود.

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

الگوریتم
تجزیه کننده ساخته شده توسط yacc یک را اجرا می کند LALR(1) الگوریتم تجزیه همانطور که در مستند شده است
ادبیات. مشخص نیست که تجزیه کننده جدول محور است یا مستقیماً کدگذاری شده است.

تجزیه کننده ای که توسط yacc هرگز نباید یک نماد ورودی از آن درخواست کرد yylex() در حالی که در یک
بیان کنید که در آن تنها اقدامات غیر از عمل خطا، کاهش توسط یک قانون واحد است.

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

محدودیت
La yacc ابزار ممکن است چندین جدول داخلی داشته باشد. حداقل حداکثر برای این جداول
در جدول زیر نشان داده شده است. معنای دقیق این مقادیر پیاده سازی است-
تعریف شده است. پیاده سازی باید رابطه بین این مقادیر و بین آنها را مشخص کند
آنها و هر پیام خطایی که پیاده سازی ممکن است در صورت تمام شدن آن ایجاد کند
فضایی برای هر ساختار داخلی یک پیاده سازی ممکن است گروه هایی از این منابع را ترکیب کند
تا زمانی که مجموع موجود در دسترس کاربر کمتر از مجموع نباشد
از اندازه های مشخص شده در این بخش.

جدول: داخلی محدودیت in yacc

┌───────────────────────────────────────── ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─────┐
کمترین
محدود کردنبیشترینتوضیحات:
├───────────────────────────────────────── ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─────┤
│{NTERMS} │ 126 │ تعداد توکن. │
│{NNONTERM} │ 200 │ تعداد غیر پایانه ها. │
│{NPROD} │ 300 │ تعداد قوانین. │
│{NSTATES} │ 600 │ تعداد حالت ها. │
│{MEMSIZE} │ 5200 │ طول قوانین. کل │
│ │ │ طول، در نام (نشان و │
│ │ │ غیر پایانه ها)، از همه │
│ │ │ قواعد دستور زبان. │
│ │ │ سمت چپ برای │ شمارش می شود
│ │ │ هر قانون، حتی اگر │ نباشد
│ │ │ به صراحت تکرار شده است، به عنوان │
│ │ │ مشخص شده در دستور زبان قوانین in
│ │ │ yacc. │
│{ACTSIZE} │ 4000 │ تعداد اقدامات. "اقدامات" │
│ │ │ در اینجا (و در توضیحات │
│ │ │ فایل) به اقدامات تجزیه کننده │ مراجعه کنید
│ │ │ (تغییر، کاهش، و غیره) نه │
│ │ │ به اقدامات معنایی تعریف شده در │
│ │ │ دستور زبان قوانین in yacc. │
└───────────────────────────────────────── ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─────┘

خروج وضعیت


مقادیر خروجی زیر باید برگردانده شوند:

0 تکمیل با موفقیت

>0 خطایی روی داد.

آثار OF خطاها


در صورت بروز هر گونه خطایی، اجرا لغو می شود و yacc با وضعیت غیر صفر خارج می شود.
ممکن است فایل های کد جزئی و فایل های هدر تولید شوند. اطلاعات خلاصه در
فایل توضیحات همیشه باید تولید شود اگر −v پرچم حضور دارد

La پیروی بخش هستند آموزنده

کاربرد طریقه استفاده


پیاده سازی های تاریخی تضاد نام را در نام ها تجربه می کنند yacc.tmp, yacc.acts,
yacc.debug, y.tab.c, y.tab.hو خروجی y اگر بیش از یک کپی از yacc در حال اجرا در یک
تک دایرکتوری در یک زمان در گزینه ای برای غلبه بر این مشکل اضافه شد. در
مشکل مربوط به اجازه دادن به چندگانه yacc تجزیه کننده ها در همان فایل قرار می گرفتند
با افزودن a خطاب می شود گزینه ای برای لغو کدهای قبلی yy پیشوند متغیر

شرح گزینه حداقل مجموعه نام تابع و متغیر را مشخص می کند
هنگامی که تجزیه کننده های متعدد با هم مرتبط می شوند باعث تضاد می شوند. نیازی به YYSTYPE نیست
تغییر کرد. در عوض، برنامه نویس می تواند استفاده کند برای دادن فایل های هدر برای تجزیه کننده های مختلف
نام های مختلف و سپس فایل با yylex() برای یک تجزیه کننده داده شده می تواند شامل
هدر برای آن تجزیه کننده اسامی مانند yyclearrr نیازی به تغییر ندارند زیرا آنها
فقط در اقدامات استفاده می شود. پیوندی ندارند این امکان وجود دارد که یک
پیاده سازی نام های دیگری دارد، یا داخلی برای اجرای مواردی مانند
yyclearrr، یا ارائه ویژگی های غیر استانداردی که می خواهد با آن تغییر دهد .

عملگرهای Unary که به طور کلی همان رمز عملگر باینری هستند به آنها نیاز دارند
اولویت تنظیم شد این توسط اداره می شود % prec نماد مشاوره مرتبط با
قانون گرامری خاص که آن عملگر یکنواخت را تعریف می کند. (دیدن دستور زبان قوانین in yacc.)
برنامه ها نیازی به استفاده از این عملگر برای عملگرهای Unary ندارند، بلکه برای گرامرها استفاده می کنند
که نیازی به آن ندارند نادر هستند.

مثال ها


دسترسی به yacc کتابخانه با عملوندهای جستجوی کتابخانه به دست می آید c99. برای استفاده از
yacc کتابخانه اصلی():

c99 y.tab.c -l y

هر دو سافلکس کتابخانه و yacc کتابخانه حاوی اصلی(). برای دسترسی به yacc اصلی():

c99 y.tab.c lex.yy.c -l y -l l

این تضمین می کند که yacc کتابخانه ابتدا جستجو می شود، به طوری که اصلی() استفاده می شود.

تاریخی yacc کتابخانه ها شامل دو تابع ساده هستند که معمولا کدگذاری می شوند
توسط برنامه نویس برنامه این توابع مشابه کد زیر هستند:

#include
INT اصلی (باطل)
{
بیرونی INT yyparse();

setlocale(LC_ALL، "");

/* اگر تجزیه کننده زیر یکی باشد که توسط lex ایجاد شده است، the
برنامه باید مراقب باشد تا اطمینان حاصل شود که LC_CTYPE
و LC_COLLATE روی محلی POSIX تنظیم می شوند. */
(void) yyparse();
بازگشت (0) ؛
}

#عبارتند از

int yyerror (const char *msg)
{
(void) fprintf(stderr، "%s\n"، msg);
بازگشت (0) ؛
}

منطقی


مراجع در مرجع اسناد ممکن است در ساخت تجزیه کننده مفید باشد
ژنراتور مقاله ارجاعی DeRemer و Pennello (همراه با آثار آن
منابع) تکنیکی را برای تولید تجزیه کننده هایی که با این حجم از مطابقت دارند توصیف می کند
POSIX.1-2008. کار در این زمینه همچنان ادامه دارد، بنابراین مجریان باید مشورت کنند
ادبیات فعلی قبل از انجام هر گونه پیاده سازی جدید. مقاله اصلی Knuth است
مبنای نظری برای این نوع تجزیه کننده است، اما جداولی که تولید می کند غیرعملی است
بزرگ برای گرامرهای معقول و نباید استفاده شود. عبارت "معادل" است
عمدی برای اطمینان از اینکه بهترین جداول هستند LALR(1) می تواند تولید شود.

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

سرعت مولد تجزیه کننده تا حدودی به کلاس گرامر آن بستگی دارد
دسته ها با این حال، الگوریتم های اصلی مقاله Knuth برای ساخت تجزیه کننده های LR بودند
توسط نویسنده آن در آن زمان به طور غیرعملی کند ارزیابی شد. اگرچه LR کامل بیشتر است
پیچیده از LALR(1)، با بهبود سرعت و الگوریتم کامپیوتر، تفاوت (از نظر
زمان اجرای قابل قبول ساعت دیواری) اهمیت کمتری پیدا می کند.

به نویسندگان بالقوه هشدار داده می شود که مقاله DeRemer و Pennello ارجاع داده شده است
قبلاً ذکر شده یک اشکال را شناسایی می کند (ساده سازی بیش از حد در محاسبه LALR(1)
مجموعه های پیش رو) در برخی از LALR(1) عبارات الگوریتمی که قبل از آن
انتشار. آنها باید برای جست و جوی آن مقاله و همچنین مربوط به فعلی وقت بگذارند
کار، به خصوص آهو.

La گزینه ای برای ارائه یک روش قابل حمل برای مجوز اضافه شد yacc کار کردن
چندین تجزیه کننده جداگانه در یک فهرست اگر دایرکتوری حاوی بیش از یک دایرکتوری باشد
yacc گرامر، و هر دو گرامر به طور همزمان ساخته می شوند (مثلاً توسط a
موازی ساخت برنامه)، نتایج تضاد. در حالی که راه حل، رویه تاریخی نیست،
این یک نقص شناخته شده در پیاده سازی های تاریخی را اصلاح می کند. تغییرات مربوطه بود
به تمام بخش هایی که به نام فایل ها ارجاع داده شده اند ساخته شده است y.tab.c (اکنون "فایل کد")،
y.tab.h (اکنون «فایل هدر»)، و خروجی y (اکنون "فایل توضیحات").

گرامر برای yacc ورودی بر اساس مستندات System V است. توضیحات متنی
نشان می دهد که وجود دارد ';' در پایان قانون مورد نیاز است. گرامر و
اجرا به این نیاز ندارد. (استفاده از C_IDENTIFIER باعث کاهش در رخ می دهد
مکان درست.)

همچنین در آن اجرا سازه هایی مانند ٪ نشانه را می توان با الف خاتمه داد
، اما این توسط دستور زبان مجاز نیست. کلمات کلیدی مانند ٪ نشانه می توان
همچنین با حروف بزرگ ظاهر می شود که باز هم در مورد آن صحبتی نشده است. در اکثر جاهایی که '%' استفاده می شود،
می توان جایگزین کرد، و املای متناوب برای برخی از نمادها وجود دارد
(مثلا، ٪ترک کرد می تواند "%<" و یا حتی "\<").

تاریخی،برچسب> می تواند شامل هر کاراکتری باشد به جز '>'، از جمله فضای سفید، در
پیاده سازی. با این حال، از آنجایی که برچسب باید به یکی از اعضای اتحادیه استاندارد ISO C مراجعه کند
پیاده سازی های منطبق با تمرین باید فقط مجموعه ای از کاراکترها را برای ISO C پشتیبانی کنند
شناسه های استاندارد در این زمینه.

برخی از پیاده‌سازی‌های تاریخی برای پذیرش اقداماتی شناخته شده‌اند که توسط a خاتمه می‌یابند
دوره زمانی. پیاده سازی های تاریخی اغلب اجازه می دهد "$" در نام ها اجرای منطبق
نیازی به حمایت از هر یک از این رفتارها ندارد.

تصمیم گیری در مورد زمان استفاده % prec دشواری در مشخص کردن رفتار را نشان می دهد yacc.
ممکن است شرایطی وجود داشته باشد که در آن دستور زبان به طور دقیق، در اشتباه نیست، و با این حال
yacc نمی توان آن را بدون ابهام تفسیر کرد. رفع ابهامات در دستور زبان می تواند
در بسیاری از موارد با ارائه اطلاعات اضافی، مانند استفاده، حل می شود نوع٪ or
٪اتحاد. اتصال اعلامیه ها اغلب آسان‌تر است و معمولاً تجزیه‌کننده کوچک‌تری برای گرفتن به دست می‌آید
این جایگزین زمانی که مناسب باشد.

اندازه و زمان اجرای برنامه تولید شده بدون کد اشکال زدایی زمان اجرا می باشد
معمولاً در پیاده سازی های تاریخی کوچکتر و کمی سریعتر است.

پیام های آماری از چندین پیاده سازی تاریخی شامل انواع زیر است
اطلاعات:

n/512 پایانه، n/300 غیر ترمینال
n/600 قواعد گرامری، n/1500 ایالت
n تغییر/کاهش، n کاهش/کاهش تعارضات گزارش شده
n/350 مجموعه کاری استفاده شده است
حافظه: حالات و غیره n/15000، تجزیه کننده n/ 15000
n/600 مجموعه متمایز پیش بینی
n بسته شدن اضافی
n ورودی های شیفت، n استثنا
n باید ورودی ها
n ورودی‌ها به‌صورت پیش‌فرض goto ذخیره می‌شوند
فضای بهینه ساز استفاده شده: ورودی n/15000، خروجی n/ 15000
n ورودی های جدول، n صفر
حداکثر گسترش: n, حداکثر افست: n

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

فرمت خروجی y فایل داده نشده است زیرا مشخصات فرمت داده نشده است
دیده می شود که قابلیت حمل برنامه ها را افزایش می دهد. این فهرست در درجه اول برای کمک به انسان است
کاربران تجزیه کننده را می فهمند و اشکال زدایی می کنند. استفاده از خروجی y توسط یک اسکریپت کاربردی منطبق
غیر معمول خواهد بود علاوه بر این، پیاده‌سازی‌ها خروجی ثابتی تولید نکرده‌اند
فرمت محبوب آشکار بود. قالب انتخاب شده توسط پیاده سازی باید انسانی باشد
قابل خواندن، علاوه بر الزامی که یک فایل متنی است.

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

برخی از پیاده سازی ها تشخیص می دهند "={" به عنوان معادل '{' زیرا در تاریخ آمده است
مستندات. این ساخت و ساز از مدت ها قبل به عنوان منسوخ شناخته شده و مستند شده است
1978، در اشاره شده Yacc: هنوز دیگر کامپایلر-کامپایلر. این جلد از POSIX.1-2008
منسوخ گذاشتن و حذف آن را انتخاب کرد.

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

آینده جهت


ندارد.

با استفاده از خدمات onworks.net از yaccposix به صورت آنلاین استفاده کنید


Ad


Ad