.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "RE2PY" 1 "" "" "" .SH "نام (NAME)" re2py \- تولید تحلیل‌گرهای واژگانی سریع برای Python .SH "خلاصه دستور (SYNOPSIS)" .sp re2py \fB[ OPTIONS ]\fP \fB[ WARNINGS ]\fP \fBINPUT\fP .sp ورودی می‌تواند یک فایل یا \fB\-\fP برای stdin باشد. .SH "مقدمه (INTRODUCTION)" .sp ابزار re2py به عنوان یک پیش‌پردازنده کار می‌کند. فایل ورودی را (که معمولاً برنامه‌ای در Python است، اما می‌تواند هر چیز دیگری باشد) خوانده و به دنبال بلوک‌هایی از کد می‌گردد که درون نشانگرهای شروع/پایان با قالب خاص قرار گرفته‌اند. متن خارج از این بلوک‌ها عیناً به فایل خروجی کپی می‌شود. محتوای این بلوک‌ها توسط re2py پردازش می‌شود\&. این ابزار آن‌ها را به کد Python ترجمه کرده و کد تولیدشده را به جای بلوک مربوطه در خروجی قرار می‌دهد. .sp در اینجا نمونه‌ای از یک برنامه کوچک آورده شده است که بررسی می‌کند آیا رشته داده‌شده شامل یک عدد ده‌دهی است یا خیر: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT def lex(yyinput): yycursor = 0 %{ re2c:yyfill:enable = 0; re2c:indent:top = 1; [1\-9][0\-9]* { return True } * { return False } %} assert lex(b\(dq1234\e0\(dq) .ft P .fi .UNINDENT .UNINDENT .sp در خروجی، re2py بلوک میانی را با کد تولیدشده جایگزین کرده است: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # Generated by re2py # re2py $INPUT \-o $OUTPUT def lex(yyinput): yycursor = 0 yystate = 0 while True: match yystate: case 0: yych = yyinput[yycursor] yycursor += 1 if yych <= 0x30: yystate = 1 continue if yych <= 0x39: yystate = 2 continue yystate = 1 continue case 1: return False case 2: yych = yyinput[yycursor] if yych <= 0x2F: yystate = 3 continue if yych <= 0x39: yycursor += 1 yystate = 2 continue yystate = 3 continue case 3: return True case _: raise \(dqinternal lexer error\(dq assert lex(b\(dq1234\e0\(dq) .ft P .fi .UNINDENT .UNINDENT.SH "مبانی (BASICS)" .sp یک برنامه re2py شامل توالی‌ای از \fIبلوک‌ها\fP ترکیب‌شده با کد به زبان مقصد است. یک بلوک ممکن است شامل \fIتعاریف\fP، \fIپیکربندی‌ها\fP، \fIقواعد\fP، \fIکنش‌ها\fP و \fIرهنمودها\fP به هر ترتیبی باشد: .INDENT 0.0 .TP .B \fBname = regular\-expression ;\fP یک \fIتعریف\fP، \fBname\fP را به \fBregular\-expression\fP پیوند می‌دهد. نام‌ها می‌توانند شامل نویسه‌های الفبایی\-عددی و خط زیر باشند. بخش \fI\%عبارت‌های منظم\fP مروری بر نحو re2py برای عبارت‌های منظم ارائه می‌دهد. پس از تعریف، می‌توان از \fBname\fP در سایر عبارت‌های منظم و قواعد استفاده کرد. بازگشت در تعاریف نام‌گذاری‌شده مجاز نیست و هر نام باید پیش از استفاده تعریف شود. یک بلوک، تعاریف نام‌گذاری‌شده را از حوزه سراسری به ارث می‌برد. تعریف مجدد نامی که در حوزه جاری وجود دارد یک خطا است. .TP .B \fBconfiguration = value ;\fP یک \fIپیکربندی\fP امکان تغییر رفتار re2py و سفارشی‌سازی کد تولیدشده را فراهم می‌کند. برای فهرست کامل پیکربندی‌های پشتیبانی‌شده توسط re2py به بخش \fI\%پیکربندی‌ها\fP مراجعه کنید. بسته به یک پیکربندی خاص، \fBvalue\fP می‌تواند یک کلمه کلیدی، یک عدد صحیح غیرمنفی یا یک رشته تک‌خطی باشد که باید در علامت نقل‌قول تکی یا دوتایی قرار گیرد، مگر اینکه از نویسه‌های الفبایی\-عددی تشکیل شده باشد. یک بلوک، پیکربندی‌ها را از حوزه سراسری به ارث می‌برد و می‌تواند آن‌ها را دوباره تعریف کند یا موارد جدیدی اضافه نماید. پیکربندی‌های تعریف‌شده درون یک بلوک بر کل بلوک تأثیر می‌گذارند، حتی اگر در انتهای آن ظاهر شوند. .TP .B \fBregular\-expression code\fP یک \fIقاعده\fP، \fBregular\-expression\fP را به کنش معنایی آن متصل می‌کند (یک بلوک کد درون آکولاد، یا یک بلوک کد که با \fB:=\fP شروع شده و به یک خط جدید ختم می‌شود که پس از آن هر نویسه غیرفاصله‌ای قرار می‌گیرد). اگر \fBregular\-expression\fP مطابقت پیدا کند، \fBcode\fP مرتبط اجرا می‌شود. اگر چندین قاعده مطابقت داشته باشند، طولانی‌ترین تطابق اولویت دارد. اگر چندین قاعده با همان رشته تطابق داشته باشند، اولین قاعده اولویت دارد. دو قاعده ویژه وجود دارد: قاعده پیش‌فرض \fB*\fP و قاعده پایان ورودی \fB$\fP\&. قاعده پیش‌فرض همیشه باید تعریف شود؛ این قاعده صرف‌نظر از جایگاهش در بلوک، کمترین اولویت را دارد و با هر واحد کد مطابقت پیدا می‌کند (لزوماً یک نویسه معتبر نیست، به بخش \fI\%پشتیبانی از رمزگذاری\fP مراجعه کنید). قاعده پایان ورودی در صورتی باید تعریف شود که روش متناظر برای \fI\%مدیریت پایان ورودی\fP استفاده شده باشد. با \fI\%شرایط شروع\fP، قواعد نحو پیچیده‌تری خواهند داشت. .TP .B \fB!action code\fP یک \fIکنش\fP یک بلوک تعریف‌شده توسط کاربر از \fBcode\fP را به یک مکان خاص در ماشین حالت متناهی تولیدشده پیوند می‌دهد (به همان روشی که کنش‌های معنایی کد را به حالت‌های نهایی پیوند می‌دهند). برای فهرست کامل کنش‌های از پیش تعریف‌شده به بخش \fI\%کنش‌ها\fP مراجعه کنید. .TP .B \fB!directive ;\fP یک \fIرهنمود\fP یکی از دستورات ویژه از پیش تعریف‌شده است. هر رهنمود هدف منحصربه‌فردی دارد. برای جزئیات به بخش \fI\%رهنمودها\fP مراجعه کنید. .UNINDENT .SS "بلوک‌ها (Blocks)" .sp نشانگرهای شروع و پایان بلوک یا \fB/*!re2c\fP و \fB*/\fP، یا \fB%{\fP و \fB%}\fP هستند (از هر دو سبک پشتیبانی می‌شود). از نسخه 2.2، بلوک‌ها می‌توانند نام‌های اختیاری داشته باشند که امکان ارجاع به آن‌ها را در سایر بلوک‌ها فراهم می‌کند. انواع مختلفی از بلوک‌ها وجود دارد: .INDENT 0.0 .TP .B \fB/*!re2c[:] ... */\fP یا \fB%{[:] ... %}\fP یک \fIبلوک سراسری\fP شامل تعاریف، پیکربندی‌ها، قواعد و رهنمودها است. re2py عبارت‌های منظم مرتبط با هر قاعده را به یک اتوماتون متناهی قطعی کامپایل می‌کند، آن را به شکل پرش‌های شرطی در زبان مقصد کدگذاری کرده و بلوک را با کد تولیدشده جایگزین می‌نماید. نام‌ها و پیکربندی‌های تعریف‌شده در یک بلوک سراسری به حوزه سراسری اضافه می‌شوند و برای بلوک‌های پس از آن قابل مشاهده خواهند بود. در آغاز برنامه، حوزه سراسری با \fI\%گزینه‌های\fP خط فرمان مقداردهی اولیه می‌شود. .TP .B \fB/*!local:re2c[:] ... */\fP یا \fB%{local[:] ... %}\fP یک \fIبلوک محلی\fP مانند یک بلوک سراسری است، اما نام‌ها و پیکربندی‌های درون آن حوزه محلی دارند (بر سایر بلوک‌ها تأثیری نمی‌گذارند). .TP .B \fB/*!rules:re2c[:] ... */\fP یا \fB%{rules[:] ... %}\fP یک \fIبلوک قواعد\fP شبیه یک بلوک محلی است، اما خودش کدی تولید نمی‌کند و تعریفی را هم به حوزه سراسری اضافه نمی‌نماید \-\- این بلوک برای استفاده مجدد در سایر بلوک‌ها در نظر گرفته شده است. این روشی برای اشتراک‌گذاری کد است (جزئیات بیشتر در بخش \fI\%بلوک‌های قابل استفاده مجدد\fP). پیش از نسخه 2.2 re2py، بلوک‌های قواعد به گزینه \fB\-r \-\-reusable\fP نیاز داشتند. .TP .B \fB/*!use:re2c[:] ... */\fP یا \fB%{use[:] ... %}\fP یک بلوک استفاده که به یک بلوک قواعد از پیش تعریف‌شده ارجاع می‌دهد. اگر نام مشخص شده باشد، re2py به دنبال بلوک قواعدی با این نام می‌گردد. در غیر این صورت، از جدیدترین بلوک قواعد استفاده می‌شود (خواه نام‌گذاری‌شده باشد یا بدون نام). یک بلوک use می‌تواند تعاریف، پیکربندی‌ها و قواعد خاص خود را بیفزاید که به موارد بلوک قواعد ارجاع‌شده اضافه می‌شوند. پیش از نسخه 2.2 re2py، بلوک‌های use به گزینه \fB\-r \-\-reusable\fP نیاز داشتند. .TP .B \fB/*!max:re2c[:[:...]] ... */\fP یا \fB%{max[:[:...]] ... %}\fP بلوکی که تعریف \fBYYMAXFILL\fP را تولید می‌کند. یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که هنگام محاسبه مقدار \fBYYMAXFILL\fP کدام بلوک‌ها باید لحاظ شوند (اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند). به‌طور پیش‌فرض، کد تولیدشده یک تعریف ماکرو برای C (\fB#define YYMAXFILL \fP) یا یک متغیر سراسری برای Go (\fBvar YYMAXFILL int = \fP) است. این مقدار را می‌توان با پیکربندی اختیاری \fBformat\fP سفارشی کرد که یک رشته الگو را مشخص می‌کند که در آن \fB@@{max}\fP (یا به اختصار \fB@@\fP) با مقدار عددی \fBYYMAXFILL\fP جایگزین می‌شود. .TP .B \fB/*!maxnmatch:re2c[:[:...]] ... */\fP یا \fB%{maxnmatch[:[:...]] ... %}\fP بلوکی که تعریف \fBYYMAXNMATCH\fP را تولید می‌کند (به گزینه \fB\-P \-\-posix\-captures\fP نیاز دارد). یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که هنگام محاسبه مقدار \fBYYMAXNMATCH\fP کدام بلوک‌ها باید لحاظ شوند (اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند). به‌طور پیش‌فرض، کد تولیدشده یک تعریف ماکرو برای C (\fB#define YYMAXNMATCH \fP) یا یک متغیر سراسری برای Go (\fBvar YYMAXNMATCH int = \fP) است. این مقدار را می‌توان با پیکربندی اختیاری \fBformat\fP سفارشی کرد که یک رشته الگو را مشخص می‌کند که در آن \fB@@{max}\fP (یا به اختصار \fB@@\fP) با مقدار عددی \fBYYMAXNMATCH\fP جایگزین می‌شود. .TP .B \fB/*!stags:re2c[:[:...]] ... */\fP، \fB/*!mtags:re2c[:[:...]] ... */\fP یا \fB%{stags[:[:...]] ... %}\fP، \fB%{mtags[:[:...]] ... %{\fP بلوک‌هایی که یک قطعه کد الگو را مشخص می‌کنند که برای هر متغیر s\-tag/m\-tag تولیدشده توسط re2py گسترش می‌یابد. یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که هنگام محاسبه مجموعه متغیرهای برچسب کدام بلوک‌ها باید لحاظ شوند (اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند). دو پیکربندی اختیاری وجود دارد: \fBformat\fP و \fBseparator\fP\&. پیکربندی \fBformat\fP یک رشته الگو را مشخص می‌کند که در آن \fB@@{tag}\fP (یا به اختصار \fB@@\fP) با نام هر متغیر برچسب جایگزین می‌شود. پیکربندی \fBseparator\fP یک قطعه کد را برای اتصال قطعات تولیدشده \fBformat\fP برای متغیرهای برچسب مختلف مشخص می‌کند. .TP .B \fB/*!svars:re2c[:[:...]] ... */\fP، \fB/*!mvars:re2c[:[:...]] ... */\fP یا \fB%{svars[:[:...]] ... %}\fP، \fB%{mvars[:[:...]] ... %{\fP بلوک‌هایی که یک قطعه کد الگو را مشخص می‌کنند که برای هر s\-tag/m\-tag گسترش می‌یابد، خواه صراحتاً توسط قواعد ذکر شده باشد (با گزینه \fB\-\-tags\fP) یا به‌طور ضمنی توسط re2py تولید شده باشد (با گزینه‌های \fB\-\-captvars\fP یا \fB\-\-posix\-captvars\fP). یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که هنگام محاسبه مجموعه برچسب‌ها کدام بلوک‌ها باید لحاظ شوند (اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند). دو پیکربندی اختیاری وجود دارد: \fBformat\fP و \fBseparator\fP\&. پیکربندی \fBformat\fP یک رشته الگو را مشخص می‌کند که در آن \fB@@{tag}\fP (یا به اختصار \fB@@\fP) با نام هر برچسب جایگزین می‌شود. پیکربندی \fBseparator\fP یک قطعه کد را برای پیوند دادن قطعات تولیدشده \fBformat\fP برای برچسب‌های مختلف مشخص می‌کند. .TP .B \fB/*!getstate:re2c[:[:...]] ... */\fP یا \fB%{getstate[:[:...]] ... %}\fP بلوکی که توزیع شرطی را روی وضعیت تحلیل‌گر لغوی ایجاد می‌کند (به گزینه \fB\-\-storable\-state\fP نیاز دارد). یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که کدام بلوک‌ها باید در توزیع وضعیت گنجانده شوند. گذار پیش‌فرض به برچسب شروع اولین بلوک در فهرست می‌رود. اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند و گذار پیش‌فرض به اولین بلوک فایل که دارای برچسب شروع است می‌رود. این نوع بلوک با گزینه \fB\-\-loop\-switch\fP ناسازگار است، زیرا نیازمند گذارهای میان‌بلوکی است که بدون \fBgoto\fP یا فراخوانی تابع پشتیبانی نمی‌شوند. .TP .B \fB/*!conditions:re2c[:[:...]] ... */\fP، \fB/*!types:re2c... */\fP یا \fB%{conditions[:[:...]] ... %}\fP، \fB%{types... %}\fP بلوکی که شمارش شرط را تولید می‌کند (به گزینه \fB\-\-conditions\fP نیاز دارد). یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که هنگام محاسبه مجموعه شرط‌ها کدام بلوک‌ها باید لحاظ شوند (اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند). به‌طور پیش‌فرض، کد تولیدشده یک شمارش \fBYYCONDTYPE\fP است. این کد را می‌توان با پیکربندی‌های اختیاری \fBformat\fP و \fBseparator\fP سفارشی کرد. پیکربندی \fBformat\fP یک رشته الگو را مشخص می‌کند که در آن \fB@@{cond}\fP (یا به اختصار \fB@@\fP) با نام هر شرط، و \fB@@{num}\fP با یک نمایه عددی از آن شرط جایگزین می‌شود. پیکربندی \fBseparator\fP یک قطعه کد را برای اتصال قطعات تولیدشده \fBformat\fP برای شرایط مختلف تعیین می‌کند. .TP .B \fB/*!include:re2c */\fP یا \fB%{include %}\fP این بلوک امکان درج \fB\fP را فراهم می‌کند که باید یک مسیر فایل درون علامت نقل‌قول دوتایی باشد. محتویات فایل دقیقاً به جای بلوک جایگزین می‌شوند، همان‌طور که \fB#include\fP در C/C++ عمل می‌کند. از این بلوک می‌توان همراه با گزینه \fB\-\-depfile\fP برای ایجاد وابستگی‌های سامانه ساخت روی فایل‌های اضافه‌شده استفاده کرد. .TP .B \fB/*!header:re2c:on*/\fP یا \fB%{header:on %}\fP این بلوک شروع فایل سرایند را مشخص می‌کند. تمام محتویات پس از آن تا بلوک \fBheader:off\fP بعدی توسط re2py پردازش شده و در فایل سرایند مشخص‌شده با گزینه \fB\-t \-\-type\-header\fP نوشته می‌شود. .TP .B \fB/*!header:re2c:off*/\fP یا \fB%{header:off %}\fP این بلوک پایان فایل سرایند شروع‌شده با بلوک \fBheader:on*/\fP را مشخص می‌کند. .TP .B \fB/*!ignore:re2c ... */\fP یا \fB%{ignore ... %}\fP بلوکی که محتویات آن نادیده گرفته شده و از فایل خروجی حذف می‌شود. .UNINDENT.SS "پیکربندی‌ها (Configurations)" .sp در اینجا فهرست کاملی از پیکربندی‌های پشتیبانی‌شده توسط re2py آورده شده است: .INDENT 0.0 .TP .B \fBre2c:api\fP, \fBre2c:input\fP مشابه گزینه \fB\-\-api\fP است. .TP .B \fBre2c:api:sigil\fP نشانگر (\(dqsigil\(dq) مورد استفاده برای جای‌نگهدارهای آرگومان در عناصر اولیه API را مشخص می‌کند. مقدار پیش‌فرض \fB@@\fP است. یک جای‌نگهدار با sigil آغاز شده و به دنبال آن نام آرگومان درون آکولاد می‌آید. برای نمونه، اگر sigil روی \fB$\fP تنظیم شود، جای‌نگهدارها به شکل \fB${name}\fP خواهند بود. APIهای تک‌آرگومانی می‌توانند از نمادگذاری خلاصه بدون نام درون آکولاد استفاده کنند. این گزینه می‌تواند توسط گزینه‌های مربوط به هر یک از عناصر اولیه API بازنویسی شود، مانند \fBre2c:YYFILL@len\fP برای \fBYYFILL\fP\&. .TP .B \fBre2c:api:style\fP سبک API را مشخص می‌کند. مقادیر ممکن عبارتند از \fBfunctions\fP (پیش‌فرض برای C) و \fBfree\-form\fP (پیش‌فرض برای Go و Rust). در سبک \fBfunctions\fP، عناصر اولیه API با یک فهرست آرگومان درون پرانتز به دنبال نام عنصر اولیه تولید می‌شوند. آرگومان‌ها تنها برای پارامترهای خودکار تولیدشده فراهم می‌شوند (مانند تعداد نویسه‌های ارسالی به \fBYYFILL\fP)، اما برای بافت کلی تحلیل‌گر واژگانی (lexer) ارائه نمی‌شوند؛ بنابراین عناصر اولیه رفتاری شبیه به ماکروها در C/C++ یا بستارها (closures) در Go و Rust دارند. در سبک فرم آزاد (free\-form)، عناصر اولیه API شکل ثابتی ندارند: آن‌ها باید به‌صورت رشته‌هایی حاوی قطعه‌کدهای آزاد با متغیرهای درونیابی‌شده به شکل \fB@@{var}\fP یا \fB@@\fP تعریف شوند (که متناظر با آرگومان‌ها در سبک تابع‌مانند هستند). این پیکربندی ممکن است برای هر یک از عناصر اولیه API به‌طور جداگانه بازنویسی شود؛ برای نمونه پیکربندی \fBre2c:YYFILL:naked\fP را برای \fBYYFILL\fP ببینید. .TP .B \fBre2c:bit\-vectors\fP, \fBre2c:flags:bit\-vectors\fP, \fBre2c:flags:b\fP مشابه گزینه \fB\-\-bit\-vectors\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:captures\fP, \fBre2c:leftmost\-captures\fP مشابه گزینه \fB\-\-leftmost\-captures\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:captvars\fP, \fBre2c:leftmost\-captvars\fP مشابه گزینه \fB\-\-leftmost\-captvars\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:case\-insensitive\fP, \fBre2c:flags:case\-insensitive\fP مشابه گزینه \fB\-\-case\-insensitive\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:case\-inverted\fP, \fBre2c:flags:case\-inverted\fP مشابه گزینه \fB\-\-case\-inverted\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:case\-ranges\fP, \fBre2c:flags:case\-ranges\fP مشابه گزینه \fB\-\-case\-ranges\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:computed\-gotos\fP, \fBre2c:flags:computed\-gotos\fP, \fBre2c:flags:g\fP مشابه گزینه \fB\-\-computed\-gotos\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:computed\-gotos:relative\fP, \fBre2c:cgoto:relative\fP مشابه گزینه \fB\-\-computed\-gotos\-relative\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:computed\-gotos:threshold\fP, \fBre2c:cgoto:threshold\fP در صورت استفاده از \fBgoto\fP محاسباتی، این پیکربندی آستانه پیچیدگی را مشخص می‌کند که باعث تولید جداول پرش به‌جای دستورات تو‌در‌توی \fBif\fP و نقشه‌های بیتی (bitmaps) می‌شود. مقدار پیش‌فرض \fB9\fP است. .TP .B \fBre2c:cond:abort\fP اگر روی یک مقدار عددی صحیح مثبت تنظیم شود، حالت پیش‌فرض (default case) در هدایت وضعیت تولیدشده، اجرای برنامه را لغو (abort) می‌کند. .TP .B \fBre2c:cond:goto\fP قطعه‌کدی را مشخص می‌کند که برای قواعد میانبر خودکار تولیدشده \fB:=>\fP در شرط‌ها استفاده می‌شود. پیش‌فرض \fBgoto @@;\fP است. جای‌نگهدار \fB@@\fP با نام شرط جایگزین می‌شود (پیکربندی‌های \fBre2c:api:sigil\fP و \fBre2c:cond:goto@cond\fP را ببینید). .TP .B \fBre2c:cond:goto@cond\fP نشانگر مورد استفاده برای جایگزینی آرگومان در تعریف \fBre2c:cond:goto\fP را مشخص می‌کند. مقدار پیش‌فرض \fB@@\fP است. پیکربندی عمومی‌تر \fBre2c:api:sigil\fP را بازنویسی می‌کند. .TP .B \fBre2c:cond:divider\fP جداکننده بلوک‌های شرط را تعریف می‌کند. مقدار پیش‌فرض \fB/* *********************************** */\fP است. جای‌نگهدارها با نام شرط جایگزین می‌شوند (به \fBre2c:api;sigil\fP و \fBre2c:cond:divider@cond\fP مراجعه کنید). .TP .B \fBre2c:cond:divider@cond\fP نشانگر مورد استفاده برای جایگزینی آرگومان در تعریف \fBre2c:cond:divider\fP را مشخص می‌کند. پیش‌فرض \fB@@\fP است. پیکربندی عمومی‌تر \fBre2c:api:sigil\fP را بازنویسی می‌کند. .TP .B \fBre2c:cond:prefix\fP, \fBre2c:condprefix\fP پیشوند مورد استفاده برای برچسب‌های شرط را مشخص می‌کند. پیش‌فرض \fByyc_\fP است. .TP .B \fBre2c:cond:enumprefix\fP, \fBre2c:condenumprefix\fP پیشوند مورد استفاده برای شناسه‌های شرط را مشخص می‌کند. پیش‌فرض \fByyc\fP است. .TP .B \fBre2c:debug\-output\fP, \fBre2c:flags:debug\-output\fP, \fBre2c:flags:d\fP مشابه گزینه \fB\-\-debug\-output\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:empty\-class\fP, \fBre2c:flags:empty\-class\fP مشابه گزینه \fB\-\-empty\-class\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:encoding:ebcdic\fP, \fBre2c:flags:ecb\fP, \fBre2c:flags:e\fP مشابه گزینه \fB\-\-ebcdic\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:encoding:ucs2\fP, \fBre2c:flags:wide\-chars\fP, \fBre2c:flags:w\fP مشابه گزینه \fB\-\-ucs2\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:encoding:utf8\fP, \fBre2c:flags:utf\-8\fP, \fBre2c:flags:8\fP مشابه گزینه \fB\-\-utf8\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:encoding:utf16\fP, \fBre2c:flags:utf\-16\fP, \fBre2c:flags:x\fP مشابه گزینه \fB\-\-utf16\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:encoding:utf32\fP, \fBre2c:flags:unicode\fP, \fBre2c:flags:u\fP مشابه گزینه \fB\-\-utf32\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:encoding\-policy\fP, \fBre2c:flags:encoding\-policy\fP مشابه گزینه \fB\-\-encoding\-policy\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:eof\fP نماد نگهبان مورد استفاده همراه با قاعده پایان ورودی \fB$\fP را مشخص می‌کند. مقدار پیش‌فرض \fB\-1\fP است (قاعده \fB$\fP استفاده نمی‌شود). سایر مقادیر ممکن شامل تمامی واحدهای کد معتبر است. تنها اعداد ده‌دهی شناخته می‌شوند. .TP .B \fBre2c:header\fP, \fBre2c:flags:type\-header\fP, \fBre2c:flags:t\fP نام فایل سرایند تولیدشده را به صورت نسبی نسبت به دایرکتوری فایل خروجی مشخص می‌کند. مشابه گزینه \fB\-\-header\fP است، با این تفاوت که مسیر فایل نسبی است. .TP .B \fBre2c:indent:string\fP رشته مورد استفاده برای دندانه‌گذاری را مشخص می‌کند. پیش‌فرض یک نویسه تب تکی \fB\(dq\et\(dq\fP است. رشته دندانه‌گذاری باید تنها شامل نویسه‌های فاصله خالی باشد. برای غیرفعال کردن کامل دندانه‌گذاری، این پیکربندی را روی یک رشته خالی تنظیم کنید. .TP .B \fBre2c:indent:top\fP حداقل میزان دندانه‌گذاری مورد استفاده را مشخص می‌کند. مقدار پیش‌فرض صفر است. مقدار باید یک عدد صحیح نامنفی باشد. .TP .B \fBre2c:invert\-captures\fP مشابه گزینه \fB\-\-invert\-captures\fP است، اما می‌تواند برای هر بلوک به‌طور جداگانه پیکربندی شود. .TP .B \fBre2c:label:prefix\fP, \fBre2c:labelprefix\fP پیشوند مورد استفاده برای برچسب‌های وضعیت DFA را مشخص می‌کند. پیش‌فرض \fByy\fP است. .TP .B \fBre2c:label:start\fP, \fBre2c:startlabel\fP تولید برچسب شروع بلوک را کنترل می‌کند. مقدار پیش‌فرض صفر است، به این معنی که برچسب شروع تنها در صورتی تولید می‌شود که مورد استفاده قرار گیرد. یک مقدار صحیح بزرگ‌تر از صفر، حتی در صورت عدم استفاده توسط تحلیل‌گر واژگانی، تولید برچسب شروع را اجباری می‌کند. یک مقدار رشته‌ای نیز تولید برچسب شروع را اجباری کرده و نام برچسب را روی رشته مشخص‌شده تنظیم می‌کند. این پیکربندی تنها برای بلوک فعلی اعمال می‌شود (برای بلوک بعدی به مقدار پیش‌فرض بازنشانی می‌شود). .TP .B \fBre2c:label:yyFillLabel\fP پیشوند برچسب‌های \fBYYFILL\fP مورد استفاده با \fBre2c:eof\fP و در حالت وضعیت ذخیره‌پذیر را مشخص می‌کند. .TP .B \fBre2c:label:yyloop\fP نام برچسب مشخص‌کننده شروع حلقه تحلیل‌گر واژگانی همراه با گزینه \fB\-\-loop\-switch\fP را تعیین می‌کند. پیش‌فرض \fByyloop\fP است. .TP .B \fBre2c:label:yyNext\fP نام برچسب اختیاری را مشخص می‌کند که پس از سوییچ \fBYYGETSTATE\fP در حالت وضعیت ذخیره‌پذیر (فعال‌شده با \fBre2c:state:nextlabel\fP) می‌آید. مقدار پیش‌فرض \fByyNext\fP است. .TP .B \fBre2c:lookahead\fP, \fBre2c:flags:lookahead\fP منسوخ شده است (گزینه منسوخ‌شده \fB\-\-no\-lookahead\fP را ببینید). .TP .B \fBre2c:monadic\fP اگر روی مقداری غیر از صفر تنظیم شود، تحلیل‌گر واژگانی تولیدشده از نمادگذاری مونادیک استفاده خواهد کرد (این پیکربندی مخصوص Haskell است)..TP .B \fBre2c:nested\-ifs\fP, \fBre2c:flags:nested\-ifs\fP, \fBre2c:flags:s\fP همانند گزینهٔ \fB\-\-nested\-ifs\fP است، اما می‌تواند به ازای هر بلوک پیکربندی شود. .TP .B \fBre2c:posix\-captures\fP, \fBre2c:flags:posix\-captures\fP, \fBre2c:flags:P\fP همانند گزینهٔ \fB\-\-posix\-captures\fP است، اما می‌تواند به ازای هر بلوک پیکربندی شود. .TP .B \fBre2c:posix\-captvars\fP همانند گزینهٔ \fB\-\-posix\-captvars\fP است، اما می‌تواند به ازای هر بلوک پیکربندی شود. .TP .B \fBre2c:tags\fP, \fBre2c:flags:tags\fP, \fBre2c:flags:T\fP همانند گزینهٔ \fB\-\-tags\fP است، اما می‌تواند به ازای هر بلوک پیکربندی شود. .TP .B \fBre2c:tags:expression\fP عبارت مورد استفاده برای متغیرهای برچسب را مشخص می‌کند. به‌طور پیش‌فرض re2py عبارت‌هایی به شکل \fByyt\fP تولید می‌کند. این حالت ممکن است نامناسب باشد، برای نمونه اگر متغیرهای برچسب به‌صورت فیلدهایی در یک struct تعریف شده باشند. تمام تکرارهای \fB@@{tag}\fP یا \fB@@\fP با نام واقعی برچسب جایگزین می‌شوند. برای مثال، \fBre2c:tags:expression = \(dqs.@@\(dq;\fP منجر به ایجاد عبارت‌هایی به شکل \fBs.yyt\fP در کد تولیدشده خواهد شد. همچنین پیکربندی \fBre2c:api:sigil\fP را ببینید. .TP .B \fBre2c:tags:negative\fP عبارت ثابتی را مشخص می‌کند که برای مقدار منفی برچسب استفاده می‌شود (به‌طور معمول این مقدار در صورتی که برچسب‌ها آفست‌های صحیح در رشتهٔ ورودی باشند برابر با \fB\-1\fP، و در صورت اشاره‌گر بودن یک اشاره‌گر تهی (null pointer) خواهد بود). .TP .B \fBre2c:tags:prefix\fP پیشوند نام متغیرهای برچسب را مشخص می‌کند. پیش‌فرض \fByyt\fP است. .TP .B \fBre2c:sentinel\fP نماد نگهبان (sentinel) مورد استفاده برای بررسی‌های پایان ورودی را مشخص می‌کند (زمانی که بررسی محدوده‌ها با \fBre2c:yyfill:enable = 0;\fP غیرفعال شده باشد و \fBre2c:eof\fP تنظیم نشده باشد). این پیکربندی تأثیری بر تولید کد ندارد: هدف آن اطمینان از این است که نماد نگهبان در میانهٔ یک قاعده مجاز نباشد، و تضمین کند که تحلیل‌گر واژگانی فراتر از انتهای بافر را نخواند. مقدار پیش‌فرض \fI\-1\(ga\fP است (در این حالت re2py فرض می‌کند که نگهبان صفر است، که رایج‌ترین حالت ممکن می‌باشد). تنها اعداد ده‌دهی شناسایی می‌شوند. .TP .B \fBre2c:state:abort\fP اگر روی یک مقدار عدد صحیح مثبت تنظیم شود، حالت پیش‌فرض (default case) در توزیع وضعیت (state dispatch) تولیدشده، اجرای برنامه را متوقف می‌کند، و یک حالت \fB\-1\fP صریح حاوی انتقال به آغاز بلوک خواهد بود. .TP .B \fBre2c:state:nextlabel\fP تعیین می‌کند که آیا بعد از سوییچ \fBYYGETSTATE\fP یک برچسب \fByyNext\fP قرار گیرد یا خیر (مقدار پیش‌فرض صفر است که متناظر با نبود برچسب است). همچنین می‌توان از \fBre2c:label:start\fP برای تولید یک برچسب آغازین خاص، یا یک بلوک صریح \fBgetstate\fP برای تولید سوییچ \fBYYGETSTATE\fP به‌طور جداگانه از بلوک تحلیل‌گر واژگانی استفاده کرد. .TP .B \fBre2c:unsafe\fP, \fBre2c:flags:unsafe\fP همانند گزینهٔ \fB\-\-no\-unsafe\fP است، اما می‌تواند به ازای هر بلوک پیکربندی شود. اگر روی صفر تنظیم شود، از تولید دربرگیرنده‌های \fBunsafe\fP پیرامون \fBYYPEEK\fP جلوگیری می‌کند. پیش‌فرض مقداری غیرصفر است (دربرگیرنده‌ها تولید می‌شوند). این پیکربندی مختص به Rust است. .TP .B \fBre2c:YYBACKUP\fP, \fBre2c:define:YYBACKUP\fP دستور پایهٔ عمومی API یعنی \fBYYBACKUP\fP را تعریف می‌کند. .TP .B \fBre2c:YYBACKUPCTX\fP, \fBre2c:define:YYBACKUPCTX\fP دستور پایهٔ عمومی API یعنی \fBYYBACKUPCTX\fP را تعریف می‌کند. .TP .B \fBre2c:YYCONDTYPE\fP, \fBre2c:define:YYCONDTYPE\fP دستور پایهٔ API یعنی \fBYYCONDTYPE\fP را تعریف می‌کند. .TP .B \fBre2c:YYCTYPE\fP, \fBre2c:define:YYCTYPE\fP دستور پایهٔ API یعنی \fBYYCTYPE\fP را تعریف می‌کند. .TP .B \fBre2c:YYCTXMARKER\fP, \fBre2c:define:YYCTXMARKER\fP دستور پایهٔ API یعنی \fBYYCTXMARKER\fP را تعریف می‌کند. .TP .B \fBre2c:YYCURSOR\fP, \fBre2c:define:YYCURSOR\fP دستور پایهٔ API یعنی \fBYYCURSOR\fP را تعریف می‌کند. .TP .B \fBre2c:YYDEBUG\fP, \fBre2c:define:YYDEBUG\fP دستور پایهٔ API یعنی \fBYYDEBUG\fP را تعریف می‌کند. .TP .B \fBre2c:YYFILL\fP, \fBre2c:define:YYFILL\fP دستور پایهٔ API یعنی \fBYYFILL\fP را تعریف می‌کند. .TP .B \fBre2c:YYFILL@len\fP, \fBre2c:define:YYFILL@len\fP علامت (sigil) مورد استفاده برای جایگزینی آرگومان را در تعریف \fBYYFILL\fP مشخص می‌کند. پیش‌فرض \fB@@\fP است. بر پیکربندی عمومی‌تر \fBre2c:api:sigil\fP اولویت دارد. .TP .B \fBre2c:YYFILL:naked\fP, \fBre2c:define:YYFILL:naked\fP بر پیکربندی عمومی‌تر \fBre2c:api:style\fP برای \fBYYFILL\fP اولویت دارد. مقدار صفر با سبک آزاد API (free\-form API style) مطابقت دارد. .TP .B \fBre2c:YYFN\fP دستور پایهٔ API یعنی \fBYYFN\fP را تعریف می‌کند. .TP .B \fBre2c:YYINPUT\fP دستور پایهٔ API یعنی \fBYYINPUT\fP را تعریف می‌کند. .TP .B \fBre2c:YYGETCOND\fP, \fBre2c:define:YYGETCONDITION\fP دستور پایهٔ API یعنی \fBYYGETCOND\fP را تعریف می‌کند. .TP .B \fBre2c:YYGETCOND:naked\fP, \fBre2c:define:YYGETCONDITION:naked\fP بر پیکربندی عمومی‌تر \fBre2c:api:style\fP برای \fBYYGETCOND\fP اولویت دارد. مقدار صفر با سبک آزاد API (free\-form API style) مطابقت دارد. .TP .B \fBre2c:YYGETSTATE\fP, \fBre2c:define:YYGETSTATE\fP دستور پایهٔ API یعنی \fBYYGETSTATE\fP را تعریف می‌کند. .TP .B \fBre2c:YYGETSTATE:naked\fP, \fBre2c:define:YYGETSTATE:naked\fP بر پیکربندی عمومی‌تر \fBre2c:api:style\fP برای \fBYYGETSTATE\fP اولویت دارد. مقدار صفر با سبک آزاد API (free\-form API style) مطابقت دارد. .TP .B \fBre2c:YYGETACCEPT\fP, \fBre2c:define:YYGETACCEPT\fP دستور پایهٔ API یعنی \fBYYGETACCEPT\fP را تعریف می‌کند. .TP .B \fBre2c:YYLESSTHAN\fP, \fBre2c:define:YYLESSTHAN\fP دستور پایهٔ عمومی API یعنی \fBYYLESSTHAN\fP را تعریف می‌کند. .TP .B \fBre2c:YYLIMIT\fP, \fBre2c:define:YYLIMIT\fP دستور پایهٔ API یعنی \fBYYLIMIT\fP را تعریف می‌کند. .TP .B \fBre2c:YYMARKER\fP, \fBre2c:define:YYMARKER\fP دستور پایهٔ API یعنی \fBYYMARKER\fP را تعریف می‌کند. .TP .B \fBre2c:YYMTAGN\fP, \fBre2c:define:YYMTAGN\fP دستور پایهٔ عمومی API یعنی \fBYYMTAGN\fP را تعریف می‌کند. .TP .B \fBre2c:YYMTAGP\fP, \fBre2c:define:YYMTAGP\fP دستور پایهٔ عمومی API یعنی \fBYYMTAGP\fP را تعریف می‌کند. .TP .B \fBre2c:YYPEEK\fP, \fBre2c:define:YYPEEK\fP دستور پایهٔ عمومی API یعنی \fBYYPEEK\fP را تعریف می‌کند. .TP .B \fBre2c:YYRESTORE\fP, \fBre2c:define:YYRESTORE\fP دستور پایهٔ عمومی API یعنی \fBYYRESTORE\fP را تعریف می‌کند. .TP .B \fBre2c:YYRESTORECTX\fP, \fBre2c:define:YYRESTORECTX\fP دستور پایهٔ عمومی API یعنی \fBYYRESTORECTX\fP را تعریف می‌کند. .TP .B \fBre2c:YYRESTORETAG\fP, \fBre2c:define:YYRESTORETAG\fP دستور پایهٔ عمومی API یعنی \fBYYRESTORETAG\fP را تعریف می‌کند. .TP .B \fBre2c:YYSETCOND\fP, \fBre2c:define:YYSETCONDITION\fP دستور پایهٔ API یعنی \fBYYSETCOND\fP را تعریف می‌کند. .TP .B \fBre2c:YYSETCOND@cond\fP, \fBre2c:define:YYSETCONDITION@cond\fP علامت (sigil) مورد استفاده برای جایگزینی آرگومان را در تعریف \fBYYSETCOND\fP مشخص می‌کند. مقدار پیش‌فرض \fB@@\fP است. بر پیکربندی عمومی‌تر \fBre2c:api:sigil\fP اولویت دارد. .TP .B \fBre2c:YYSETCOND:naked\fP, \fBre2c:define:YYSETCONDITION:naked\fP بر پیکربندی عمومی‌تر \fBre2c:api:style\fP برای \fBYYSETCOND\fP اولویت دارد. مقدار صفر با سبک آزاد API (free\-form API style) مطابقت دارد. .TP .B \fBre2c:YYSETSTATE\fP, \fBre2c:define:YYSETSTATE\fP دستور پایهٔ API یعنی \fBYYSETSTATE\fP را تعریف می‌کند. .TP .B \fBre2c:YYSETSTATE@state\fP, \fBre2c:define:YYSETSTATE@state\fP علامت (sigil) مورد استفاده برای جایگزینی آرگومان را در تعریف \fBYYSETSTATE\fP مشخص می‌کند. مقدار پیش‌فرض \fB@@\fP است. بر پیکربندی عمومی‌تر \fBre2c:api:sigil\fP اولویت دارد. .TP .B \fBre2c:YYSETSTATE:naked\fP, \fBre2c:define:YYSETSTATE:naked\fP بر پیکربندی عمومی‌تر \fBre2c:api:style\fP برای \fBYYSETSTATE\fP اولویت دارد. مقدار صفر با سبک آزاد API (free\-form API style) مطابقت دارد. .TP .B \fBre2c:YYSETACCEPT\fP, \fBre2c:define:YYSETACCEPT\fP دستور پایهٔ API یعنی \fBYYSETACCEPT\fP را تعریف می‌کند. .TP .B \fBre2c:YYSKIP\fP, \fBre2c:define:YYSKIP\fP دستور پایهٔ عمومی API یعنی \fBYYSKIP\fP را تعریف می‌کند. .TP .B \fBre2c:YYSHIFT\fP, \fBre2c:define:YYSHIFT\fP دستور پایهٔ عمومی API یعنی \fBYYSHIFT\fP را تعریف می‌کند. .TP .B \fBre2c:YYCOPYMTAG\fP, \fBre2c:define:YYCOPYMTAG\fP دستور پایهٔ عمومی API یعنی \fBYYCOPYMTAG\fP را تعریف می‌کند. .TP .B \fBre2c:YYCOPYSTAG\fP, \fBre2c:define:YYCOPYSTAG\fP دستور پایهٔ عمومی API یعنی \fBYYCOPYSTAG\fP را تعریف می‌کند..TP .B \fBre2c:YYSHIFTMTAG\fP, \fBre2c:define:YYSHIFTMTAG\fP عنصر اولیهٔ API عمومیِ \fBYYSHIFTMTAG\fP را تعریف می‌کند\&. .TP .B \fBre2c:YYSHIFTSTAG\fP, \fBre2c:define:YYSHIFTSTAG\fP عنصر اولیهٔ API عمومیِ \fBYYSHIFTSTAG\fP را تعریف می‌کند\&. .TP .B \fBre2c:YYSTAGN\fP, \fBre2c:define:YYSTAGN\fP عنصر اولیهٔ API عمومیِ \fBYYSTAGN\fP را تعریف می‌کند\&. .TP .B \fBre2c:YYSTAGP\fP, \fBre2c:define:YYSTAGP\fP عنصر اولیهٔ API عمومیِ \fBYYSTAGP\fP را تعریف می‌کند\&. .TP .B \fBre2c:yyaccept\fP, \fBre2c:variable:yyaccept\fP عنصر اولیهٔ API با نام \fByyaccept\fP را تعریف می‌کند\&. .TP .B \fBre2c:yybm\fP, \fBre2c:variable:yybm\fP عنصر اولیهٔ API با نام \fByybm\fP را تعریف می‌کند\&. .TP .B \fBre2c:yybm:hex\fP, \fBre2c:variable:yybm:hex\fP در صورت تنظیم روی مقداری غیرصفر، نگاشت‌های بیتی برای گزینهٔ \fB\-\-bit\-vectors\fP در قالب هگزادسیمال تولید می‌شوند. مقدار پیش‌فرض صفر است (نگاشت‌های بیتی در قالب ده‌دهی هستند). .TP .B \fBre2c:yych\fP, \fBre2c:variable:yych\fP عنصر اولیهٔ API با نام \fByych\fP را تعریف می‌کند\&. .TP .B \fBre2c:yych:emit\fP, \fBre2c:variable:yych:emit\fP در صورت تنظیم روی صفر، تعریف \fByych\fP تولید نمی‌شود. مقدار پیش‌فرض غیرصفر است. .TP .B \fBre2c:yych:conversion\fP, \fBre2c:variable:yych:conversion\fP در صورت تنظیم روی مقداری غیرصفر، re2py هر بار که \fByych\fP خوانده می‌شود، به‌طور خودکار یک تبدیل به \fBYYCTYPE\fP تولید می‌کند. مقدار پیش‌فرض صفر است (بدون تبدیل). .TP .B \fBre2c:yych:literals\fP, \fBre2c:variable:yych:literals\fP قالب لیترال‌هایی را که \fByych\fP با آن‌ها مطابقت داده می‌شود مشخص می‌کند. مقادیر ممکن عبارتند از: \fBchar\fP (لیترال‌های نویسه‌ای درون علامت نقل‌قول تکی؛ موارد غیرقابل‌چاپ از دنباله‌های گریز که با بک‌اسلش شروع می‌شوند استفاده می‌کنند)، \fBhex\fP (اعداد صحیح هگزادسیمال)، و \fBchar_or_hex\fP (ترکیبی از هر دو؛ لیترال‌های نویسه‌ای برای نویسه‌های قابل‌چاپ و اعداد صحیح هگزادسیمال برای سایر موارد). .TP .B \fBre2c:yyctable\fP, \fBre2c:variable:yyctable\fP عنصر اولیهٔ API با نام \fByyctable\fP را تعریف می‌کند\&. .TP .B \fBre2c:yynmatch\fP, \fBre2c:variable:yynmatch\fP عنصر اولیهٔ API با نام \fByynmatch\fP را تعریف می‌کند\&. .TP .B \fBre2c:yypmatch\fP, \fBre2c:variable:yypmatch\fP عنصر اولیهٔ API با نام \fByypmatch\fP را تعریف می‌کند\&. .TP .B \fBre2c:yytarget\fP, \fBre2c:variable:yytarget\fP عنصر اولیهٔ API با نام \fByytarget\fP را تعریف می‌کند\&. .TP .B \fBre2c:yystable\fP, \fBre2c:variable:yystable\fP منسوخ شده است. .TP .B \fBre2c:yystate\fP, \fBre2c:variable:yystate\fP عنصر اولیهٔ API با نام \fByystate\fP را تعریف می‌کند\&. .TP .B \fBre2c:yyfill\fP, \fBre2c:variable:yyfill\fP عنصر اولیهٔ API با نام \fByyfill\fP را تعریف می‌کند\&. .TP .B \fBre2c:yyfill:check\fP در صورت تنظیم روی صفر، از تولید بررسی پیش از \fBYYFILL\fP برای تعداد نویسه‌های ورودی (تعریف \fBYYLESSTHAN\fP در API عمومی و مقایسهٔ مبتنی بر \fBYYLIMIT\fP در API اشاره‌گر C) جلوگیری می‌کند. مقدار پیش‌فرض غیرصفر است (بررسی تولید می‌شود). .TP .B \fBre2c:yyfill:enable\fP در صورت تنظیم روی صفر، از تولید \fBYYFILL\fP (به‌همراه بررسی آن) جلوگیری می‌کند. این مورد باید زمانی استفاده شود که کل ورودی در یک تکه حافظه جا می‌گیرد (نیازی به بافرسازی نیست) و بررسی‌های پایان ورودی به بررسی‌های \fBYYFILL\fP متکی نیستند (برای مثال اگر از یک نویسهٔ نگهبان [sentinel] استفاده شود). از هشدارها (گزینهٔ \fB\-W\fP) و پیکربندی \fBre2c:sentinel\fP استفاده کنید تا تأیید شود تحلیل‌گر لغوی تولیدشده نمی‌تواند فراتر از پایان ورودی را بخواند. مقدار پیش‌فرض غیرصفر است (\fBYYFILL\fP فعال است). .TP .B \fBre2c:yyfill:parameter\fP در صورت تنظیم روی صفر، از تولید پارامتر ارسالی به \fBYYFILL\fP جلوگیری می‌کند\&. این پارامتر حداقل تعداد نویسه‌هایی است که باید تأمین شوند. مقدار پیش‌فرض غیرصفر است (پارامتر تولید می‌شود). این پیکربندی می‌تواند توسط \fBre2c:YYFILL:naked\fP یا \fBre2c:api:style\fP بازنویسی شود\&. .TP .B \fBre2c:yyfn:sep\fP جداکنندهٔ مورداستفاده در عناصر \fBYYFN\fP را مشخص می‌کند (پیش‌فرض نقطه‌ویرگول است). .TP .B \fBre2c:yyfn:throw\fP استثناهای پرتاب‌شده توسط تابع \fBYYFN\fP را مشخص می‌کند (پیش‌فرض خالی است که به معنای نبود هیچ استثنایی می‌باشد). .UNINDENT.SS "عبارات باقاعده (Regular expressions)" .sp ابزار re2py از نحو زیر برای عبارات باقاعده استفاده می‌کند: .INDENT 0.0 .TP .B \fB\(dqfoo\(dq\fP رشته لفظی حساس به حروف بزرگ و کوچک. .TP .B \fB\(aqfoo\(aq\fP رشته لفظی غیرحساس به حروف بزرگ و کوچک. .TP .B \fB[a\-xyz]\fP، \fB[^a\-xyz]\fP کلاس نویسه (احتمالاً نقیض‌شده). .TP .B \fB\&.\fP هر نویسه‌ای به جز خط جدید (newline). .TP .B \fBR \e S\fP تفاضل کلاس‌های نویسه \fBR\fP و \fBS\fP\&. .TP .B \fBR*\fP صفر یا چند بار تکرار \fBR\fP\&. .TP .B \fBR+\fP یک یا چند بار تکرار \fBR\fP\&. .TP .B \fBR?\fP \fBR\fP اختیاری. .TP .B \fBR{n}\fP تکرار \fBR\fP دقیقاً \fBn\fP بار. .TP .B \fBR{n,}\fP تکرار \fBR\fP حداقل \fBn\fP بار. .TP .B \fBR{n,m}\fP تکرار \fBR\fP از \fBn\fP تا \fBm\fP بار. .TP .B \fB(R)\fP صرفاً \fBR\fP؛ از پرانتز برای تغییر تقدم استفاده می‌شود. اگر استخراج تطابق‌های فرعی (submatch extraction) فعال باشد، بسته به گزینه \fB\-\-invert\-captures\fP، \fB(R)\fP یک گروه گیرنده (capturing) یا غیرگیرنده (non\-capturing) خواهد بود. .TP .B \fB(!R)\fP در صورت فعال بودن استخراج تطابق‌های فرعی، بسته به گزینه \fB\-\-invert\-captures\fP، \fB(!R)\fP یک گروه غیرگیرنده یا گیرنده خواهد بود. .TP .B \fBR S\fP الحاق: \fBR\fP و به دنبال آن \fBS\fP\&. .TP .B \fBR | S\fP جایگزین: \fBR یا S\fP\&. .TP .B \fBR / S\fP پیش‌نگری (Lookahead): \fBR\fP و به دنبال آن \fBS\fP، اما \fBS\fP مصرف نمی‌شود. .TP .B \fBname\fP عبارت باقاعده تعریف‌شده به نام \fBname\fP (یا رشته لفظی \fB\(dqname\(dq\fP در حالت سازگاری با Flex). .TP .B \fB{name}\fP عبارت باقاعده تعریف‌شده به نام \fBname\fP در حالت سازگاری با Flex. .TP .B \fB@stag\fP یک \fIs\-tag\fP: آخرین موقعیت ورودی را که \fB@stag\fP در آن تطابق دارد، در متغیری با نام \fBstag\fP ذخیره می‌کند. .TP .B \fB#mtag\fP یک \fIm\-tag\fP: تمام موقعیت‌های ورودی را که \fB#mtag\fP در آن‌ها تطابق دارد، در متغیری با نام \fBmtag\fP ذخیره می‌کند. .TP .B \fB$\fP پایان ورودی. .UNINDENT .sp کلاس‌های نویسه و رشته‌های لفظی می‌توانند شامل توالی‌های گریز زیر باشند: \fB\ea\fP، \fB\eb\fP، \fB\ef\fP، \fB\en\fP، \fB\er\fP، \fB\et\fP، \fB\ev\fP، \fB\e\e\fP، گریزهای هشت‌هشتی \fB\eooo\fP و گریزهای شانزده‌شانزدهی \fB\exhh\fP، \fB\euhhhh\fP و \fB\eUhhhhhhhh\fP\&. .SS "کنش‌ها (Actions)" .sp در اینجا فهرستی از کنش‌های از پیش تعریف‌شده و مورد پشتیبانی re2py آمده است: .INDENT 0.0 .TP .B \fB!entry code\fP کنش ورود، یک بلوک از \fBcode\fP تعریف‌شده توسط کاربر را به حالت آغازین ماشین حالت متناهی فعلی پیوند می‌دهد. اگر از \fI\%start conditions\fP استفاده شود، کنش ورود را می‌توان به‌صورت جداگانه برای هر شرط تنظیم کرد. از این کنش می‌توان برای انجام مقداردهی اولیه، مثلاً ذخیره مکان شروع یک لکسم (lexeme)، استفاده کرد. .TP .B \fB!pre_rule code\fP کنش پیش‌قاعده، یک بلوک از \fBcode\fP تعریف‌شده توسط کاربر را به ابتدای کنش‌های معناییِ تمام قواعد در بلوک فعلی (یا شرط، در صورت استفاده از \fI\%start conditions\fP) اضافه می‌کند. از این کنش می‌توان برای فاکتور گرفتن بخش مشترک تمام کنش‌های معنایی (مانند ذخیره موقعیت پایان یک لکسم) استفاده کرد. .TP .B \fB!post_rule code\fP کنش پس‌قاعده، یک بلوک از \fBcode\fP تعریف‌شده توسط کاربر را به انتهای کنش‌های معناییِ تمام قواعد در بلوک فعلی (یا شرط، در صورت استفاده از \fI\%start conditions\fP) ضمیمه می‌کند. از این کنش می‌توان برای درج دستورهای تله (trap statements) جهت محافظت در برابر جریان کنترل ناخواسته استفاده کرد. .UNINDENT.SS "دستورالعمل‌ها (Directives)" .sp در اینجا فهرست کاملی از دستورالعمل‌های پشتیبانی‌شده توسط re2py آورده شده است: .INDENT 0.0 .TP .B \fB!use:name ;\fP یک دستورالعمل use درون‌بلوکی که یک بلوک قواعد از پیش تعریف‌شده با \fBname\fP مشخص‌شده را در بلوک فعلی ادغام می‌کند. تعاریف نام‌گذاری‌شده، پیکربندی‌ها و قواعد بلوک مرجع به بلوک فعلی افزوده می‌شوند. تداخل‌ها میان قواعد و پیکربندی‌های هم‌پوشان به روش معمول حل می‌شوند: نخستین قاعده اولویت دارد و آخرین پیکربندی بر موارد قبلی جایگزین می‌شود. یک استثنا، قواعد ویژه \fB*\fP، \fB$\fP و \fB\fP هستند که تعریف محلی درون بلوک همیشه برای آن‌ها اولویت دارد. دستورالعمل use می‌تواند در هر جای یک بلوک قرار گیرد و استفاده از چند دستورالعمل use مجاز است. .TP .B \fB!include file ;\fP این دستورالعمل همانند بلوک \fBinclude\fP عمل می‌کند: محتویات \fBfile\fP را عیناً در محل دستورالعمل درج می‌کند. .UNINDENT .SS "رابط برنامه (Program interface)" .sp کد تولیدشده به کمک \fIپریمیتیوها (primitives)\fP، که در مجموع به عنوان \fIAPI\fP شناخته می‌شوند، با برنامه بیرونی ارتباط برقرار می‌کند. این‌که کدام پریمیتیوها باید برای یک برنامه خاص تعریف شوند به عوامل متعددی بستگی دارد، از جمله پیچیدگی عبارات باقاعده، نحوه نمایش ورودی، بافرسازی و استفاده از ویژگی‌های گوناگون. همه پریمیتیوهای ضروری باید توسط کاربر در قالب ماکروها، توابع، متغیرها یا هر شکل مناسب دیگری که کد تولیدشده را از نظر نحوی و معنایی صحیح می‌سازد، تعریف شوند. re2py تعاریف را بررسی نمی‌کند (و نمی‌تواند بررسی کند)، بنابراین اگر موردی جا افتاده باشد یا به نادرستی تعریف شده باشد، ممکن است برنامه تولیدشده در زمان کامپایل یا زمان اجرا با خطا مواجه شود. این راهنما مثال‌هایی از تعاریف API در رایج‌ترین موارد ارائه می‌دهد. .sp ابزار re2py دارای سه سبک API است که مجموعه اصلی پریمیتیوهای مورداستفاده در یک برنامه را تعریف می‌کنند: .INDENT 0.0 .TP .B \fBSimple API\fP این API پیش‌فرض برای بک‌اند پایتون است. از پریمیتیوهای زیر تشکیل شده است: \fBYYINPUT\fP (که باید به عنوان دنباله‌ای از واحدهای کد، مانند یک رشته تعریف شود) و \fBYYCURSOR\fP، \fBYYMARKER\fP، \fBYYCTXMARKER\fP، \fBYYLIMIT\fP (که باید به عنوان اندیس‌هایی در \fBYYINPUT\fP تعریف شوند). .nf .fi .sp .TP .B \fBRecord API\fP رابط Record API در مواردی مفید است که وضعیت لکسر باید در یک کلاس ذخیره شود. این قابلیت با گزینه \fB\-\-api record\fP یا پیکربندی \fBre2c:api = record\fP فعال می‌شود. این API شامل متغیری به نام \fByyrecord\fP است (نام آن را می‌توان با \fBre2c:yyrecord\fP بازنویسی کرد) که باید به عنوان کلاسی با ویژگی‌های \fByyinput\fP، \fByycursor\fP، \fByymarker\fP، \fByyctxmarker\fP، \fByylimit\fP تعریف شود (تنها فیلدهایی که در کد تولیدشده استفاده می‌شوند نیاز به تعریف دارند و نام آن‌ها قابل پیکربندی است). .nf .fi .sp .TP .B \fBGeneric API\fP این منعطف‌ترین API است. این حالت با گزینه \fB\-\-api generic\fP یا پیکربندی \fBre2c:api = generic\fP فعال می‌شود. این API شامل پریمیتیوهایی برای عملیات عمومی است: \fBYYPEEK\fP، \fBYYSKIP\fP، \fBYYBACKUP\fP، \fBYYBACKUPCTX\fP، \fBYYSTAGP\fP، \fBYYSTAGN\fP، \fBYYMTAGP\fP، \fBYYMTAGN\fP، \fBYYRESTORE\fP، \fBYYRESTORECTX\fP، \fBYYRESTORETAG\fP، \fBYYSHIFT\fP، \fBYYSHIFTSTAG\fP، \fBYYSHIFTMTAG\fP، \fBYYLESSTHAN\fP، \fBYYEND\fP\&. .UNINDENT .sp در ادامه فهرست کاملی از پریمیتیوهای API که ممکن است توسط کد تولیدشده برای برقراری ارتباط با برنامه بیرونی استفاده شوند، آورده شده است. .INDENT 0.0 .TP .B \fBYYCTYPE\fP نوع نویسه‌های ورودی (واحدهای کد). برای کدگذاری‌های ASCII، EBCDIC و UTF\-8 باید یک عدد صحیح بدون علامت ۱ بایتی باشد. برای UTF\-16 یا UCS\-2 باید یک عدد صحیح بدون علامت ۲ بایتی باشد. برای UTF\-32 باید یک عدد صحیح بدون علامت ۴ بایتی باشد. .TP .B \fBYYCURSOR\fP یک l\-value که موقعیت فعلی ورودی را ذخیره می‌کند (یک اشاره‌گر یا آفست عددی در \fBYYINPUT\fP). در ابتدا \fBYYCURSOR\fP باید به نخستین نویسه ورودی اشاره کند و سپس توسط کد تولیدشده به جلو رانده می‌شود. هنگامی که یک قاعده مطابقت می‌یابد، موقعیت \fBYYCURSOR\fP برابر با موقعیت پس از آخرین نویسه منطبق‌شده خواهد بود. .TP .B \fBYYLIMIT\fP یک r\-value که موقعیت پایان ورودی را ذخیره می‌کند (یک اشاره‌گر یا آفست عددی در \fBYYINPUT\fP). در ابتدا \fBYYLIMIT\fP باید به موقعیت پس از آخرین نویسه ورودی موجود اشاره کند. این مقدار توسط کد تولیدشده تغییر نمی‌کند. لکسر \fBYYCURSOR\fP را با \fBYYLIMIT\fP مقایسه می‌کند تا تشخیص دهد آیا نویسه‌های ورودی کافی باقی مانده است یا خیر. .TP .B \fBYYMARKER\fP یک l\-value که موقعیت آخرین قاعده منطبق‌شده را ذخیره می‌کند (یک اشاره‌گر یا آفست عددی در \fBYYINPUT\fP). این مقدار برای بازگرداندن موقعیت \fBYYCURSOR\fP در صورتی که تطابق طولانی‌تر شکست بخورد و لکسر نیاز به عقب‌گرد (rollback) داشته باشد، استفاده می‌شود. نیازی به مقداردهی اولیه نیست. .TP .B \fBYYCTXMARKER\fP یک l\-value که موقعیت بافت پایانی (trailing context) را ذخیره می‌کند (یک اشاره‌گر یا آفست عددی در \fBYYINPUT\fP). نیازی به مقداردهی اولیه نیست. \fBYYCTXMARKER\fP تنها زمانی لازم است که عملگر پیش‌نگری \fB/\fP استفاده شده باشد. .TP .B \fBYYFILL\fP یک پریمیتیو Generic API با یک متغیر \fBlen\fP\&. \fBYYFILL\fP باید حداقل \fBlen\fP نویسه ورودی بیشتر فراهم کند یا با شکست مواجه شود. اگر از \fBre2c:eof\fP استفاده شود، مقدار \fBlen\fP همیشه \fB1\fP است و \fBYYFILL\fP همیشه باید به تابع فراخواننده بازگردد؛ مقدار بازگشتی صفر نشان‌دهنده موفقیت است. اگر از \fBre2c:eof\fP استفاده نشود، مقدار بازگشتی \fBYYFILL\fP نادیده گرفته می‌شود و در صورت شکست نباید بازگردد. حداکثر مقدار \fBlen\fP برابر با \fBYYMAXFILL\fP است. .TP .B \fBYYFN\fP پریمیتیوی که الگوی تابع را در مدل کد \fB\-\-recursive\-functions\fP تعریف می‌کند. مقدار آن باید آرایه‌ای از یک یا چند رشته باشد، که در آن هر رشته شامل دو یا سه مؤلفه جداشده با رشته مشخص‌شده در پیکربندی \fBre2c:fn:sep\fP (معمولاً نقطه ویرگول) است. نخستین عنصر آرایه، نام تابع و نوع بازگشتی آن را تعریف می‌کند (برای یک تابع void خالی است). عناصر بعدی آرگومان‌های تابع را تعریف می‌کنند: نخست، عبارت مربوط به آرگومان مورداستفاده در بدنه تابع (معمولاً فقط یک نام)؛ دوم، نوع آرگومان؛ سوم، پارامتر رسمی اختیاری (به طور پیش‌فرض همان مؤلفه نخست است \- معمولاً هر دوی آرگومان و پارامتر شناسه یکسانی هستند). .TP .B \fBYYINPUT\fP یک r\-value که دنباله نویسه‌های ورودی فعلی (رشته، بافر و غیره) را ذخیره می‌کند. .TP .B \fBYYMAXFILL\fP یک ثابت عدد صحیح برابر با حداکثر مقدار آرگومان \fBYYFILL\fP\&. این مقدار می‌تواند توسط یک بلوک \fBmax\fP تولید شود. .TP .B \fBYYLESSTHAN\fP یک پریمیتیو Generic API با یک متغیر \fBlen\fP\&. این مورد باید به عنوان یک r\-value از نوع بولی تعریف شود که اگر و تنها اگر کمتر از \fBlen\fP نویسه ورودی باقی مانده باشد، برابر با \fBtrue\fP است. .TP .B \fBYYEND\fP یک پریمیتیو Generic API بدون متغیر. باید به عنوان یک r\-value از نوع بولی تعریف شود که اگر و تنها اگر پایان \fIمنطقی\fP ورودی فرا رسیده باشد (به استثنای هرگونه پدینگ یا نمادهای نگهبان)، برابر با \fBtrue\fP است. \fBYYEND\fP برای پیاده‌سازی نماد \fB$\fP در عبارات باقاعده استفاده می‌شود. این با \fBYYLESSTHAN\fP، که برای اطمینان از عدم خواندن فراتر از انتهای بافر توسط لکسر به کار می‌رود، متفاوت است. .TP .B \fBYYPEEK\fP یک پریمیتیو Generic API بدون متغیر. باید به عنوان یک r\-value از نوع \fBYYCTYPE\fP تعریف شود که برابر با نویسه موجود در موقعیت فعلی ورودی است. .TP .B \fBYYSKIP\fP یک پریمیتیو Generic API که باید موقعیت فعلی ورودی را به اندازه یک واحد کد به جلو ببرد. .TP .B \fBYYBACKUP\fP یک پریمیتیو Generic API که باید موقعیت فعلی ورودی را ذخیره کند (تا بعداً با \fBYYRESTORE\fP بازیابی شود). .TP .B \fBYYRESTORE\fP یک پریمیتیو Generic API که باید موقعیت فعلی ورودی را به مقداری که توسط \fBYYBACKUP\fP ذخیره شده بازگرداند. .TP .B \fBYYBACKUPCTX\fP یک پریمیتیو Generic API که باید موقعیت فعلی ورودی را به عنوان موقعیت بافت پایانی ذخیره کند (تا بعداً با \fBYYRESTORECTX\fP بازیابی شود). .TP .B \fBYYRESTORECTX\fP یک پریمیتیو Generic API که باید موقعیت بافت پایانی ذخیره‌شده توسط \fBYYBACKUPCTX\fP را بازگرداند. .UNINDENT.TP .B \fBYYRESTORETAG\fP یک دستور اولیه عمومی API با یک متغیر \fBtag\fP که باید موقعیت بافت پس‌آیند (trailing context) را به مقدار \fBtag\fP بازگرداند\&. .TP .B \fBYYSTAGP\fP یک دستور اولیه عمومی API با یک متغیر \fBtag\fP، که در آن \fBtag\fP می‌تواند یک اشاره‌گر یا یک آفست در \fBYYINPUT\fP باشد (برای جزئیات به بخش استخراج تطابق‌های فرعی مراجعه کنید). \fBYYSTAGP\fP باید \fBtag\fP را روی موقعیت فعلی ورودی تنظیم کند. .TP .B \fBYYSTAGN\fP یک دستور اولیه عمومی API با یک متغیر \fBtag\fP، که در آن \fBtag\fP می‌تواند یک اشاره‌گر یا یک آفست در \fBYYINPUT\fP باشد (برای جزئیات به بخش استخراج تطابق‌های فرعی مراجعه کنید). \fBYYSTAGN\fP باید \fBtag\fP را روی مقداری تنظیم کند که نشان‌دهندهٔ موقعیت ورودی ناموجود است. .TP .B \fBYYMTAGP\fP یک دستور اولیه عمومی API با یک متغیر \fBtag\fP\&. \fBYYMTAGP\fP باید موقعیت فعلی را به تاریخچهٔ تطابق‌های فرعی \fBtag\fP ضمیمه کند (برای جزئیات به بخش استخراج تطابق‌های فرعی مراجعه کنید). .TP .B \fBYYMTAGN\fP یک دستور اولیه عمومی API با یک متغیر \fBtag\fP\&. \fBYYMTAGN\fP باید مقداری را که نشان‌دهندهٔ موقعیت ورودی ناموجود است، به تاریخچهٔ تطابق‌های فرعی \fBtag\fP ضمیمه کند (برای جزئیات به بخش استخراج تطابق‌های فرعی مراجعه کنید). .TP .B \fBYYSHIFT\fP یک دستور اولیه عمومی API با یک متغیر \fBshift\fP که باید موقعیت فعلی ورودی را به اندازهٔ \fBshift\fP نویسه جابه‌جا کند (مقدار جابه‌جایی می‌تواند منفی باشد). .TP .B \fBYYCOPYSTAG\fP یک دستور اولیه عمومی API با دو متغیر، \fBlhs\fP و \fBrhs\fP، که باید متغیر s\-tag سمت راست (\fBrhs\fP) را در متغیر s\-tag سمت چپ (\fBlhs\fP) رونوشت کند\&. برای بیشتر زبان‌ها این دستور اولیه تعریفی پیش‌فرض دارد که \fBlhs\fP را به \fBrhs\fP انتساب می‌دهد\&. .TP .B \fBYYCOPYMTAG\fP یک دستور اولیه عمومی API با دو متغیر، \fBlhs\fP و \fBrhs\fP، که باید متغیر m\-tag سمت راست (\fBrhs\fP) را در متغیر m\-tag سمت چپ (\fBlhs\fP) رونوشت کند\&. برای بیشتر زبان‌ها این دستور اولیه تعریفی پیش‌فرض دارد که \fBlhs\fP را به \fBrhs\fP انتساب می‌دهد\&. .TP .B \fBYYSHIFTSTAG\fP یک دستور اولیه عمومی API با دو متغیر، \fBtag\fP و \fBshift\fP، که باید \fBtag\fP را به اندازهٔ \fBshift\fP واحد کد جابه‌جا کند (مقدار جابه‌جایی می‌تواند منفی باشد). .TP .B \fBYYSHIFTMTAG\fP یک دستور اولیه عمومی API با دو متغیر، \fBtag\fP و \fBshift\fP، که باید آخرین مقدار در تاریخچهٔ \fBtag\fP را به اندازهٔ \fBshift\fP واحد کد جابه‌جا کند (مقدار جابه‌جایی می‌تواند منفی باشد). .TP .B \fBYYMAXNMATCH\fP یک ثابت عددی صحیح برابر با بیشینهٔ تعداد گروه‌های ضبط‌کنندهٔ POSIX در یک قاعده. این مقدار با یک بلوک \fBmaxnmatch\fP تولید می‌شود. .TP .B \fBYYCONDTYPE\fP نوع شمارشی (enum) وضعیت. این مورد می‌تواند یا با بلوک \fBconditions\fP یا با گزینهٔ \fB\-\-header\fP تولید شود. .TP .B \fBYYGETACCEPT\fP یک دستور اولیه با یک متغیر \fBvar\fP که انتخاب‌گر عددی قاعدهٔ پذیرفته‌شده را ذخیره می‌کند. برای بیشتر زبان‌ها این دستور اولیه تعریفی پیش‌فرض دارد که از \fBvar\fP می‌خواند\&. .TP .B \fBYYSETACCEPT\fP یک دستور اولیه با دو متغیر: \fBvar\fP (یک l\-value که انتخاب‌گر عددی قاعدهٔ پذیرفته‌شده را ذخیره می‌کند) و \fBval\fP (مقدار انتخاب‌گر). برای بیشتر زبان‌ها این دستور اولیه تعریفی پیش‌فرض دارد که \fBvar\fP را به \fBval\fP انتساب می‌دهد\&. .TP .B \fBYYGETCOND\fP یک r\-value از نوع \fBYYCONDTYPE\fP که برابر با شناسهٔ وضعیت فعلی است. .TP .B \fBYYSETCOND\fP یک دستور اولیه با یک متغیر \fBcond\fP که باید شناسهٔ وضعیت فعلی را روی \fBcond\fP تنظیم کند\&. .TP .B \fBYYGETSTATE\fP یک r\-value از نوع عدد صحیح که برابر با وضعیت فعلی تحلیل‌گر لغوی است. مقدار اولیهٔ آن باید روی \fB\-1\fP تنظیم شود\&. .TP .B \fBYYSETSTATE\fP یک دستور اولیه با یک متغیر \fBstate\fP که باید وضعیت فعلی تحلیل‌گر لغوی را روی \fBstate\fP تنظیم کند\&. .TP .B \fBYYDEBUG\fP این دستور اولیه فقط با گزینهٔ \fB\-d\fP، \fB\-\-debug\-output\fP تولید می‌شود. هدف آن افزودن ثبت وقایع به کد تولیدشده است (تعریف معمول \fBYYDEBUG\fP یک دستور چاپ است). دستورات \fBYYDEBUG\fP در هر وضعیت تولید می‌شوند و دو متغیر دارند: \fBstate\fP (یا نمایهٔ وضعیت DFA یا \fB\-1\fP) و \fBsymbol\fP (نماد ورودی فعلی). .TP .B \fByyaccept\fP یک l\-value از نوع عدد صحیح بدون علامت که شمارهٔ آخرین قاعدهٔ مطابقت‌یافته را ذخیره می‌کند. تعریف توسط کاربر تنها همراه با گزینهٔ \fB\-\-storable\-state\fP الزامی است. .TP .B \fByybm\fP جدولی حاوی نقشه‌های بیتی فشرده‌شده برای حداکثر ۸ گذار (همراه با گزینهٔ \fB\-\-bitmaps\fP استفاده می‌شود). این جدول شامل ۲۵۶ عنصر است و با واحدهای کد ۱\-بایتی نمایه‌گذاری می‌شود. هر عنصر ۸\-بیتی مقادیر بولی را برای حداکثر ۸ گذار ترکیب می‌کند. بیت k\-اُم از عنصر n\-اُم درست (true) است اگر و تنها اگر n\-اُمین واحد کد در محدودهٔ k\-اُمین گذار باشد. ایدهٔ این نقشه بیتی جایگزینی چندین شاخهٔ \fIif\fP یا حالت \fIswitch\fP با بررسی یک تک‌بیت در جدول است. .TP .B \fByych\fP یک l\-value از نوع \fBYYCTYPE\fP که نویسهٔ ورودی فعلی را ذخیره می‌کند. تعریف توسط کاربر تنها با گزینهٔ \fB\-f\fP \fB\-\-storable\-state\fP الزامی است. .TP .B \fByyctable\fP جدول پرش تولیدشده برای توزیع اولیه وضعیت (فعال‌شده با ترکیب گزینه‌های \fB\-\-conditions\fP و \fB\-\-computed\-gotos\fP). .TP .B \fByyfill\fP یک l\-value که نتیجهٔ فراخوانی \fBYYFILL\fP را ذخیره می‌کند (این ممکن است برای زبان‌های کاملاً تابعی ضروری باشد، که در آن‌ها \fBYYFILL\fP یک تابع مونادیک با مقدار بازگشتی پیچیده است). .TP .B \fByynmatch\fP یک l\-value از نوع عدد صحیح بدون علامت که تعداد گروه‌های ضبط‌کنندهٔ POSIX را در قاعدهٔ مطابقت‌یافته ذخیره می‌کند. تنها با گزینهٔ \fB\-P\fP \fB\-\-posix\-captures\fP استفاده می‌شود. .TP .B \fByypmatch\fP آرایه‌ای از l\-valueها که برای نگهداری مقادیر برچسب متناظر با پرانتزهای ضبط‌کننده در قاعدهٔ منطبق‌شده استفاده می‌شوند. طول آرایه باید حداقل \fByynmatch * 2\fP باشد (معمولاً \fBYYMAXNMATCH * 2\fP انتخاب مناسبی است). تنها با گزینهٔ \fB\-P\fP \fB\-\-posix\-captures\fP استفاده می‌شود. .TP .B \fByystable\fP منسوخ شده است. .TP .B \fByystate\fP یک l\-value که همراه با گزینهٔ \fB\-\-loop\-switch\fP برای ذخیرهٔ وضعیت فعلی DFA استفاده می‌شود. .TP .B \fByytarget\fP جدول پرش که شامل مقاصد پرش (نشانی‌های برچسب) برای تمامی گذارها از یک وضعیت است. این جدول برای هر وضعیت محلی است. تولید جدول‌های \fByytarget\fP با گزینهٔ \fB\-\-computed\-gotos\fP فعال می‌شود. .UNINDENT.SS "گزینه‌ها (OPTIONS)" .sp برخی از گزینه‌ها دارای \fI\%پیکربندی‌های\fP متناظر هستند، برخی دیگر سراسری بوده و پس از شروع خواندن فایل ورودی توسط re2c قابل تغییر نیستند. گزینه‌های اشکال‌زدایی (debug) عموماً نیاز به ساخت re2c در پیکربندی اشکال‌زدایی دارند. گزینه‌های داخلی برای آزمایش الگوریتم‌های استفاده‌شده در re2c مفید هستند. .INDENT 0.0 .TP .B \fB\-? \-\-help \-h\fP نمایش پیام راهنما. .TP .B \fB\-\-api \fP مشخص کردن API استفاده‌شده توسط کد تولیدشده جهت ارتباط با کد تعریف‌شده توسط کاربر. گزینه \fBsimple\fP باید در موارد ساده‌ای استفاده شود که نیازی به پر کردن مجدد بافر و ذخیره وضعیت تحلیل‌گر لغوی (lexer) وجود ندارد. گزینه \fBrecord\fP باید زمانی استفاده شود که وضعیت lexer باید در یک رکورد (struct، class و غیره) ذخیره شود. گزینه \fBgeneric\fP باید در موارد پیچیده‌ای استفاده شود که دو API دیگر به اندازه کافی انعطاف‌پذیر نیستند. .TP .B \fB\-\-bit\-vectors \-b\fP بهینه‌سازی پرش‌های شرطی با استفاده از ماسک‌های بیتی (bit masks). این گزینه مستلزم \fB\-\-nested\-ifs\fP است\&. .TP .B \fB\-\-captures\fP, \fB\-\-leftmost\-captures\fP فعال‌سازی استخراج تطابق فرعی (submatch) با گروه‌های گیرنده حریصانه چپ‌ترین (leftmost greedy). نتیجه در آرایه \fByybmatch\fP با ظرفیت \fB2 * YYMAXNMATCH\fP ذخیره شده، و \fByynmatch\fP روی تعداد گروه‌های قاعده تطابق تنظیم می‌شود. .TP .B \fB\-\-captvars\fP, \fB\-\-leftmost\-captvars\fP فعال‌سازی استخراج تطابق فرعی با گروه‌های گیرنده حریصانه چپ‌ترین. نتیجه در متغیرهای \fByytl\fP و \fByytr\fP برای \fBk\fP\-امین گروه گیرنده جمع‌آوری می‌شود. .TP .B \fB\-\-case\-insensitive\fP رفتار با رشته‌های درون نقل‌قول تکی و جفتی به‌صورت غیرحساس به بزرگی و کوچکی حروف. .TP .B \fB\-\-case\-inverted\fP معکوس کردن معنای رشته‌های با علامت نقل‌قول تکی و جفتی: رشته‌های درون نقل‌قول تکی حساس به بزرگی و کوچکی حروف و رشته‌های درون نقل‌قول جفتی غیرحساس به حروف در نظر گرفته می‌شوند. .TP .B \fB\-\-case\-ranges\fP فشرده‌سازی caseهای متوالی در دستورات switch به بازه‌ای به فرم \fBlow ... high\fP\&. این نحو یک افزونه زبان C/C++ است که توسط کامپایلرهایی مانند GCC، Clang و Tcc پشتیبانی می‌شود. مزیت اصلی نسبت به استفاده از caseهای تکی، تولید کد کوچک‌تر و سرعت تولید بیشتر است، اگرچه برای برخی کامپایلرها مانند Tcc منجر به حجم دودویی (binary) کوچک‌تر نیز می‌شود. .TP .B \fB\-\-computed\-gotos \-g\fP بهینه‌سازی پرش‌های شرطی با استفاده از افزونه غیراستاندارد \(dqcomputed goto\(dq (که باید توسط کامپایلر پشتیبانی شود). re2py جدول‌های پرش را فقط در موارد پیچیده با انشعاب‌های شرطی فراوان تولید می‌کند. آستانه پیچیدگی را می‌توان با پیکربندی \fBcgoto:threshold\fP تنظیم کرد. آفست‌های نسبی را می‌توان با پیکربندی \fBcgoto:relative\fP فعال کرد. این گزینه مستلزم \fB\-\-bit\-vectors\fP است\&. .TP .B \fB\-\-computed\-gotos\-relative\fP مشابه \-\-computed\-gotos اما در عوض آفست‌های نسبی را برای جدول‌های پرش تولید می‌کند (که باید توسط کامپایلر پشتیبانی شود). این گزینه مستلزم \fB\-\-computed\-gotos\fP است\&. .TP .B \fB\-\-conditions \-\-start\-conditions \-c\fP فعال‌سازی پشتیبانی از \(dqشرط‌ها\(dq شبیه به Flex: چندین تحلیل‌گر لغوی مرتبط با یکدیگر درون یک بلوک. این یک جایگزین برای مشخص کردن دستی بلوک‌های مختلف re2py متصل‌شده با \fBgoto\fP یا فراخوانی توابع است. .TP .B \fB\-\-depfile FILE\fP نوشتن اطلاعات وابستگی در \fBFILE\fP در قالب یک قاعده Makefile به صورت \fB : [include\-file ...]\fP\&. این امکان ردیابی وابستگی‌های ساخت را در حضور بلوک‌ها/دستورالعمل‌های \fBinclude\fP فراهم می‌کند، به طوری که به‌روزرسانی فایل‌های include باعث بازتولید فایل خروجی می‌شود. این گزینه به گزینه \fB\-\-output\fP وابسته است. .TP .B \fB\-\-ebcdic \-\-ecb \-e\fP تولید تحلیل‌گر لغوی که ورودی را با کدگذاری EBCDIC می‌خواند. re2py فرض می‌کند که محدوده نویسه‌ها 0 \-\- 0xFF و اندازه نویسه ۱ بایت است. .TP .B \fB\-\-empty\-class \fP تعریف نحوه رفتار re2py با کلاس‌های نویسه خالی. با \fBmatch\-empty\fP (پیش‌فرض) کلاس خالی با ورودی خالی تطابق می‌یابد (که غیرمنطقی است، اما سازگار با نسخه‌های پیشین است). با \fBmatch\-none\fP کلاس خالی همیشه در تطابق شکست می‌خورد. با \fBerror\fP کلاس خالی خطای کامپایل ایجاد می‌کند. .TP .B \fB\-\-encoding\-policy \fP تعریف نحوه رفتار re2py با جانشین‌های یونیکد (Unicode surrogates). با \fBfail\fP، برنامه re2py هنگام برخورد با یک جانشین با خطا متوقف می‌شود. با \fBsubstitute\fP، برنامه re2py بی‌صدا جانشین‌ها را با نقطه کد خطای 0xFFFD جایگزین می‌کند. با \fBignore\fP (پیش‌فرض)، برنامه re2py با جانشین‌ها مانند نقاط کد معمولی رفتار می‌کند. استاندارد یونیکد بیان می‌کند که جانشین‌های تنها نامعتبر هستند، اما کتابخانه‌ها و برنامه‌ها در دنیای واقعی رفتارهای متفاوتی نشان می‌دهند. .TP .B \fB\-\-flex\-syntax \-F\fP پشتیبانی جزئی از نحو Flex: در این حالت تعاریف نام‌گذاری‌شده نیازی به علامت مساوی و سمی‌کولن پایانی ندارند، و هنگام استفاده باید درون آکولاد قرار گیرند. نام‌های بدون آکولاد به عنوان رشته‌های درون نقل‌قول جفتی در نظر گرفته می‌شوند. .TP .B \fB\-\-goto\-label\fP استفاده از مدل کد \(dqgoto/label\(dq: کدگذاری DFA در قالب بلوک‌های کد برچسب‌دار متصل‌شده با انتقال‌های \fBgoto\fP بین بلوک‌ها. این تنها برای زبان‌هایی پشتیبانی می‌شود که دارای دستور \fBgoto\fP هستند. .TP .B \fB\-\-header \-\-type\-header \-t HEADER\fP تولید یک فایل \fBHEADER\fP. محتویات فایل را می‌توان با استفاده از بلوک‌های ویژه \fBheader:on\fP و \fBheader:off\fP مشخص کرد\&. در صورت استفاده از شرط‌ها، هدر تولیدشده به‌طور خودکار یک enum شرط الحاق‌شده خواهد داشت (مگر اینکه بلوک \fBconditions\fP صریحی وجود داشته باشد). .TP .B \fB\-I PATH\fP افزودن \fBPATH\fP به فهرست مکان‌هایی که هنگام جستجو برای فایل‌های include استفاده می‌شوند. این گزینه در ترکیب با بلوک یا دستورالعمل \fBinclude\fP مفید است. برنامه re2py به دنبال \fBFILE\fP در دایرکتوری فایل والد و مکان‌های include مشخص‌شده با گزینه \fB\-I\fP می‌گردد. .TP .B \fB\-\-input \fP نام مستعار منسوخ‌شده برای \fB\-\-api\fP\&. گزینه \fBdefault\fP متناظر با \fBsimple\fP است (در واقع برای بیشتر backendها پیش‌فرض است، اما نه برای همه). گزینه \fBcustom\fP متناظر با \fBgeneric\fP است\&. .TP .B \fB\-\-input\-encoding \fP مشخص کردن نحوه تجزیه عبارات باقاعده توسط re2py. با \fBascii\fP (پیش‌فرض) re2py با ورودی با کدگذاری ASCII رفتار می‌کند: هر دنباله‌ای از واحدهای کد یک دنباله از نویسه‌های تک‌بایتی مستقل است. با \fButf8\fP برنامه re2py با ورودی با کدگذاری UTF8 رفتار کرده و نویسه‌های چندبایتی را تشخیص می‌دهد. .TP .B \fB\-\-invert\-captures\fP معکوس کردن مفهوم گروه‌های گیرنده و غیرگیرنده. به‌طور پیش‌فرض \fB(...)\fP گیرنده است و \fB(! ...)\fP غیرگیرنده است. با این گزینه \fB(! ...)\fP گیرنده و \fB(...)\fP غیرگیرنده خواهد بود. .TP .B \fB\-\-lang \fP مشخص کردن زبان مقصد. زبان‌های پشتیبانی‌شده عبارتند از C، D، Go، Haskell، Java، JS، OCaml، Python، Rust، Swift، V، Zig (زبان‌های بیشتری را می‌توان از طریق فایل‌های نحو تعریف‌شده توسط کاربر اضافه کرد؛ گزینه \fB\-\-syntax\fP را ببینید). گزینه \fBnone\fP پیکربندی‌های نحو پیش‌فرض را غیرفعال می‌کند، به‌طوری که زبان مقصد تعریف‌نشده باقی می‌ماند. .TP .B \fB\-\-location\-format \fP مشخص کردن قالب مکان در پیام‌ها. با \fBgnu\fP مکان‌ها به‌صورت \(aqfilename:line:column: ...\(aq چاپ می‌شوند. با \fBmsvc\fP مکان‌ها به‌صورت \(aqfilename(line,column) ...\(aq چاپ می‌شوند. پیش‌فرض \fBgnu\fP است\&. .TP .B \fB\-\-loop\-switch\fP استفاده از مدل کد \(dqloop/switch\(dq: کدگذاری DFA در قالب یک حلقه روی یک دستور switch، که در آن هر حالت یک case از switch است. حالت در یک متغیر \fByystate\fP ذخیره می‌شود\&. انتقال بین حالت‌ها \fByystate\fP را به برچسب case حالت مقصد به‌روزرسانی کرده و اجرا را به ابتدای حلقه ادامه می‌دهد. .TP .B \fB\-\-nested\-ifs \-s\fP استفاده از دستورات تو در توی \fBif\fP به جای دستورات \fBswitch\fP در پرش‌های شرطی. این معمولاً در کامپایلرهای غیربهینه‌ساز منجر به کد کارآمدتری می‌شود. .TP .B \fB\-\-no\-debug\-info \-i\fP عدم تولید خروجی دستورالعمل‌های خط. این گزینه می‌تواند زمانی که کد تولیدشده در یک سیستم کنترل نسخه ذخیره می‌شود مفید باشد (برای جلوگیری از تغییرات بزرگ (diff) خودکار در تغییرات کوچک). .TP .B \fB\-\-no\-generation\-date\fP عدم درج تاریخ در فایل تولیدشده. .TP .B \fB\-\-no\-version\fP عدم درج نسخه در فایل تولیدشده. .TP .B \fB\-\-no\-unsafe\fP عدم تولید لفاف \fBunsafe\fP روی \fBYYPEEK\fP (این گزینه مختص Rust است). به دلایل کارایی \fBYYPEEK\fP باید از بررسی حدود (bounds\-checking) اجتناب کند، زیرا تحلیل‌گر لغوی از قبل بررسی‌های پایان ورودی را به شیوه‌ای کارآمدتر انجام می‌دهد. کاربر ممکن است تصمیم بگیرد تعریف امنی از \fBYYPEEK\fP، یا تعریفی که فقط در ساخت‌های انتشار (release) ناامن است ارائه دهد، که در این حالت گزینه \fB\-\-no\-unsafe\fP به جلوگیری از هشدارهای مربوط به بلوک‌های \fBunsafe\fP اضافه کمک می‌کند. .TP .B \fB\-\-output \-o OUTPUT\fP مشخص کردن فایل خروجی \fBOUTPUT\fP. .TP .B \fB\-\-posix\-captures\fP, \fB\-P\fP فعال‌سازی استخراج تطابق فرعی با گروه‌های گیرنده به سبک POSIX. نتیجه در آرایه \fByybmatch\fP با ظرفیت \fB2 * YYMAXNMATCH\fP ذخیره شده، و \fByynmatch\fP روی تعداد گروه‌های قاعده تطابق تنظیم می‌شود..TP .B \fB\-\-posix\-captvars\fP فعال‌سازی استخراج زیرتطابق با گروه‌های گیرنده به سبک POSIX. نتیجه برای \fBk\fP\-امین گروه گیرنده در متغیرهای \fByytl\fP و \fByytr\fP جمع‌آوری می‌شود. .TP .B \fB\-\-recursive\-functions\fP استفاده از مدل کد مبتنی بر توابع هم‌بازگشتی (co\-recursive)، که در آن هر وضعیت DFA یک تابع مجزا است که می‌تواند توابع وضعیت‌های دیگر یا خودش را فراخوانی کند. .TP .B \fB\-\-reusable \-r\fP از نسخه 2.2 منسوخ شده است (بلوک‌های با قابلیت استفاده مجدد اکنون به طور پیش‌فرض مجاز هستند). .TP .B \fB\-\-skeleton \-S\fP نادیده گرفتن کد واسط تعریف‌شده توسط کاربر و تولید یک برنامه خودکفای \(dqskeleton\(dq (اسکلتی). علاوه بر این، فایل‌های ورودی با رشته‌های مشتق‌شده از گرامر باقاعده و نتایج تطابق فشرده‌شده تولید می‌شوند که برای اعتبارسنجی رفتار \(dqskeleton\(dq روی تمام ورودی‌ها به کار می‌روند. این گزینه برای یافتن باگ‌ها در بهینه‌سازی‌ها و تولید کد مفید است. این گزینه فقط برای C پشتیبانی می‌شود. .TP .B \fB\-\-storable\-state \-f\fP تولید یک تحلیل‌گر لغوی (lexer) که می‌تواند وضعیت درونی خود را ذخیره کند. این قابلیت در لکسرهای مبتنی بر مدل push که هنگام نبود ورودی کافی توسط یک برنامه بیرونی متوقف شده و پس از در دسترس قرار گرفتن ورودی بیشتر ادامه می‌یابند، مفید است. در این حالت، کاربران باید علاوه بر این توابع اولیه‌ی \fBYYGETSTATE\fP و \fBYYSETSTATE\fP را تعریف کنند و متغیرهای \fByych\fP، \fByyaccept\fP و \fBstate\fP باید بخشی از وضعیت ذخیره‌شده‌ی لکسر باشند. .TP .B \fB\-\-syntax FILE\fP بارگذاری پیکربندی‌ها از \fBFILE\fP مشخص‌شده و اعمال آن‌ها بر روی فایل نحو پیش‌فرض. توجه داشته باشید که \fBFILE\fP می‌تواند تنها چند پیکربندی را تعریف کند (اگر برای اصلاح فایل نحو پیش‌فرض استفاده شود)، یا یک بک‌اند زبان کاملاً جدید را تعریف نماید (در حالت دوم توصیه می‌شود از گزینه \fB\-\-lang none\fP استفاده شود). .TP .B \fB\-\-tags \-T\fP فعال‌سازی استخراج زیرتطابق با تگ‌ها. .TP .B \fB\-\-ucs2 \-\-wide\-chars \-w\fP تولید لکسری که ورودی کدگذاری‌شده با UCS2 را می‌خواند. برنامه re2py فرض می‌کند که محدوده نویسه‌ها 0 \-\- 0xFFFF و اندازه نویسه ۲ بایت است. این گزینه مستلزم \fB\-\-nested\-ifs\fP است\&. .TP .B \fB\-\-utf8 \-\-utf\-8 \-8\fP تولید لکسری که ورودی را در کدگذاری UTF\-8 می‌خواند. برنامه re2py فرض می‌کند که محدوده نویسه‌ها 0 \-\- 0x10FFFF و اندازه نویسه ۱ بایت است. .TP .B \fB\-\-utf16 \-\-utf\-16 \-x\fP تولید لکسری که ورودی کدگذاری‌شده با UTF16 را می‌خواند. برنامه re2py فرض می‌کند که محدوده نویسه‌ها 0 \-\- 0x10FFFF و اندازه نویسه ۲ بایت است. این گزینه مستلزم \fB\-\-nested\-ifs\fP است\&. .TP .B \fB\-\-utf32 \-\-unicode \-u\fP تولید لکسری که ورودی کدگذاری‌شده با UTF32 را می‌خواند. برنامه re2py فرض می‌کند که محدوده نویسه‌ها 0 \-\- 0x10FFFF و اندازه نویسه ۴ بایت است. این گزینه مستلزم \fB\-\-nested\-ifs\fP است\&. .TP .B \fB\-\-verbose\fP چاپ یک پیام کوتاه در صورت موفقیت. .TP .B \fB\-\-vernum \-V\fP نمایش اطلاعات نسخه در قالب \fBMMmmpp\fP (اصلی، فرعی، وصله). .TP .B \fB\-\-version \-v\fP نمایش اطلاعات نسخه. .TP .B \fB\-\-single\-pass \-1\fP منسوخ شده است. کاری انجام نمی‌دهد (حالت تک‌گذره اکنون پیش‌فرض است). .UNINDENT .INDENT 0.0 .TP .B \fB\-\-debug\-output \-d\fP قرار دادن فراخوانی‌های \fBYYDEBUG\fP در کد تولیدشده. این گزینه برای ردگیری اجرای لکسر مفید است. .TP .B \fB\-\-dump\-adfa\fP گزینه اشکال‌زدایی: خروجی دادن DFA پس از تونل‌زنی (در قالب .dot). .TP .B \fB\-\-dump\-cfg\fP گزینه اشکال‌زدایی: خروجی دادن گراف جریان کنترل (CFG) متغیرهای تگ (در قالب .dot). .TP .B \fB\-\-dump\-closure\-stats\fP گزینه اشکال‌زدایی: خروجی دادن آمار درباره تعداد وضعیت‌ها در بستار (closure). .TP .B \fB\-\-dump\-dfa\-det\fP گزینه اشکال‌زدایی: خروجی دادن DFA بلافاصله پس از قطعی‌سازی (در قالب .dot). .TP .B \fB\-\-dump\-dfa\-min\fP گزینه اشکال‌زدایی: خروجی دادن DFA پس از کمینه‌سازی (در قالب .dot). .TP .B \fB\-\-dump\-dfa\-tagopt\fP گزینه اشکال‌زدایی: خروجی دادن DFA پس از بهینه‌سازی‌های تگ (در قالب .dot). .TP .B \fB\-\-dump\-dfa\-tree\fP گزینه اشکال‌زدایی: خروجی دادن DFA در حال ساخت با وضعیت‌هایی که به صورت درخت‌های تاریخچه تگ نمایش داده شده‌اند (در قالب .dot). .TP .B \fB\-\-dump\-dfa\-raw\fP گزینه اشکال‌زدایی: خروجی دادن DFA در حال ساخت با مجموعه‌وضعیت‌های گسترش‌یافته (در قالب .dot). .TP .B \fB\-\-dump\-interf\fP گزینه اشکال‌زدایی: خروجی دادن جدول تداخل تولیدشده توسط تحلیل زنده‌بودن (liveness analysis) متغیرهای تگ. .TP .B \fB\-\-dump\-nfa\fP گزینه اشکال‌زدایی: خروجی دادن NFA (در قالب .dot). .TP .B \fB\-\-emit\-dot \-D\fP تولید گراف لکسر در قالب .dot به جای خروجی عادی. خروجی می‌تواند به کمک Graphviz به یک تصویر تبدیل شود (برای مثال دستوری مانند \fBdot \-Tpng \-odfa.png dfa.dot\fP). .UNINDENT .INDENT 0.0 .TP .B \fB\-\-dfa\-minimization \fP گزینه درونی: الگوریتم کمینه‌سازی DFA مورداستفاده توسط re2py\&. گزینه \fBmoore\fP همان الگوریتم مور (Moore) است (که پیش‌فرض می‌باشد). گزینه \fBtable\fP الگوریتم \(dqtable filling\(dq (پر کردن جدول) است. هر دو الگوریتم باید DFA یکسانی، صرف‌نظر از برچسب‌گذاری مجدد وضعیت‌ها تولید کنند؛ الگوریتم پر کردن جدول ساده‌تر و بسیار کندتر بوده و به عنوان پیاده‌سازی مرجع عمل می‌کند. .TP .B \fB\-\-eager\-skip\fP گزینه درونی: وادار کردن لکسر تولیدشده به جلو بردن موقعیت ورودی به صورت مشتاقانه (eagerly) \-\- بلافاصله پس از خواندن نماد ورودی. این گزینه رفتار پیش‌فرض را که در آن موقعیت ورودی به صورت تنبلانه (lazily) \-\- پس از انتقال به وضعیت بعدی جلو برده می‌شود، تغییر می‌دهد. .TP .B \fB\-\-no\-lookahead\fP گزینه درونی، منسوخ‌شده. این گزینه برای فعال‌سازی الگوریتم TDFA(0) به کار می‌رفت. بر خلاف TDFA(1)، الگوریتم TDFA(0) از پیش‌نگری تک‌نمادی استفاده نمی‌کند. این الگوریتم عملیات ثبات‌ها را به جای انتقال‌های خروجی، روی انتقال‌های ورودی اعمال می‌کند. ارزیابی‌های عملکرد نشان داد که الگوریتم TDFA(0) کارایی کمتری نسبت به TDFA(1) دارد. .TP .B \fB\-\-no\-optimize\-tags\fP گزینه درونی: جلوگیری از بهینه‌سازی متغیرهای تگ (مفید برای اشکال‌زدایی). .TP .B \fB\-\-posix\-closure \fP گزینه درونی: تعیین الگوریتم کوتاه‌ترین مسیر مورداستفاده برای ساخت بستار اپسیلون (epsilon\-closure) با معناشناسی رفع ابهام POSIX: مقدار \fBgor1\fP (پیش‌فرض) نمایانگر الگوریتم گلدبرگ\-رادزیک (Goldberg\-Radzik) است و \fBgtop\fP نمایانگر الگوریتم \(dqglobal topological order\(dq (ترتیب توپولوژیکی سراسری) می‌باشد. .TP .B \fB\-\-posix\-prectable \fP گزینه درونی: تعیین الگوریتم مورداستفاده برای محاسبه جدول اولویت POSIX. الگوریتم \fBcomplex\fP جدول اولویت را در یک پیمایش از درخت تاریخچه تگ محاسبه می‌کند و دارای پیچیدگی مرتبه دوم بر حسب تعداد وضعیت‌های TNFA است؛ این گزینه پیش‌فرض است. الگوریتم \fBnaive\fP در بدترین حالت دارای پیچیدگی مکعبی (مرتبه سه) بر حسب تعداد وضعیت‌های TNFA است، اما بسیار ساده‌تر از \fBcomplex\fP بوده و ممکن است در موارد غیرپاتولوژیک اندکی سریع‌تر باشد. .TP .B \fB\-\-stadfa\fP گزینه درونی، منسوخ‌شده. این گزینه برای فعال‌سازی الگوریتم staDFA به کار می‌رفت، که تفاوت آن با TDFA در این است که عملیات ثبات به جای انتقال‌ها در وضعیت‌ها قرار می‌گیرند. ارزیابی‌های عملکرد نشان داد که الگوریتم staDFA کارایی کمتری نسبت به TDFA دارد. .TP .B \fB\-\-fixed\-tags \fP گزینه درونی: تعیین اینکه آیا بهینه‌سازی تگ ثابت (fixed\-tag) باید روی همه تگ‌ها (\fBall\fP)، هیچ‌کدام از آن‌ها (\fBnone\fP)، یا فقط تگ‌های موجود در الحاق سطح بالا (\fBtoplevel\fP) اعمال شود یا خیر. مقدار پیش‌فرض \fBall\fP است\&. تگ‌های «ثابت» (\(dqFixed\(dq) تگ‌هایی هستند که در فاصله ثابتی از یک تگ دیگر (موسوم به «پایه» یا \(dqbase\(dq) قرار دارند. در چنین مواردی فقط تگ پایه باید ردیابی شود و مقدار تگ ثابت می‌تواند برابر با مقدار تگ پایه به علاوه یک آفست ایستا محاسبه گردد. برای تگ‌هایی که تحت انتخاب جایگزین یا تکرار قرار دارند، بررسی اینکه آیا تگ پایه مقدار عدم تطابق (no\-match) دارد یا خیر نیز الزامی است (در این حالت تگ ثابت نیز باید بدون در نظر گرفتن آفست روی no\-match تنظیم شود). برای تگ‌های موجود در الحاق سطح بالا نیازی به این بررسی نیست، زیرا آن‌ها همیشه مطابقت دارند. .UNINDENT.SS "هشدارها (Warnings)" .sp هشدارها را می‌توان به‌صورت جداگانه فعال یا غیرفعال کرد و یا به یک خطا تبدیل نمود. .INDENT 0.0 .TP .B \fB\-W\fP فعال‌سازی تمام هشدارها. .TP .B \fB\-Werror\fP تبدیل هشدارها به خطا. توجه داشته باشید که این گزینه به‌تنهایی هیچ هشداری را فعال نمی‌کند؛ بلکه تنها بر هشدارهایی تأثیر می‌گذارد که تاکنون فعال شده‌اند یا بعداً فعال خواهند شد. .TP .B \fB\-W\fP فعال‌سازی \fBwarning\fP\&. .TP .B \fB\-Wno\-\fP غیرفعال‌سازی \fBwarning\fP\&. .TP .B \fB\-Werror\-\fP فعال‌سازی \fBwarning\fP و تلقی آن به‌عنوان خطا (این گزینه متضمن \fB\-W\fP است). .TP .B \fB\-Wno\-error\-\fP عدم تلقی این \fBwarning\fP خاص به‌عنوان خطا. این گزینه خودِ هشدار را غیرفعال نمی‌کند. .UNINDENT .INDENT 0.0 .TP .B \fB\-Wcondition\-order\fP هشدار در صورتی که برنامهٔ تولیدشده فرضیات ضمنی دربارهٔ شماره‌گذاری شرط‌ها داشته باشد. باید از گزینهٔ \fB\-\-header\fP یا بلوک \fBconditions\fP برای تولید نگاشت نام‌های شرط به شماره‌ها استفاده شود و سپس از نام‌های شرط تولیدشدهٔ خودکار استفاده گردد. .TP .B \fB\-Wempty\-character\-class\fP هشدار در صورتی که یک عبارت باقاعده حاوی یک ردهٔ نویسه‌ای خالی باشد. تلاش برای تطبیق یک ردهٔ نویسه‌ای خالی بی‌معنی است: این عمل همیشه باید ناموفق باشد. با این حال، به دلایل سازگاری با نسخه‌های پیشین، re2py رده‌های نویسه‌ای خالی را مجاز دانسته و با آن‌ها مانند رشته‌های خالی رفتار می‌کند. برای تغییر رفتار پیش‌فرض از گزینهٔ \fB\-\-empty\-class\fP استفاده کنید. .TP .B \fB\-Wmatch\-empty\-string\fP هشدار در صورتی که یک قاعده تهی‌پذیر باشد (با یک رشتهٔ خالی تطبیق یابد). اگر تحلیل‌گر لغوی در یک حلقه اجرا شود و تطبیق خالی ناخواسته باشد، ممکن است تحلیل‌گر لغوی به‌طور غیرمنتظره در یک حلقهٔ بی‌پایان معلق شود. .TP .B \fB\-Wswapped\-range\fP هشدار در صورتی که کران پایین یک بازه بزرگ‌تر از کران بالای آن باشد. رفتار پیش‌فرض جابه‌جایی خاموش کران‌های بازه است. .TP .B \fB\-Wundefined\-control\-flow\fP هشدار در صورتی که برخی از رشته‌های ورودی باعث ایجاد جریان کنترل تعریف‌نشده در تحلیل‌گر لغوی شوند (الگوهای ناقص گزارش می‌شوند). این یک خطای خطرناک و رایج است. این مشکل را می‌توان به‌سادگی با افزودن قاعدهٔ پیش‌فرض \fB*\fP که کمترین اولویت را دارد، با هر واحد کد مطابقت دارد و همیشه یک واحد کد را مصرف می‌کند، برطرف کرد. .TP .B \fB\-Wunreachable\-rules\fP هشدار دربارهٔ قواعدی که توسط قواعد دیگر پوشانده شده‌اند (shadowed) و هرگز مطابقت نخواهند یافت. .TP .B \fB\-Wdeprecated\-eof_rule\fP هشدار دربارهٔ قواعد مستقل پایان ورودی \fB$\fP که با تغییرات آینده از کار خواهند افتاد و نیازمند اصلاح هستند. در حال حاضر، این قواعد هنگام تداخل با سایر قواعد اولویت دارند، اما پس از معرفی نماد تعمیم‌یافتهٔ پایان ورودی \fB$\fP، ترتیب اولویت تغییر خواهد کرد و این قواعد توسط قواعد دیگر پوشانده خواهند شد. .TP .B \fB\-Wuseless\-escape\fP هشدار در صورتی که یک نماد در جایی که نباید، گریز داده شود (escaped). به‌طور پیش‌فرض، re2py به‌صورت خاموش چنین گریزهایی را نادیده می‌گیرد، اما این مورد می‌تواند نشان‌دهندهٔ یک غلط تایپی یا خطایی در توالی گریز نیز باشد. .TP .B \fB\-Wnondeterministic\-tags\fP هشدار در صورتی که یک برچسب دارای درجهٔ \fBn\fP\-ام از عدم‌قطعیت باشد، که در آن \fBn\fP بزرگ‌تر از ۱ است. .TP .B \fB\-Wsentinel\-in\-midrule\fP هشدار در صورتی که نماد نگهبان (sentinel) در میانهٔ یک قاعده رخ دهد \-\-\- این امر ممکن است باعث خواندن فراتر از انتهای بافر، از کار افتادگی یا خرابی حافظه در تحلیل‌گر لغوی تولیدشده شود. این هشدار تنها در صورتی اعمال می‌شود که از روش نگهبان برای بررسی پایان ورودی استفاده شده باشد. در صورت استفاده از پیکربندی \fBre2c:sentinel\fP، این وضعیت تبدیل به خطا می‌شود. .TP .B \fB\-Wundefined\-syntax\-config\fP هشدار در صورتی که فایل نحو مشخص‌شده با گزینهٔ \fB\-\-syntax\fP فاقد تعاریف برخی از پیکربندی‌ها باشد. این به نگهداری فایل‌های نحو تعریف‌شده توسط کاربر کمک می‌کند: اگر نسخهٔ جدیدی پیکربندی‌هایی را اضافه کند، فایل نحو قدیمی یک هشدار ایجاد کرده و کاربر مطلع خواهد شد. اگر برخی از پیکربندی‌ها استفاده نمی‌شوند و نیازی به تعریف ندارند، باید صراحتاً روی \fB\fP تنظیم شوند. .UNINDENT.SS فایل‌های نحو (Syntax files) .sp پشتیبانی از زبان‌های گوناگون در re2c بر پایه ایده \fIفایل‌های نحو\fP\& (syntax files) استوار است. یک فایل نحو، فایلی پیکربندی است که نحو زبان مقصد را تعریف می‌کند \-\- نه کل زبان، بلکه بخش کوچکی از آن را که توسط کد تولیدشده استفاده می‌شود. فایل‌های نحو، re2c را بسیار انعطاف‌پذیر می‌کنند، اما نباید به عنوان جایگزینی برای پیکربندی‌های \fBre2c:\fP استفاده شوند: هدف آن‌ها تعریف نحو زبان مقصد است، نه سفارشی‌سازی یک تحلیل‌گر لغوی خاص. تمام زبان‌های پشتیبانی‌شده دارای فایل‌های نحو پیش‌فرضی هستند که بخشی از توزیع به شمار می‌روند (زیرپوشه \fBinclude/syntax\fP را ببینید)؛ آن‌ها همچنین در باینری re2py تعبیه شده‌اند. کاربران می‌توانند یک فایل نحو سفارشی ارائه دهند که چند پیکربندی را برای یکی از زبان‌های پشتیبانی‌شده بازنویسی می‌کند، یا می‌توانند همه پیکربندی‌ها را مجدداً تعریف کنند (در این حالت باید از گزینه \fB\-\-lang none\fP استفاده شود). فایل‌های نحو شامل پیکربندی‌هایی از چهار نوع مختلف هستند: فهرست ویژگی‌ها، پیکربندی‌های زبان، پیکربندی‌های درجا و الگوهای کد. .sp \fBفهرست ویژگی‌ها (Feature lists)\fP .INDENT 0.0 .INDENT 3.5 چند پیکربندی فهرستی، ویژگی‌های مختلف پشتیبانی‌شده توسط یک بک‌اند مشخص را تعریف می‌کنند تا در صورتی که کاربر برای فعال‌سازی یک ویژگی پشتیبانی‌نشده تلاش کند، re2py بتواند خطای واضحی صادر کند: .INDENT 0.0 .TP .B \fBsupported_apis\fP فهرستی از APIهای پشتیبانی‌شده با عناصر ممکنِ \fBsimple\fP، \fBrecord\fP، \fBgeneric\fP\&. .TP .B \fBsupported_api_styles\fP فهرستی از شیوه‌های API پشتیبانی‌شده با عناصر ممکنِ \fBfunctions\fP، \fBfree\-form\fP\&. .TP .B \fBsupported_code_models\fP فهرستی از مدل‌های کد پشتیبانی‌شده با عناصر ممکنِ \fBgoto\-label\fP، \fBloop\-switch\fP، \fBrecursive\-functions\fP\&. .TP .B \fBsupported_targets\fP فهرستی از مقاصد تولید کد پشتیبانی‌شده با عناصر ممکنِ \fBcode\fP، \fBdot\fP، \fBskeleton\fP\&. .TP .B \fBsupported_features\fP فهرستی از ویژگی‌های پشتیبانی‌شده با عناصر ممکنِ \fBnested\-ifs\fP، \fBbitmaps\fP، \fBcomputed\-gotos\fP، \fBcase\-ranges\fP، \fBmonadic\fP، \fBunsafe\fP، \fBtags\fP، \fBcaptures\fP، \fBcaptvars\fP\&. .UNINDENT .UNINDENT .UNINDENT .sp \fBپیکربندی‌های زبان (Language configurations)\fP .INDENT 0.0 .INDENT 3.5 چند پیکربندی بولی، ویژگی‌هایی از زبان مقصد را توصیف می‌کنند که بر تجزیه‌کننده (parser) و تولیدکننده کد re2py تأثیر می‌گذارند: .INDENT 0.0 .TP .B \fBsemicolons\fP غیرصفر اگر زبان پس از عبارات از نقطه‌ویرگول (semicolon) استفاده کند. .TP .B \fBbacktick_quoted_strings\fP غیرصفر اگر زبان از رشته‌های درون بک‌تیک پشتیبانی کند. .TP .B \fBsingle_quoted_strings\fP غیرصفر اگر زبان از رشته‌های درون نقل‌قول تکی پشتیبانی کند. .TP .B \fBindentation_sensitive\fP غیرصفر اگر زبان به تورفتگی حساس باشد. .TP .B \fBwrap_blocks_in_braces\fP غیرصفر اگر گزاره‌های مرکب باید درون آکولاد محصور شوند. .UNINDENT .UNINDENT .UNINDENT .sp \fBپیکربندی‌های درجا (Inplace configurations)\fP .INDENT 0.0 .INDENT 3.5 فایل‌های نحو، مقادیر اولیه تمام پیکربندی‌های \fBre2c:\fP را تعریف می‌کنند، زیرا ممکن است این مقادیر برای زبان‌های مختلف متفاوت باشند. برای مشاهده فهرست کاملی از تمام پیکربندی‌های درجا و معنای آن‌ها، به بخش پیکربندی‌ها مراجعه کنید. .UNINDENT .UNINDENT .sp \fBالگوهای کد (Code templates)\fP .INDENT 0.0 .INDENT 3.5 الگوهای کد، نحو زبان مقصد را تعریف می‌کنند. آن‌ها در یک زبان دامنه-خاص (DSL) ساده با گرامر صوری زیر نوشته می‌شوند: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C code\-template :: name \(aq=\(aq code\-exprs \(aq;\(aq | CODE_TEMPLATE \(aq;\(aq | \(aq\(aq \(aq;\(aq code\-exprs :: | code\-exprs code\-expr code\-expr :: STRING | VARIABLE | optional | list optional :: \(aq(\(aq CONDITIONAL \(aq?\(aq code\-exprs \(aq)\(aq | \(aq(\(aq CONDITIONAL \(aq?\(aq code\-exprs \(aq:\(aq code\-exprs \(aq)\(aq list :: \(aq[\(aq VARIABLE \(aq:\(aq code\-exprs \(aq]\(aq | \(aq[\(aq VARIABLE \(aq{\(aq NUMBER \(aq}\(aq \(aq:\(aq code\-exprs \(aq]\(aq | \(aq[\(aq VARIABLE \(aq{\(aq NUMBER \(aq,\(aq NUMBER \(aq}\(aq \(aq:\(aq code\-exprs \(aq]\(aq .ft P .fi .UNINDENT .UNINDENT .sp یک الگوی کد، دنباله‌ای از رشته‌های الفاظ، متغیرها، عناصر اختیاری و فهرست‌ها، یا ارجاعی به یک الگوی کد دیگر، یا مقدار ویژه \fB\fP است. متغیرها جای‌نماهایی (placeholders) هستند که در مرحله تولید کد جایگزین می‌شوند. متغیرهای فهرستی خاص هستند: هنگام گسترش الگوهای فهرستی، re2py عبارت‌های سمت راست دو‌نقطه را چند بار تکرار می‌کند و هر بار رخدادهای متغیر فهرستی را با مقداری مختص به این تکرار جایگزین می‌نماید. فهرست‌ها کران‌های اختیاری دارند (مقادیر منفی از انتها شمرده می‌شوند، برای نمونه \fB\-1\fP به معنای آخرین عنصر است). نام‌های شرطی با یک نقطه آغاز می‌شوند. هر دوی شرط‌ها و متغیرها می‌توانند محلی (مختص به الگوی کد داده‌شده) یا سراسری (مجاز در تمام الگوهای کد) باشند. هنگامی که re2py یک فایل نحو را می‌خواند، بررسی می‌کند که هر الگوی کد تنها از متغیرها و شرط‌هایی استفاده کند که در آن مجاز هستند. .sp برای نمونه، الگوی کد زیر ساختار if\-then\-else را برای یک زبان شبه C تعریف می‌کند: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C code:if_then_else = [branch{0}: topindent \(dqif \(dq cond \(dq {\(dq nl indent [stmt: stmt] dedent] [branch{1:\-1}: topindent \(dq} else\(dq (.cond ? \(dq if \(dq cond) \(dq {\(dq nl indent [stmt: stmt] dedent] topindent \(dq}\(dq nl; .ft P .fi .UNINDENT .UNINDENT .sp در اینجا \fBbranch\fP یک متغیر فهرستی است: \fBbranch{0}\fP به شاخه نخست گسترش می‌یابد (که ویژه است، زیرا بخش \fBelse\fP ندارد)، و \fBbranch{1:\-1}\fP به تمام شاخه‌های باقی‌مانده (در صورت وجود) گسترش می‌یابد. \fBstmt\fP نیز یک متغیر فهرستی است: \fB[stmt: stmt]\fP یک فهرست تودرتو است که به فهرستی از دستورها در بدنه شاخه جاری بسط می‌یابد. \fBtopindent\fP، \fBindent\fP، \fBdedent\fP و \fBnl\fP متغیرهای سراسری هستند، و \fB\&.cond\fP یک شرط محلی است (معنای آن‌ها در ادامه توضیح داده شده است). این الگوی کد می‌تواند کد زیر را تولید کند: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C if x { // do something } else if y { // do something else } else { // don\(aqt do anything } .ft P .fi .UNINDENT .UNINDENT .sp در ادامه فهرستی از تمام الگوهای کد پشتیبانی‌شده توسط re2py به همراه متغیرها و شرط‌های محلی آن‌ها آمده است. توجه داشته باشید که یک تعریف خاص می‌تواند، اما الزامی ندارد که از متغیرها و شرط‌های محلی استفاده کند. هر الگوی کد استفاده‌نشده باید روی \fB\fP تنظیم شود. .INDENT 0.0.TP .B \fBcode:var_local\fP اعلان یا تعریف یک متغیر محلی. متغیرهای پشتیبانی‌شده: \fBtype\fP (نوع متغیر)، \fBname\fP (نام آن) و \fBinit\fP (مقدار اولیه، در صورت وجود). شرط‌ها: \fB\&.init\fP (اگر مقداردهنده اولیه وجود داشته باشد درست است). .TP .B \fBcode:var_global\fP مشابه \fBcode:var_local\fP، با این تفاوت که در سطح بالا (top\-level) استفاده می‌شود. .TP .B \fBcode:const_local\fP تعریف یک ثابت محلی. متغیرهای پشتیبانی‌شده: \fBtype\fP (نوع ثابت)، \fBname\fP (نام آن) و \fBinit\fP (مقدار اولیه). .TP .B \fBcode:const_global\fP مشابه \fBcode:const_local\fP، با این تفاوت که در سطح بالا (top\-level) استفاده می‌شود. .TP .B \fBcode:array_local\fP تعریف یک آرایه (جدول) محلی. متغیرهای پشتیبانی‌شده: \fBtype\fP (نوع عناصر آرایه)، \fBname\fP (نام آرایه)، \fBsize\fP (اندازه آن)، \fBrow\fP (یک متغیر فهرستی که به خودی خود کدی تولید نمی‌کند، اما عبارت فهرست را به تعداد سطرها در جدول گسترش می‌دهد) و \fBelem\fP (یک متغیر فهرستی که به تمام عناصر جدول در سطر فعلی گسترش می‌یابد \-\- در نظر گرفته شده تا در فهرست \fBrow\fP تودرتو شود). شرط پشتیبانی‌شده: \fB\&.const\fP (اگر آرایه غیرقابل تغییر باشد درست است). .TP .B \fBcode:array_global\fP مشابه \fBcode:array_local\fP، با این تفاوت که در سطح بالا (top\-level) استفاده می‌شود. .TP .B \fBcode:array_elem\fP ارجاع به عنصری از یک آرایه (جدول). متغیرهای پشتیبانی‌شده: \fBarray\fP (نام آرایه) و \fBindex\fP (شاخص عنصر). .TP .B \fBcode:enum\fP تعریف یک شمارش (می‌تواند با استفاده از یک ساختار زبانی ویژه برای شمارش‌ها تعریف شود، یا صرفاً به‌صورت چند ثابت مستقل). متغیرهای پشتیبانی‌شده عبارتند از \fBtype\fP (نوع شمارش تعریف‌شده توسط کاربر یا نوع ثابت‌ها)، \fBelem\fP (متغیر فهرستی که به نام هر عضو گسترش می‌یابد) و \fBinit\fP (مقداردهنده اولیه برای هر عضو). شرط‌ها: \fB\&.init\fP (اگر مقداردهنده اولیه وجود داشته باشد درست است). .TP .B \fBcode:enum_elem\fP عنصر شمارش (عضوی از نوع شمارش تعریف‌شده توسط کاربر یا نام یک ثابت، بسته به نحوه تعریف \fBcode:enum\fP). متغیرهای پشتیبانی‌شده عبارتند از \fBname\fP (نام عنصر) و \fBtype\fP (نوع آن). .TP .B \fBcode:assign\fP دستور انتساب. متغیرهای پشتیبانی‌شده عبارتند از \fBlhs\fP (سمت چپ) و \fBrhs\fP (سمت راست). .TP .B \fBcode:type_int\fP نوع عدد صحیح علامت‌دار. .TP .B \fBcode:type_uint\fP نوع عدد صحیح بدون علامت. .TP .B \fBcode:type_yybm\fP نوع عناصر در جدول \fByybm\fP. .TP .B \fBcode:type_yytarget\fP نوع عناصر در جدول \fByytarget\fP. .TP .B \fBcode:type_yyctable\fP نوع عناصر در جدول \fByyctable\fP. .TP .B \fBcode:cmp_eq\fP عملگر \(dqبرابر با\(dq. .TP .B \fBcode:cmp_ne\fP عملگر \(dqنابرابر با\(dq. .TP .B \fBcode:cmp_lt\fP عملگر \(dqکوچک‌تر از\(dq. .TP .B \fBcode:cmp_gt\fP عملگر \(dqبزرگ‌تر از\(dq. .TP .B \fBcode:cmp_le\fP عملگر \(dqکوچک‌تر یا مساوی\(dq. .TP .B \fBcode:cmp_ge\fP عملگر \(dqبزرگ‌تر یا مساوی\(dq. .TP .B \fBcode:if_then_else\fP دستور If\-then\-else با یک یا چند شاخه. متغیرهای پشتیبانی‌شده: \fBbranch\fP (یک متغیر فهرستی که به خودی خود کدی تولید نمی‌کند، اما عبارت فهرست را به تعداد شاخه‌ها گسترش می‌دهد)، \fBcond\fP (شرط شاخه فعلی) و \fBstmt\fP (یک متغیر فهرستی که به تمام دستورها در شاخه فعلی گسترش می‌یابد). شرط‌ها: \fB\&.cond\fP (اگر شاخه فعلی دارای شرط باشد درست است)، \fB\&.many\fP (اگر بیش از یک شاخه وجود داشته باشد درست است). .TP .B \fBcode:if_then_else_oneline\fP یک حالت خاص از \fBcode:if_then_else\fP برای زمانی که تمام شاخه‌ها دستورهای یک‌خطی دارند. اگر این مقدار \fB\fP باشد، به جای آن از \fBcode:if_then_else\fP استفاده می‌شود. .TP .B \fBcode:switch\fP یک دستور switch با یک یا چند case. متغیرهای پشتیبانی‌شده: \fBexpr\fP (عبارت ارزیابی‌شده در switch) و \fBcase\fP (یک متغیر فهرستی که به تمام گروه‌های case به همراه بلوک کد مربوط به آن‌ها گسترش می‌یابد). .TP .B \fBcode:switch_cases\fP گروهی از caseهای switch که به یک بلوک کد واحد نگاشت می‌شوند. متغیرهای پشتیبانی‌شده عبارتند از \fBcase\fP (یک متغیر فهرستی که به تمام caseها در این گروه گسترش می‌یابد) و \fBstmt\fP (یک متغیر فهرستی که به تمام دستورها در بلوک کد گسترش می‌یابد). .TP .B \fBcode:switch_cases_oneline\fP یک حالت خاص از \fBcode:switch_cases\fP برای حالتی که بلوک کد شامل یک دستور یک‌خطی منفرد است. اگر این مقدار \fB\fP باشد، به جای آن از \fBcode:switch_cases\fP استفاده می‌شود. .TP .B \fBcode:switch_case_range\fP یک case منفرد switch که محدوده‌ای از مقادیر را پوشش می‌دهد (احتمالاً شامل یک مقدار منفرد). متغیر پشتیبانی‌شده: \fBval\fP (یک متغیر فهرستی که به تمام مقادیر موجود در محدوده گسترش می‌یابد). شرط‌های پشتیبانی‌شده: \fB\&.many\fP (اگر بیش از یک مقدار در محدوده وجود داشته باشد درست است) و \fB\&.char_literals\fP (اگر این یک switch روی لیترال‌های نویسه‌ای باشد درست است \-\- برخی زبان‌ها نحو ویژه‌ای را برای این حالت فراهم می‌کنند). .TP .B \fBcode:switch_case_default\fP حالت پیش‌فرض (default) در دستور switch. .TP .B \fBcode:loop\fP حلقه‌ای که برای همیشه اجرا می‌شود (مگر اینکه از درون بدنه حلقه متوقف شود). متغیرهای پشتیبانی‌شده: \fBlabel\fP (برچسب حلقه)، \fBstmt\fP (یک متغیر فهرستی که به تمام دستورها در بدنه حلقه گسترش می‌یابد). .TP .B \fBcode:continue\fP دستور continue. متغیرهای پشتیبانی‌شده: \fBlabel\fP (برچسبی که اجرای برنامه باید از آن ادامه یابد). .TP .B \fBcode:goto\fP دستور goto. متغیرهای پشتیبانی‌شده: \fBlabel\fP (برچسب مقصد پرش). .TP .B \fBcode:cgoto\fP دستور \fBgoto\fP محاسباتی. متغیرهای پشتیبانی‌شده: \fBarray\fP (جدول حاوی اطلاعات \fBgoto\fP محاسباتی)، \fBindex\fP (شاخص عنصر در جدول) و \fBbase\fP (برچسب پایه، تنها زمانی استفاده می‌شود که \fB\&.cgoto.relative\fP درست باشد). .TP .B \fBcode:cgoto:data\fP عبارت مقداردهنده اولیه برای یک عنصر منفرد در جدول \fBgoto\fP محاسباتی. متغیرهای پشتیبانی‌شده: \fBlabel\fP (برچسبی که برای مقداردهی اولیه به عنصر فعلی استفاده می‌شود)، \fBtype\fP (نوع زیرین عناصر در جدول) و \fBbase\fP (برچسب پایه \- تنها زمانی استفاده می‌شود که \fB\&.cgoto.relative\fP درست باشد). .TP .B \fBcode:fndecl\fP اعلان تابع. متغیرهای پشتیبانی‌شده: \fBname\fP (نام تابع)، \fBtype\fP (نوع بازگشتی)، \fBthrow\fP (استثناهای پرتاب‌شده توسط این تابع، به پیکربندی \fBre2c:yyfn:throw\fP نگاشت می‌شود)، \fBarg\fP (یک متغیر فهرستی که به خودی خود کدی تولید نمی‌کند، اما عبارت فهرست را به تعداد آرگومان‌های تابع گسترش می‌دهد)، \fBargname\fP (نام آرگومان فعلی)، \fBargtype\fP (نوع آرگومان فعلی). شرط: \fB\&.type\fP (اگر تابع غیر از نوع void باشد درست است). .TP .B \fBcode:fndef\fP مشابه \fBcode:fndecl\fP، اما برای تعریف تابع استفاده می‌شود، بنابراین دارای یک متغیر فهرستی اضافی \fBstmt\fP است که به تمام دستورها در بدنه تابع گسترش می‌یابد. .TP .B \fBcode:fncall\fP دستور فراخوانی تابع. متغیرهای پشتیبانی‌شده: \fBname\fP (نام تابع)، \fBretval\fP (مقدار l\-value که مقدار بازگشتی در آن ذخیره می‌شود، در صورت وجود) و \fBarg\fP (یک متغیر فهرستی که به تمام آرگومان‌های تابع گسترش می‌یابد). شرط‌ها: \fB\&.args\fP (اگر تابع دارای آرگومان باشد درست است) و \fB\&.retval\fP (اگر نیاز به ذخیره مقدار بازگشتی باشد درست است). .TP .B \fBcode:tailcall\fP دستور فراخوانی دم (tail call). متغیرهای پشتیبانی‌شده: \fBname\fP (نام تابع)، و \fBarg\fP (یک متغیر فهرستی که به تمام آرگومان‌های تابع گسترش می‌یابد). شرط‌ها: \fB\&.args\fP (اگر تابع دارای آرگومان باشد درست است) و \fB\&.retval\fP (اگر تابع غیر از نوع void باشد درست است). .TP .B \fBcode:recursive_functions\fP بدنه برنامه با مدل کد \fB\-\-recursive\-functions\fP. متغیرهای پشتیبانی‌شده: \fBfn\fP (یک متغیر فهرستی که به خودی خود کدی تولید نمی‌کند، اما عبارت فهرست را به تعداد توابع گسترش می‌دهد)، \fBfndecl\fP (اعلان تابع فعلی) و \fBfndef\fP (تعریف تابع فعلی)..TP .B \fBcode:fingerprint\fP اثرانگشت (fingerprint) در بالای فایل خروجی تولیدشده. متغیرهای پشتیبانی‌شده: \fBver\fP (نسخهٔ re2py مورداستفاده برای تولید آن) و \fBdate\fP (تاریخ تولید). .TP .B \fBcode:line_info\fP قالب دستورالعمل‌های خط (اگر این مقدار روی \fB\fP تنظیم شود، هیچ دستورالعملی تولید نمی‌شود). متغیرهای پشتیبانی‌شده: \fBline\fP (شمارهٔ خط) و \fBfile\fP (نام فایل). .TP .B \fBcode:abort\fP دستوری که اجرای برنامه را ساقط (abort) می‌کند. .TP .B \fBcode:yydebug\fP دستور \fBYYDEBUG\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYDEBUG\fP، \fByyrecord\fP، \fByych\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBstate\fP (شماره وضعیت DFA). .TP .B \fBcode:yypeek\fP دستور \fBYYPEEK\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYPEEK\fP، \fBYYCTYPE\fP، \fBYYINPUT\fP، \fBYYCURSOR\fP، \fByyrecord\fP، \fByych\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP). شرط‌ها: \fB\&.cast\fP (درست اگر \fBre2c:yych:conversion\fP روی مقداری غیر از صفر تنظیم شده باشد). .TP .B \fBcode:yyskip\fP دستور \fBYYSKIP\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYSKIP\fP، \fBYYCURSOR\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP). .TP .B \fBcode:yybackup\fP دستور \fBYYBACKUP\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYBACKUP\fP، \fBYYCURSOR\fP، \fBYYMARKER\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP). .TP .B \fBcode:yybackupctx\fP دستور \fBYYBACKUPCTX\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYBACKUPCTX\fP، \fBYYCURSOR\fP، \fBYYCTXMARKER\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP). .TP .B \fBcode:yyskip_yypeek\fP دستور ترکیبی \fBcode:yyskip\fP و \fBcode:yypeek\fP (پیش‌فرض \fBcode:yyskip\fP و به دنبال آن \fBcode:yypeek\fP است). .TP .B \fBcode:yypeek_yyskip\fP دستور ترکیبی \fBcode:yypeek\fP و \fBcode:yyskip\fP (پیش‌فرض \fBcode:yypeek\fP و به دنبال آن \fBcode:yyskip\fP است). .TP .B \fBcode:yyskip_yybackup\fP دستور ترکیبی \fBcode:yyskip\fP و \fBcode:yybackup\fP (پیش‌فرض \fBcode:yyskip\fP و به دنبال آن \fBcode:yybackup\fP است). .TP .B \fBcode:yybackup_yyskip\fP دستور ترکیبی \fBcode:yybackup\fP و \fBcode:yyskip\fP (پیش‌فرض \fBcode:yybackup\fP و به دنبال آن \fBcode:yyskip\fP است). .TP .B \fBcode:yybackup_yypeek\fP دستور ترکیبی \fBcode:yybackup\fP و \fBcode:yypeek\fP (پیش‌فرض \fBcode:yybackup\fP و به دنبال آن \fBcode:yypeek\fP است). .TP .B \fBcode:yyskip_yybackup_yypeek\fP دستور ترکیبی \fBcode:yyskip\fP، \fBcode:yybackup\fP و \fBcode:yypeek\fP (پیش‌فرض \(ga\(gacode:yyskip\(ga\(ga و به دنبال آن \fBcode:yybackup\fP و به دنبال آن \fBcode:yypeek\fP است). .TP .B \fBcode:yybackup_yypeek_yyskip\fP دستور ترکیبی \fBcode:yybackup\fP، \fBcode:yypeek\fP و \fBcode:yyskip\fP (پیش‌فرض \(ga\(gacode:yybackup\(ga\(ga و به دنبال آن \fBcode:yypeek\fP و به دنبال آن \fBcode:yyskip\fP است). .TP .B \fBcode:yyrestore\fP دستور \fBYYRESTORE\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYRESTORE\fP، \fBYYCURSOR\fP، \fBYYMARKER\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP). .TP .B \fBcode:yyrestorectx\fP دستور \fBYYRESTORECTX\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYRESTORECTX\fP، \fBYYCURSOR\fP، \fBYYCTXMARKER\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP). .TP .B \fBcode:yyrestoretag\fP دستور \fBYYRESTORETAG\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYRESTORETAG\fP، \fBYYCURSOR\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBtag\fP (نام متغیر برچسب مورداستفاده برای بازیابی موقعیت). .TP .B \fBcode:yyshift\fP دستور \fBYYSHIFT\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYSHIFT\fP، \fBYYCURSOR\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBoffset\fP (تعداد واحدهای کد برای جابه‌جایی موقعیت فعلی). .TP .B \fBcode:yyshiftstag\fP دستور \fBYYSHIFTSTAG\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYSHIFTSTAG\fP، \fByyrecord\fP، \fBnegative\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBtag\fP (متغیر برچسبی که باید جابه‌جا شود)، \fBoffset\fP (تعداد واحدهای کد برای جابه‌جایی). شرط‌ها: \fB\&.nested\fP (درست درصورتی‌که این یک برچسب تودرتو باشد \-\- در این حالت ممکن است مقدار آن برابر با \fBre2c:tags:negative\fP باشد، که نباید جابه‌جا شود). .TP .B \fBcode:yyshiftmtag\fP دستور \fBYYSHIFTMTAG\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYSHIFTMTAG\fP (نگاشت به پیکربندی متناظر \fBre2c:\fP)، \fBtag\fP (متغیر برچسبی که باید جابه‌جا شود)، \fBoffset\fP (تعداد واحدهای کد برای جابه‌جایی). .TP .B \fBcode:yystagp\fP دستور \fBYYSTAGP\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYSTAGP\fP، \fBYYCURSOR\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBtag\fP (متغیر برچسبی که باید به‌روزرسانی شود). .TP .B \fBcode:yymtagp\fP دستور \fBYYMTAGP\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYMTAGP\fP (نگاشت به پیکربندی متناظر \fBre2c:\fP)، \fBtag\fP (متغیر برچسبی که باید به‌روزرسانی شود). .TP .B \fBcode:yystagn\fP دستور \fBYYSTAGN\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYSTAGN\fP، \fBnegative\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBtag\fP (متغیر برچسبی که باید به‌روزرسانی شود). .TP .B \fBcode:yymtagn\fP دستور \fBYYMTAGN\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYMTAGN\fP (نگاشت به پیکربندی متناظر \fBre2c:\fP)، \fBtag\fP (متغیر برچسبی که باید به‌روزرسانی شود). .TP .B \fBcode:yycopystag\fP دستور \fBYYCOPYSTAG\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYCOPYSTAG\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBlhs\fP، \fBrhs\fP (متغیرهای برچسب سمت چپ و راست در عملیات رونوشت). .TP .B \fBcode:yycopymtag\fP دستور \fBYYCOPYMTAG\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYCOPYMTAG\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBlhs\fP، \fBrhs\fP (متغیرهای برچسب سمت چپ و راست در عملیات رونوشت). .TP .B \fBcode:yygetaccept\fP دستور \fBYYGETACCEPT\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYGETACCEPT\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBvar\fP (نگاشت به پیکربندی \fBre2c:yyaccept\fP). .TP .B \fBcode:yysetaccept\fP دستور \fBYYSETACCEPT\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYSETACCEPT\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBvar\fP (نگاشت به پیکربندی \fBre2c:yyaccept\fP) و \fBval\fP (مقدار عددی قاعدهٔ پذیرفته‌شده). .TP .B \fBcode:yygetcond\fP دستور \fBYYGETCOND\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYGETCOND\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBvar\fP (نگاشت به پیکربندی \fBre2c:yycond\fP). .TP .B \fBcode:yysetcond\fP دستور \fBYYSETCOND\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYSETCOND\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBvar\fP (نگاشت به پیکربندی \fBre2c:yycond\fP) و \fBval\fP (شناسهٔ عددی شرط). .TP .B \fBcode:yygetstate\fP دستور \fBYYGETSTATE\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYGETSTATE\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBvar\fP (نگاشت به پیکربندی \fBre2c:yystate\fP). .TP .B \fBcode:yysetstate\fP دستور \fBYYSETSTATE\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYSETSTATE\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBvar\fP (نگاشت به پیکربندی \fBre2c:yystate\fP) و \fBval\fP (شماره وضعیت). .TP .B \fBcode:yylessthan\fP دستور \fBYYLESSTHAN\fP، احتمالاً تخصیص‌یافته برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYLESSTHAN\fP، \fBYYCURSOR\fP، \fBYYLIMIT\fP، \fByyrecord\fP (نگاشت به پیکربندی‌های متناظر \fBre2c:\fP)، \fBneed\fP (تعداد واحدهای کد که باید بررسی شوند). شرط: \fB\&.many\fP (درست درصورتی‌که \fBneed\fP بیشتر از یک باشد)..TP .B \fBcode:yyend\fP عبارت \fBYYEND\fP، احتمالاً اختصاصی‌شده برای APIهای مختلف. متغیرهای پشتیبانی‌شده: \fBYYEND\fP، \fBYYCURSOR\fP، \fBYYLIMIT\fP\&. .TP .B \fBcode:yybm_filter\fP شرطی که برای فیلتر کردن مقادیر \fByych\fP که توسط جدول \fByybm\fP پوشش داده نشده‌اند به کار می‌رود (همراه با گزینهٔ \fB\-\-bitmaps\fP استفاده می‌شود). متغیر پشتیبانی‌شده: \fByych\fP (به پیکربندی \fBre2c:yych\fP نگاشت می‌شود). .TP .B \fBcode:yybm_match\fP قالب بررسی جدول \fByybm\fP (تولیدشده با گزینهٔ \fB\-\-bitmaps\fP). متغیرهای پشتیبانی‌شده: \fByybm\fP، \fByych\fP (به پیکربندی‌های متناظر \fBre2c:\fP نگاشت می‌شوند)، \fBoffset\fP (آفست در جدول \fByybm\fP که باید به \fByych\fP اضافه شود) و \fBmask\fP (ماسک بیتی که باید روی مدخل جدول اعمال شود تا مقدار بولی مورد بررسی بازیابی گردد) .TP .B \fBcode:yytarget_filter\fP شرطی که برای فیلتر کردن مقادیر \fByych\fP که توسط جدول \fByytarget\fP پوشش داده نشده‌اند به کار می‌رود (همراه با گزینهٔ \fB\-\-computed\-gotos\fP استفاده می‌شود). متغیر پشتیبانی‌شده: \fByych\fP (به پیکربندی \fBre2c:yych\fP نگاشت می‌شود). .UNINDENT .sp در اینجا فهرستی از تمام متغیرهای سراسریِ مجاز در فایل‌های نحو آمده است: .INDENT 0.0 .TP .B \fBnl\fP یک خط جدید (newline). .TP .B \fBindent\fP متغیری که هیچ کدی تولید نمی‌کند، اما اثر جانبیِ افزایش سطح تورفتگی را دارد. .TP .B \fBdedent\fP متغیری که هیچ کدی تولید نمی‌کند، اما اثر جانبیِ کاهش سطح تورفتگی را دارد. .TP .B \fBtopindent\fP رشتهٔ تورفتگی برای گزارهٔ کنونی. سطح تورفتگی توسط مولد کد ردیابی شده و به‌طور خودکار به‌روزرسانی می‌شود. .UNINDENT .sp در اینجا فهرستی از تمام شرط‌های سراسریِ مجاز در فایل‌های نحو آمده است: .INDENT 0.0 .TP .B \fB\&.api.simple\fP درست است اگر از API ساده استفاده شود (\fB\-\-api simple\fP یا \fBre2c:api = simple\fP). .TP .B \fB\&.api.generic\fP درست است اگر از API عمومی استفاده شود (\fB\-\-api generic\fP یا \fBre2c:api = generic\fP). .TP .B \fB\&.api.record\fP درست است اگر از API رکورد استفاده شود (\fB\-\-api record\fP یا \fBre2c:api = record\fP). .TP .B \fB\&.api_style.functions\fP درست است اگر از سبک API تابع‌گونه استفاده شود (\fBre2c:api\-style = functions\fP). .TP .B \fB\&.api_style.freeform\fP درست است اگر از سبک API آزاد استفاده شود (\fBre2c:api\-style = free\-form\fP). .TP .B \fB\&.case_ranges\fP درست است اگر ویژگی بازه‌های case فعال باشد (\fB\-\-case\-ranges\fP یا \fBre2c:case\-ranges = 1\fP). .TP .B \fB\&.cgoto.relative\fP درست است اگر شکل نسبی دستور \fBgoto\fP محاسباتی استفاده شود (\fB\-\-computed\-gotos\-relative\fP یا \fBre2c:cgoto:relative = 1\fP). .TP .B \fB\&.code_model.goto_label\fP درست است اگر مدل کد مبتنی بر goto/label استفاده شود (\fB\-\-goto\-label\fP). .TP .B \fB\&.code_model.loop_switch\fP درست است اگر مدل کد مبتنی بر loop/switch استفاده شود (\fB\-\-loop\-switch\fP). .TP .B \fB\&.code_model.recursive_functions\fP درست است اگر مدل کد مبتنی بر توابع بازگشتی استفاده شود (\fB\-\-recursive\-function\fP). .TP .B \fB\&.date\fP درست است اگر اثرانگشت (fingerprint) تولیدشده باید شامل تاریخ تولید باشد. .TP .B \fB\&.loop_label\fP درست است اگر حلقه‌های تولیدشده توسط re2py باید دارای برچسب باشند (\fBre2c:label:yyloop\fP روی یک رشتهٔ غیرخالی تنظیم شده باشد). .TP .B \fB\&.monadic\fP درست است اگر کد تولیدشده باید مونادیک باشد (\fBre2c:monadic = 1\fP). این مورد تنها برای زبان‌های تابعی محض کاربرد دارد. .TP .B \fB\&.start_conditions\fP درست است اگر شرایط شروع فعال باشند (\fB\-\-start\-conditions\fP). .TP .B \fB\&.storable_state\fP درست است اگر وضعیت قابل ذخیره‌سازی فعال باشد (\fB\-\-storable\-state\fP). .TP .B \fB\&.unsafe\fP درست است اگر re2py برای تولید کد سریع‌تر باید از بلوک‌های \(dqunsafe\(dq استفاده کند (\fB\-\-unsafe\fP، \fBre2c:unsafe = 1\fP). این مورد تنها برای زبان‌هایی کاربرد دارد که دارای ویژگی \(dqunsafe\(dq هستند. .TP .B \fB\&.version\fP درست است اگر اثرانگشت تولیدشده باید شامل نسخهٔ re2py باشد. .TP .B \fB\&.yyfill.enable\fP درست است اگر \fBYYFILL\fP فعال باشد (\fBre2c:yyfill:enable = 1\fP). .TP .B \fB\&.yyfn.throw\fP درست است اگر پیکربندی \fBre2c:yyfn:throw\fP روی یک رشتهٔ غیرخالی تعریف شده باشد. .UNINDENT .UNINDENT .UNINDENT.SH "مدیریت پایان ورودی (HANDLING THE END OF INPUT)" .sp یکی از چالش‌های اصلی برای تحلیل‌گر لغوی (lexer)، دانستن زمان توقف است. چندین شرط پایان‌دهنده وجود دارد: .INDENT 0.0 .IP \(bu 2 تحلیل‌گر لغوی ممکن است با قاعده‌ای (شامل قاعده پیش‌فرض \fB*\fP) تطابق یابد و به یک وضعیت نهایی برسد .IP \(bu 2 تحلیل‌گر لغوی ممکن است در تطبیق با هر قاعده‌ای شکست بخورد و به یک وضعیت پیش‌فرض برسد .IP \(bu 2 تحلیل‌گر لغوی ممکن است به پایان ورودی برسد .UNINDENT .sp دو شرط نخست، تحلیل‌گر لغوی را به روشی \(dqطبیعی\(dq خاتمه می‌دهند: تحلیل‌گر به وضعیتی بدون انتقال‌های خروجی می‌رسد و تطبیق به‌طور خودکار متوقف می‌شود. اما شرط سوم، یعنی پایان ورودی، متفاوت است: این حالت می‌تواند در هر وضعیتی رخ دهد و تحلیل‌گر باید بتواند آن را مدیریت کند. بررسی پایان ورودی، روند کار عادی تحلیل‌گر لغوی را مختل کرده و شاخه‌های شرطی را به برنامه تولیدشده می‌افزاید؛ از این رو به‌حداقل‌رساندن تعداد این بررسی‌ها ضروری است. re2py از چند روش مختلف برای مدیریت پایان ورودی پشتیبانی می‌کند. انتخاب روش مناسب به پیچیدگی عبارات باقاعده، نیاز به بافرسازی، ملاحظات کارایی و عوامل دیگر بستگی دارد. در ادامه فهرستی از این روش‌ها آمده است: .INDENT 0.0 .IP \(bu 2 \fBنگهبان (Sentinel).\fP این روش نیاز به بررسی‌های پایان ورودی را به‌طور کامل برطرف می‌کند. ساده و کارآمد است، اما محدود به حالتی است که یک نویسه \(dqنگهبان\(dq طبیعی وجود داشته باشد که هرگز در ورودی معتبر رخ ندهد. این نویسه ممکن است همچنان در ورودی نامعتبر ظاهر شود، اما نباید در عبارات باقاعده مجاز باشد، مگر شاید به عنوان آخرین نویسه یک قاعده. نویسه نگهبان به انتهای ورودی الحاق می‌شود و به عنوان سیگنال توقف عمل می‌کند: زمانی که تحلیل‌گر لغوی این نویسه را بخواند، یا یک خطای نحوی رخ داده یا پایان ورودی است. در هر دو حالت، تحلیل‌گر لغوی باید متوقف شود. این روش در صورتی استفاده می‌شود که \fBYYFILL\fP با \fBre2c:yyfill:enable = 0;\fP غیرفعال شده باشد و \fBre2c:eof\fP دارای مقدار پیش‌فرض \fB\-1\fP باشد\&. .nf .fi .sp .IP \(bu 2 \fBنگهبان همراه با بررسی مرزها (Sentinel with bounds checks).\fP این روش جامع است: اجازه می‌دهد هر ورودی بدون اعمال محدودیت بر عبارات باقاعده مدیریت شود. ایده اصلی، کاهش تعداد بررسی‌های پایان ورودی از طریق انجام آن‌ها صرفاً روی نویسه‌هایی خاص است. مشابه روش \(dqنگهبان\(dq، یکی از نویسه‌ها به عنوان \(dqنگهبان\(dq انتخاب شده و به انتهای ورودی الحاق می‌شود. با این حال، هیچ محدودیتی در محل وقوع نویسه نگهبان وجود ندارد (در واقع هر نویسه‌ای می‌تواند به عنوان نگهبان انتخاب شود). هنگامی که تحلیل‌گر لغوی این نویسه را می‌خواند، علاوه بر آن، یک بررسی مرزی نیز انجام می‌دهد. اگر موقعیت فعلی در محدوده مجاز باشد، تحلیل‌گر تطبیق را از سر می‌گیرد و با نویسه نگهبان مانند یک نویسه عادی رفتار می‌کند. در غیر این صورت، \fBYYFILL\fP را فراخوانی می‌کند (مگر اینکه غیرفعال شده باشد). اگر ورودی بیشتری ارائه شود، تحلیل‌گر لغوی آخرین نویسه را مجدداً تطبیق داده و طوری ادامه می‌دهد که گویی نویسه نگهبان وجود نداشته است. در غیر این صورت، ورودی واقعاً به پایان رسیده و تحلیل‌گر متوقف می‌شود. این روش زمانی استفاده می‌شود که \fBre2c:eof\fP مقداری غیرمنفی داشته باشد (باید روی مقدار عددی نویسه نگهبان تنظیم شود). استفاده از \fBYYFILL\fP اختیاری است. .nf .fi .sp .IP \(bu 2 \fBبررسی مرزها همراه با پدینگ (Bounds checks with padding).\fP این روش جامع است و ممکن است از روش \(dqنگهبان همراه با بررسی مرزها\(dq سریع‌تر باشد، اما پیچیده‌تر نیز هست. ایده اصلی، افرازبندی وضعیت‌های DFA به مؤلفه‌های قویاً همبند (SCCها) و ایجاد یک بررسی منفرد به ازای هر SCC است، به میزانی نویسه که برای پوشش طولانی‌ترین مسیر بدون حلقه در آن SCC کافی باشد. این کار تعداد بررسی‌ها را کاهش می‌دهد، اما مشکلی در رابطه با لِکسِم‌های (lexemes) کوتاه در انتهای ورودی ایجاد می‌کند، زیرا این بررسی نیازمند نویسه‌های کافی برای پوشش طولانی‌ترین لِکسِم است. این مشکل را می‌توان با پدینگ (پر کردن) ورودی با چند نویسه ساختگی حل کرد که پسوند لِکسِم معتبری را تشکیل ندهند (به طوری که تحلیل‌گر نتواند آن‌ها را مطابقت دهد). طول پدینگ باید \fBYYMAXFILL\fP باشد که با یک بلوک \fBmax\fP تولید می‌شود. اگر ورودی کافی نباشد، تحلیل‌گر \fBYYFILL\fP را فراخوانی می‌کند که باید دست‌کم تعداد نویسه‌های مورد نیاز را فراهم کند یا بازنگردد. این روش در صورتی استفاده می‌شود که \fBYYFILL\fP فعال بوده و \fBre2c:eof\fP برابر \fB\-1\fP باشد (این پیکربندی پیش‌فرض است). .nf .fi .sp .IP \(bu 2 \fBبررسی‌های سفارشی (Custom checks).\fP رابط عمومی (Generic API) اجازه می‌دهد تا عملیات پایه‌ای مانند خواندن یک نویسه بازنویسی شوند، که گنجاندن بررسی‌های پایان ورودی را به عنوان بخشی از آن‌ها ممکن می‌سازد. این رویکرد مستعد خطا است و باید با احتیاط استفاده شود. برای استفاده از یک روش سفارشی، رابط عمومی را با \fB\-\-api custom\fP یا \fBre2c:api = custom;\fP فعال کرده و بررسی‌های پیش‌فرض مرزها را با \fBre2c:yyfill:enable = 0;\fP یا \fBre2c:yyfill:check = 0;\fP غیرفعال کنید\&. .UNINDENT .sp زیربخش‌های زیر شامل مثالی از هر روش هستند..SS نگه‌بان (Sentinel) .sp این مثال از یک کاراکتر نگه‌بان (sentinel) برای مدیریت پایان ورودی استفاده می‌کند. این برنامه کلمات جداشده با فاصله را در یک رشته‌ی خاتمه‌یافته با null شمارش می‌کند. کاراکتر نگه‌بان همان null است: آخرین کاراکتر هر رشته‌ی ورودی است و طبق هیچ‌یک از قواعد اجازه ندارد در میان یک نشانه (lexeme) قرار گیرد (به‌ویژه، در بازه‌های کاراکتری که احتمال نادیده‌گرفتن آن زیاد است گنجانده نشده است). اگر یک null در میان رشته رخ دهد، این یک خطای نحوی است و تحلیل‌گر لغوی با قاعده‌ی پیش‌فرض \fB*\fP مطابقت می‌یابد، اما فراتر از پایان ورودی را نخواهد خواند و از کار نخواهد افتاد (برای اعتبارسنجی این موضوع از هشدار \fI\%\-Wsentinel\-in\-midrule\fP و پیکربندی \fBre2c:sentinel\fP استفاده کنید). پیکربندی \fBre2c:yyfill:enable = 0;\fP از تولید بررسی‌های مرز و فراخوانی‌های \fBYYFILL\fP جلوگیری می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT # expect a null\-terminated string def lex(yyinput): yycursor = 0 count = 0 while True: %{ re2c:yyfill:enable = 0; re2c:indent:top = 2; * { return \-1 } [\ex00] { return count } [ ]+ { break } [a\-z]+ { count += 1 break } %} assert lex(b\(dq\e0\(dq) == 0 assert lex(b\(dqone two three\e0\(dq) == 3 assert lex(b\(dqf0ur\e0\(dq) == \-1 .ft P .fi .UNINDENT .UNINDENT .SS نگه‌بان با بررسی مرزها (Sentinel with bounds checks) .sp این مثال از روش نگه‌بان با بررسی مرزها برای مدیریت پایان ورودی استفاده می‌کند (این روش در نسخه‌ی 1.2 اضافه شد). این برنامه رشته‌های محصور در نقل‌قول تکی را که با فاصله جدا شده‌اند شمارش می‌کند. کاراکتر نگه‌بان null است که با پیکربندی \fBre2c:eof = 0;\fP مشخص می‌شود. همانند روش \fI\%sentinel\fP، نویسه‌ی null آخرین کاراکتر هر رشته‌ی ورودی است، اما در میان یک قاعده مجاز شمرده می‌شود (برای مثال، \fB\(aqaaa\e0aa\(aq\e0\fP ورودی معتبری است، اما \fB\(aqaaa\e0\fP یک خطای نحوی است). بررسی‌های مرز در هر وضعیتی که با یک کاراکتر ورودی مطابقت داشته باشد تولید می‌شوند، اما دامنه‌ی آن‌ها به شاخه‌ای که null را مدیریت می‌کند محدود است. بررسی‌های مرز به صورت \fBYYLIMIT <= YYCURSOR\fP یا در API عمومی به صورت \fBYYLESSTHAN(1)\fP هستند. اگر شرط بررسی درست باشد، تحلیل‌گر لغوی به پایان ورودی رسیده است و باید متوقف شود (\fBYYFILL\fP با \fBre2c:yyfill:enable = 0;\fP غیرفعال شده است زیرا ورودی در یک بافر جا می‌شود؛ برای مثالی که از \fBYYFILL\fP استفاده می‌کند بخش \fI\%YYFILL with sentinel\fP را ببینید). رسیدن به انتهای ورودی سه احتمال را پیش می‌آورد: اگر تحلیل‌گر لغوی در وضعیت اولیه باشد با قاعده‌ی پایان ورودی \fB$\fP مطابقت پیدا می‌کند، در غیر این صورت ممکن است به یک قاعده‌ی قبلاً مطابقت‌یافته بازگردد (شامل قاعده‌ی پیش‌فرض \fB*\fP) یا به یک وضعیت پیش‌فرض برود، که موجب هشدار \fI\%\-Wundefined\-control\-flow\fP\& می‌شود. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT # expect a null\-terminated string def lex(yyinput): yycursor = 0 yylimit = len(yyinput) \- 1 # terminating null not included count = 0 while True: %{ re2c:yyfill:enable = 0; re2c:eof = 0; re2c:indent:top = 2; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; * { return \-1 } $ { return count } [ ]+ { break } str { count += 1 break } %} def test(str, count): # termunating null not included in \(galim\(ga assert count == lex(str) test(b\(dq\e0\(dq, 0); test(b\(dq\(aqqu\e0tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \e0\(dq, 3); test(b\(dq\(aqunterminated\e\e\(aq\e0\(dq, \-1) .ft P .fi .UNINDENT .UNINDENT.SS بررسی‌های محدوده با پدینگ (Bounds checks with padding) .sp این مثال از بررسی‌های محدوده همراه با پدینگ (padding) برای مدیریت انتهای ورودی استفاده می‌کند (این روش به‌طور پیش‌فرض فعال است). این برنامه رشته‌های محصور در علامت نقل‌قول تکی که با فاصله از هم جدا شده‌اند را می‌شمارد. پدینگی به اندازهٔ \fBYYMAXFILL\fP نویسهٔ null به انتهای ورودی الحاق شده است، که مقدار \fBYYMAXFILL\fP با یک بلوک \fBmax\fP به‌طور خودکار تولید می‌شود. نیازی نیست که حتماً از null برای پدینگ استفاده شود \-\-\- هر نویسه‌ای تا زمانی که پسوند معتبری برای یک لکسیم (lexeme) نسازد، قابل استفاده است (در این مثال، پدینگ نباید شامل علامت نقل‌قول تکی باشد، چرا که ممکن است با پسوند یک رشتهٔ محصور در نقل‌قول تکی اشتباه گرفته شود). یک قاعدهٔ \(dqstop\(dq وجود دارد که با نخستین نویسهٔ پدینگ (null) تطابق می‌یابد و لکسر را متوقف می‌کند (توجه داشته باشید که این قاعده بررسی می‌کند آیا null در ابتدای پدینگ قرار دارد یا خیر، در غیر این صورت یک خطای نحوی است). بررسی‌های محدوده تنها در برخی وضعیت‌ها تولید می‌شوند که بر اساس مؤلفه‌های قویاً همبند در اتوماتای زیرین تعیین می‌گردند. بررسی‌ها در API عمومی به شکل \fB(YYLIMIT \- YYCURSOR) < n\fP یا \fBYYLESSTHAN(n)\fP هستند، که در آن \fBn\fP حداقل تعداد نویسه‌های لازم برای ادامهٔ کار لکسر است (این بدان معنا نیز هست که بررسی محدودهٔ بعدی حداکثر در \fBn\fP نویسهٔ آینده رخ خواهد داد). اگر شرط بررسی درست باشد، لکسر به انتهای ورودی رسیده است و \fBYYFILL(n)\fP را فراخوانی می‌کند که باید یا حداقل \fBn\fP نویسهٔ ورودی را فراهم کند یا بازنگردد. در این مثال \fBYYFILL\fP همیشه با شکست مواجه می‌شود و لکسر را با یک خطا خاتمه می‌دهد (که مشکلی ایجاد نمی‌کند زیرا کل ورودی در یک بافر جا می‌گیرد). برای مشاهدهٔ مثالی که بافر ورودی را مجدداً با \fBYYFILL\fP پر می‌کند، بخش \fI\%YYFILL with padding\fP را ببینید\&. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT %{max %} def lex(yyinput): yycursor = 0 yylimit = len(yyinput) count = 0 while True: %{ re2c:YYFILL = \(dqreturn \-1\(dq; re2c:indent:top = 2; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; [\ex00] { # check that it is the sentinel, not some unexpected null return count if yycursor == yylimit \- YYMAXFILL + 1 else \-1 } str { count += 1 break } [ ]+ { break } * { return \-1 } %} def test(str, count): padded_str = str + (b\(dq\e0\(dq * YYMAXFILL) assert lex(padded_str) == count test(b\(dq\(dq, 0) test(b\(dq\(aqunterminated\e\e\(aq\(dq, \-1) test(b\(dq\(aqqu\ex00tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \(dq, 3) test(b\(dq\(aqunexpected \ex00 null\(dq, \-1) .ft P .fi .UNINDENT .UNINDENT .SS بررسی‌های سفارشی (Custom checks) .sp این مثال از یک روش سفارشی برای مدیریت پایان ورودی بر پایهٔ generic API استفاده می‌کند. این برنامه رشته‌های محصور در علامت نقل‌قول تکی که با فاصله از هم جدا شده‌اند را می‌شمارد. این مثال مشابه با مثال \fI\%sentinel\fP است، با این تفاوت که ورودی به null ختم نمی‌شود. برای جبران نبود نویسهٔ نگهبان (sentinel) در پایان ورودی، دستور \fBYYPEEK\fP بازتعریف شده است تا پیش از خواندن نویسهٔ ورودی بعدی، یک بررسی محدوده انجام دهد. این روش ناکارآمد است زیرا بررسی‌ها به دفعات بسیار زیاد انجام می‌شوند. اگر شرط بررسی برقرار نباشد، \fBYYPEEK\fP نویسهٔ واقعی را برمی‌گرداند، در غیر این صورت یک نویسهٔ نگهبان جعلی را برمی‌گرداند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT # expect a string without terminating null def lex(str): cur = 0 lim = len(str) count = 0 while True: %{ re2c:api = generic; re2c:YYPEEK = \(dqstr[cur] if cur < lim else 0\(dq; re2c:YYSKIP = \(dqcur += 1\(dq; re2c:yyfill:enable = 0; re2c:indent:top = 2; * { return \-1 } [\ex00] { return count } [ ]+ { break } [a\-z]+ { count += 1 break } %} assert lex(b\(dq\(dq) == 0 assert lex(b\(dqone two three\(dq) == 3 assert lex(b\(dqf0ur\(dq) == \-1 .ft P .fi .UNINDENT .UNINDENT.SH "پر کردن مجدد بافر (BUFFER REFILLING)" .sp نیاز به بافرسازی (buffering) زمانی پیش می‌آید که ورودی نتواند به‌یک‌باره در حافظه نگاشت شود: یا بیش از حد بزرگ است، یا به شیوهٔ جریانی دریافت می‌شود (مانند خواندن از یک سوکت). روش معمول در چنین سناریوهایی، تخصیص یک بافر حافظه با اندازهٔ ثابت و پردازش ورودی در تکه‌هایی (chunks) است که در این بافر می‌گنجند. هنگامی که تکهٔ فعلی پردازش شد، به بیرون منتقل شده و داده‌های جدید جایگزین آن می‌شوند. در عمل این روند تا حدی پیچیده‌تر است، زیرا وضعیت تحلیل‌گر واژگانی (lexer) از یک موقعیت ورودی منفرد تشکیل نشده، بلکه متشکل از مجموعه‌ای از موقعیت‌های مرتبط با یکدیگر است: .INDENT 0.0 .IP \(bu 2 مکان‌نما (cursor): نویسهٔ ورودی بعدی که باید خوانده شود (\fBYYCURSOR\fP در API اشاره‌گر C یا \fBYYSKIP\fP/\fBYYPEEK\fP در API عمومی). .IP \(bu 2 حد (limit): موقعیتِ پس از آخرین نویسهٔ ورودی در دسترس (\fBYYLIMIT\fP در API اشاره‌گر C، مدیریت به‌صورت ضمنی توسط \fBYYLESSTHAN\fP در API عمومی). .IP \(bu 2 نشانگر (marker): موقعیت تازه‌ترین تطابق، در صورت وجود (\fBYYMARKER\fP در API پیش‌فرض یا \fBYYBACKUP\fP/\fBYYRESTORE\fP در API عمومی). .IP \(bu 2 توکن (token): آغاز لکسم (lexeme) فعلی (در API مربوط به re2py ضمنی است، زیرا برای عملکرد عادی lexer نیاز نیست و می‌تواند توسط کاربر تعریف و به‌روزرسانی شود). .IP \(bu 2 نشانگر زمینه (context marker): موقعیت زمینهٔ انتهایی (trailing context) (\fBYYCTXMARKER\fP در API اشاره‌گر C یا \fBYYBACKUPCTX\fP/\fBYYRESTORECTX\fP در API عمومی). .IP \(bu 2 متغیرهای برچسب (tag variables): موقعیت‌های زیرتطابق (تعریف‌شده با بلوک‌های \fBstags\fP و \fBmtags\fP و توابع پایهٔ API عمومی \fBYYSTAGP\fP/\fBYYSTAGN\fP/\fBYYMTAGP\fP/\fBYYMTAGN\fP). .UNINDENT .sp همهٔ این موقعیت‌ها در تمام سناریوها استفاده نمی‌شوند، اما در صورت استفاده، باید توسط \fBYYFILL\fP\& به‌روزرسانی شوند. تمام موقعیت‌های فعال در بازهٔ بین token و cursor قرار دارند؛ بنابراین هر چیزی میان ابتدای بافر و token را می‌توان دور انداخت، بازهٔ از token تا limit باید به ابتدای بافر منتقل شود، و فضای خالی ایجادشده در انتهای بافر با داده‌های تازه پر گردد. به منظور جلوگیری از فراخوانی‌های مکرر \fBYYFILL\fP، بهتر است تا جای ممکن نویسه‌های ورودی بیشتری پر شوند (حتی اگر نویسه‌های کمتری برای از سرگیری lexer کافی باشد). جزئیات پیاده‌سازی \fBYYFILL\fP بسته به روش مدیریت EOF مورد استفاده اندکی متفاوت است: حالت قاعدهٔ EOF تا حدی ساده‌تر از حالت بررسی مرزها همراه با فاصله‌گذاری (padding) است. همچنین توجه داشته باشید که اگر گزینهٔ \fB\-f \-\-storable\-state\fP استفاده شود، \fBYYFILL\fP معنای کمی متفاوتی خواهد داشت (که در بخش مربوط به وضعیت قابل ذخیره‌سازی شرح داده شده است). .SS "YYFILL با نگهبان (YYFILL with sentinel)" .sp اگر از قاعدهٔ EOF استفاده شود، \fBYYFILL\fP یک ساختار پایهٔ شبه‌تابع است که هیچ آرگومانی نمی‌پذیرد و مقداری را برمی‌گرداند که با صفر ارزیابی می‌شود. فراخوانی \fBYYFILL\fP با شرط \fBYYLIMIT <= YYCURSOR\fP در API اشاره‌گر C و \fBYYLESSTHAN()\fP در API عمومی فعال می‌شود. مقدار بازگشتی غیرصفر نشان‌دهندهٔ شکست \fBYYFILL\fP است. یک فراخوانی موفق \fBYYFILL\fP باید حداقل یک نویسه را فراهم کند و موقعیت‌های ورودی را بر همین اساس تنظیم نماید. حد (Limit) همیشه باید روی یک واحد پس از آخرین موقعیت ورودی در بافر تنظیم شود، و نویسهٔ موجود در موقعیت limit باید نماد نگهبان (sentinel) مشخص‌شده توسط پیکربندی \fBre2c:eof\fP باشد. شکل‌های زیر مکان‌های نسبی موقعیت‌های ورودی در بافر را پیش و پس از فراخوانی \fBYYFILL\fP نشان می‌دهند (نماد نگهبان با \fB#\fP نشانه‌گذاری شده و شکل دوم حالتی را نشان می‌دهد که ورودی کافی برای پر کردن تمام بافر وجود ندارد). .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C <\-\- shift \-\-> >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-\-\-\-\-\-\-\-D#\-\-\-\-\-\-\-\-\-\-\-E\-> buffer token marker limit, cursor >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-\-\-\-\-\-\-\-D\-\-\-\-\-\-\-\-\-\-\-\-E#\-> buffer, marker cursor limit token <\-\- shift \-\-> >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-\-\-\-\-\-\-\-D#\-\-E (EOF) buffer token marker limit, cursor >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-\-\-\-\-\-\-\-D\-\-\-E#........ buffer, marker cursor limit token .ft P .fi .UNINDENT .UNINDENT .sp در ادامه مثالی از برنامه‌ای آمده است که فایل ورودی \fBinput.txt\fP را در تکه‌های ۴۰۹۶ بایتی می‌خواند و از قاعدهٔ EOF استفاده می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT from enum import Enum import os BUFSIZE = 4096 class State: def __init__(self, fname): self.file = open(fname, \(dqrb\(dq) self.yyinput = bytearray(BUFSIZE) self.yylimit = BUFSIZE \- 1 # exclude terminating null self.yycursor = self.yylimit self.yymarker = self.yylimit self.token = self.yylimit self.eof = False def __del__(self): self.file.close() class Status(Enum): OK = 0 EOF = 1 LONG_LEXEME = 2 def fill(st): if st.eof: return Status.EOF # Error: lexeme too long. In real life could reallocate a larger buffer. if st.token < 1: return Status.LONG_LEXEME # Shift buffer contents (discard everything up to the current token). st.yyinput = st.yyinput[st.token:st.yylimit] st.yycursor \-= st.token; st.yymarker \-= st.token; st.yylimit \-= st.token; st.token = 0; # Fill free space at the end of buffer with new data from file. bytes = st.file.read(BUFSIZE \- st.yylimit \- 1) # \-1 for sentinel if not bytes: st.eof = True # end of file else: st.yylimit += len(bytes); st.yyinput += bytes st.yyinput += b\(aq\e0\(aq # append sentinel return Status.OK def lex(yyrecord, count): while True: yyrecord.token = yyrecord.yycursor %{ re2c:api = record; re2c:define:YYFILL = \(dqfill(yyrecord) == Status.OK\(dq; re2c:eof = 0; re2c:indent:top = 2; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; * { return \-1 } $ { return count } [ ]+ { break } str { count += 1 break } %} def main(): fname = \(dqinput\(dq # Prepare input file. f = open(fname, \(dqw\(dq) for i in range(BUFSIZE): f.write(\(dq\(aqqu\e0tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \(dq) f.close() # Run lexer on the prepared file. st = State(fname) assert lex(st, 0) == 3 * BUFSIZE # Cleanup. os.remove(fname) if __name__ == \(aq__main__\(aq: main() .ft P .fi .UNINDENT .UNINDENT.SS YYFILL همراه با لایه‌گذاری (padding) .sp در حالت پیش‌فرض (زمانی که از قاعدهٔ EOF استفاده نمی‌شود) \fBYYFILL\fP یک سازهٔ اولیهٔ شبه‌تابع است که یک آرگومان دریافت می‌کند و هیچ مقداری را بازنمی‌گرداند. فراخوانی \fBYYFILL\fP با شرط \fB(YYLIMIT \- YYCURSOR) < n\fP در API اشاره‌گر C و \fBYYLESSTHAN(n)\fP در API عمومی آغاز می‌شود. آرگومان ارسال‌شده به \fBYYFILL\fP حداقل تعداد نویسه‌هایی است که باید فراهم شوند. اگر در فراهم کردن آن ناموفق باشد، \fBYYFILL\fP نباید به لکسر بازگردد (به همین دلیل بهتر است به‌صورت ماکرویی پیاده‌سازی شود که در صورت شکست، از تابع فراخواننده بازمی‌گردد). در صورت فراخوانی موفقیت‌آمیز \fBYYFILL\fP، موقعیت حد (limit) باید روی یک خانه پس از آخرین موقعیت ورودی در بافر، یا روی انتهای لایه‌گذاری \fBYYMAXFILL\fP تنظیم شود (در حالتی که \fBYYFILL\fP حداقل \fBn\fP نویسه را با موفقیت خوانده باشد، اما نه به اندازه‌ای که کل بافر را پر کند). تصاویر زیر موقعیت‌های نسبی ورودی را در بافر قبل و بعد از فراخوانی \fBYYFILL\fP نشان می‌دهند (لایه‌گذاری \fBYYMAXFILL\fP در تصویر دوم با نمادهای \fB#\fP مشخص شده است). .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C <\-\- shift \-\-> <\-\- need \-\-> >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-D\-\-\-\-\-\-\-E\-\-\-F\-\-\-\-\-\-\-\-G\-> buffer token marker cursor limit >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-D\-\-\-\-\-\-\-E\-\-\-F\-\-\-\-\-\-\-\-G\-> buffer, marker cursor limit token <\-\- shift \-\-> <\-\- need \-\-> >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-D\-\-\-\-\-\-\-E\-F (EOF) buffer token marker cursor limit >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-D\-\-\-\-\-\-\-E\-F############### buffer, marker cursor limit token <\- YYMAXFILL \-> .ft P .fi .UNINDENT .UNINDENT .sp در اینجا مثالی از برنامه‌ای آمده است که فایل ورودی \fBinput.txt\fP را در تکه‌های ۴۰۹۶ بایتی می‌خواند و از بررسی محدوده‌ها همراه با لایه‌گذاری (padding) استفاده می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT from enum import Enum import os BUFSIZE = 4096 %{max %} class State: def __init__(self, fname): self.file = open(fname, \(dqrb\(dq) self.yyinput = bytearray(BUFSIZE) self.yylimit = BUFSIZE \- YYMAXFILL self.yycursor = self.yylimit self.yymarker = self.yylimit self.token = self.yylimit self.eof = False def __del__(self): self.file.close() class Status(Enum): OK = 0 EOF = 1 LONG_LEXEME = 2 def fill(st, need): if st.eof: return Status.EOF # Error: lexeme too long. In real life could reallocate a larger buffer. if st.token < need: return Status.LONG_LEXEME # Shift buffer contents (discard everything up to the current token). st.yyinput = st.yyinput[st.token:st.yylimit] st.yycursor \-= st.token; st.yymarker \-= st.token; st.yylimit \-= st.token; st.token = 0; # Fill free space at the end of buffer with new data from file. bytes = st.file.read(BUFSIZE \- st.yylimit \- 1) # \-1 for sentinel if not bytes: st.eof = True # end of file st.yylimit += YYMAXFILL st.yyinput += b\(dq\e0\(dq * YYMAXFILL else: st.yylimit += len(bytes); st.yyinput += bytes return Status.OK def lex(yyrecord): count = 0 while True: yyrecord.token = yyrecord.yycursor %{ re2c:api = record; re2c:YYFILL = \(dqif fill(yyrecord, @@) != Status.OK: return \-1\(dq; re2c:indent:top = 2; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; [\ex00] { # Check that it is the sentinel, not some unexpected null. return count if yyrecord.token == yyrecord.yylimit \- YYMAXFILL else \-1 } str { count += 1 break } [ ]+ { break } * { return \-1 } %} def main(): fname = \(dqinput\(dq # Prepare input file. f = open(fname, \(dqw\(dq) for i in range(BUFSIZE): f.write(\(dq\(aqqu\e0tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \(dq) f.close() # Run lexer on the prepared file. st = State(fname) assert lex(st) == 3 * BUFSIZE # Cleanup. os.remove(fname) if __name__ == \(aq__main__\(aq: main() .ft P .fi .UNINDENT .UNINDENT.SH "ویژگی‌ها (FEATURES)" .SS "بلوک‌های چندگانه (Multiple blocks)" .sp گاهی لازم است چندین تحلیل‌گر لغوی (lexer) مرتبط با یکدیگر داشته باشیم (برای مثال، اگر یک ماشین حالت سطح‌بالا وجود داشته باشد که بین حالت‌های تحلیل‌گر لغوی جابه‌جا شود). این ساختار را می‌توان با استفاده از چندین بلوک متصل re2py پیاده‌سازی کرد. گزینه دیگر استفاده از \fI\%شرایط شروع (start conditions)\fP\& است. .sp پیاده‌سازی اتصالات بین بلوک‌ها به زبان مقصد بستگی دارد. در زبان‌هایی که دارای دستور \fBgoto\fP هستند (مانند C/C++‎ و Go) می‌توان تمام بلوک‌ها را درون یک تابع قرار داد، به‌طوری که پیش از هر یک از آن‌ها یک برچسب (label) قرار گیرد. انتقال از یک بلوک به بلوک دیگر یک \fBgoto\fP ساده است. در زبان‌هایی که فاقد دستور \fBgoto\fP هستند (مانند Rust)، استفاده از یک حلقه همراه با switch روی یک متغیر وضعیت (state variable) ضروری است، مشابه حلقه/switch مربوط به \fByystate\fP که توسط re2py تولید می‌شود؛ یا اینکه می‌توان هر بلوک را در یک تابع کپسوله‌سازی کرد و از فراخوانی توابع بهره برد. .sp مثال زیر از چندین بلوک برای تجزیه اعداد باینری (مبنای ۲)، اکتال (مبنای ۸)، ده‌دهی (مبنای ۱۰) و هگزادسیمال (مبنای ۱۶) استفاده می‌کند. هر مبنا بلوک مخصوص به خود را دارد. بلوک اولیه، مبنا را مشخص کرده و کار را به بلوک‌های دیگر ارجاع می‌دهد. پیکربندی‌های مشترک در یک بلوک مجزا در ابتدای برنامه تعریف شده‌اند؛ این پیکربندی‌ها توسط سایر بلوک‌ها به ارث برده می‌شوند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT class State: def __init__(self, str): self.yyinput = str self.yycursor = 0 self.yymarker = 0 # Common re2c definitions shared between all functions. %{ re2c:api = record; re2c:yyrecord = st; re2c:yyfill:enable = 0; re2c:indent:top = 2; %} def parse_u32(str): st = State(str) %{local re2c:indent:top = 1; \(aq0b\(aq / [01] { return parse_bin(st) } \(dq0\(dq { return parse_oct(st) } \(dq\(dq / [1\-9] { return parse_dec(st) } \(aq0x\(aq / [0\-9a\-fA\-F] { return parse_hex(st) } * { return None } %} def parse_bin(st): n = 0 while True: %{ [01] { n = n * 2 + (st.yyinput[st.yycursor \- 1] \- 48) break } * { return n } %} def parse_oct(st): n = 0 while True: %{ [0\-7] { n = n * 8 + (st.yyinput[st.yycursor \- 1] \- 48) break } * { return n } %} def parse_dec(st): n = 0 while True: %{ [0\-9] { n = n * 10 + (st.yyinput[st.yycursor \- 1] \- 48) break } * { return n } %} def parse_hex(st): n = 0 while True: %{ [0\-9] { n = n * 16 + (st.yyinput[st.yycursor \- 1] \- 48) break } [a\-f] { n = n * 16 + (st.yyinput[st.yycursor \- 1] \- 87) break } [A\-F] { n = n * 16 + (st.yyinput[st.yycursor \- 1] \- 55) break } * { return n } %} assert parse_u32(b\(dq\e0\(dq) == None assert parse_u32(b\(dq1234567890\e0\(dq) == 1234567890 assert parse_u32(b\(dq0b1101\e0\(dq) == 13 assert parse_u32(b\(dq0x7Fe\e0\(dq) == 2046 assert parse_u32(b\(dq0644\e0\(dq) == 420 assert parse_u32(b\(dq9999999999\e0\(dq) == 9999999999 .ft P .fi .UNINDENT .UNINDENT.SS "شرایط شروع (Start conditions)" .sp شرایط شروع با گزینهٔ \fB\-\-start\-conditions\fP فعال می‌شوند. آن‌ها روشی برای کدگذاری چندین خودکارهٔ به هم مرتبط در یک بلوک re2py مشترک ارائه می‌دهند. .sp هر شرط متناظر با یک خودکارهٔ منفرد است و دارای یک نام یکتاست که توسط کاربر مشخص می‌شود، و یک شمارهٔ داخلی یکتا دارد که توسط re2py\& تعریف می‌گردد. از این شماره‌ها برای جابه‌جایی میان شرایط استفاده می‌شود: کد تولیدشده از توابع اولیهٔ \fBYYGETCOND\fP و \fBYYSETCOND\fP برای دریافت شرط کنونی یا تنظیم آن به شمارهٔ داده‌شده بهره می‌برد. از بلوک \fBconditions\fP، گزینهٔ \fB\-\-header\fP یا پیکربندی \fBre2c:header\fP برای تولید شناسه‌های عددی شرایط استفاده کنید. پیکربندی \fBre2c:cond:enumprefix\fP پیشوند شناسه‌های تولیدشده را مشخص می‌کند. .sp در حالت شرطی، هر قاعده باید دارای پیشوندی از فهرستی از نام‌های شرایط جداشده با کاما درون براکت‌های زاویه‌دار، یا نویسهٔ عام \fB<*>\fP برای نشان دادن تمام شرایط باشد. نحو قواعد به‌صورت زیر گسترش می‌یابد: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .TP .B \fB< condition\-list > regular\-expression code\fP قاعده‌ای که در هر شرط موجود در \fBcondition\-list\fP ادغام می‌شود\&. این قاعده با \fBregular\-expression\fP مطابقت می‌یابد و \fBcode\fP مربوطه را اجرا می‌کند\&. .TP .B \fB< condition\-list > regular\-expression => condition code\fP قاعده‌ای که در هر شرط موجود در \fBcondition\-list\fP ادغام می‌شود\&. این قاعده با \fBregular\-expression\fP مطابقت می‌یابد، شرط کنونی را به \fBcondition\fP تنظیم کرده و \fBcode\fP مربوطه را اجرا می‌کند\&. .TP .B \fB< condition\-list > regular\-expression :=> condition\fP قاعده‌ای که در هر شرط موجود در \fBcondition\-list\fP ادغام می‌شود\&. این قاعده با \fBregular\-expression\fP مطابقت می‌یابد و بلافاصله به \fBcondition\fP گذار می‌کند (هیچ کنش معنایی وجود ندارد)\&. .TP .B \fB< condition\-list > !action code\fP قاعده‌ای که \fBcode\fP را به مکان تعریف‌شده توسط \fBaction\fP در هر شرط موجود در \fBcondition\-list\fP پیوند می‌دهد (برای انواع گوناگون کنش‌ها، بخش \fI\%actions\fP را ببینید)\&. .TP .B \fB code\fP قاعده‌ای که \fBcode\fP را به ابتدای کنش‌های معناییِ تمام قواعد در هر شرط موجود در \fBcondition\-list\fP اضافه می‌کند\&. این نحو منسوخ شده است و به‌جای آن باید از کنش \fB!pre_rule\fP استفاده شود (دقیقاً همان کار را انجام می‌دهد)\&. .TP .B \fB< > code\fP قاعده‌ای که یک شرط ورودی ویژه با شمارهٔ صفر و نام \fB\(dq0\(dq\fP ایجاد می‌کند که \fBcode\fP را پیش از پرش به شرایط دیگر اجرا می‌کند. این نحو منسوخ شده است، و به‌جای آن باید از کنش \fB!entry\fP استفاده شود (کنترل دقیق‌تری فراهم می‌کند، زیرا کد می‌تواند بر مبنای هر شرط مشخص شود و می‌توان مستقیماً بدون عبور از توزیع شرایط، به آغاز شرط پرش کرد)\&. .TP .B \fB< > => condition code\fP مشابه قاعدهٔ قبلی، با این تفاوت که \fBcondition\fP بعدی را تنظیم می‌کند\&. .TP .B \fB< > :=> condition\fP مشابه قاعدهٔ قبلی، با این تفاوت که هیچ کد مرتبطی ندارد و بلافاصله به \fBcondition\fP پرش می‌کند\&. .UNINDENT .UNINDENT .UNINDENT .sp کدی که re2py برای شرایط تولید می‌کند بستگی به این دارد که آیا re2py برای کدگذاری خودکاره‌ها از رویکرد goto/label استفاده می‌کند یا رویکرد loop/switch. .sp در زبان‌هایی که دارای دستور \fBgoto\fP هستند (مانند C/C++ و Go)، شرایط به‌طور طبیعی به‌صورت بلوک‌هایی از کد با پیشوند برچسب‌هایی به شکل \fByyc_\fP پیاده‌سازی می‌شوند، که در آن \fBcond\fP نام یک شرط است (پیشوند برچسب را می‌توان با \fBre2c:cond:prefix\fP تغییر داد). گذارها میان شرایط با استفاده از \fBgoto\fP و برچسب‌های شرط پیاده‌سازی می‌شوند. پیش از همهٔ شرایط، re2py یک switch اولیه بر روی \fBYYGETSTATE\fP تولید می‌کند که به وضعیت آغازین شرط کنونی پرش می‌کند. قواعد میان‌بر \fB:=>\fP این switch اولیه را دور می‌زنند و مستقیماً به شرط مشخص‌شده پرش می‌کنند (می‌توان از \fBre2c:cond:goto\fP برای تغییر رفتار پیش‌فرض استفاده کرد). قواعد دارای کنش‌های معنایی به‌طور خودکار به شرط بعدی پرش نمی‌کنند؛ این کار باید توسط کد کنشِ تعریف‌شده توسط کاربر انجام شود. .sp در زبان‌هایی که \fBgoto\fP ندارند (مانند Rust)، re2py از متغیر \fByystate\fP برای ذخیرهٔ شماره‌های شرط دوباره استفاده می‌کند. هر شرط یک شناسهٔ عددی برابر با شمارهٔ وضعیت آغازین خود دریافت می‌کند، و یک switch میان شرایط، هیچ تفاوتی با یک switch میان وضعیت‌های DFA در یک شرط واحد ندارد. نیازی به یک switch اولیهٔ جداگانه برای شرط نیست. (از آنجا که رویکرد مشابهی برای پیاده‌سازی وضعیت‌های قابل ذخیره به‌کار می‌رود، در صورت استفادهٔ هم‌زمان از وضعیت‌های قابل ذخیره و شرایط، \fBYYGETCOND\fP/\fBYYSETCOND\fP زاید هستند). .sp برنامهٔ زیر از شرایط شروع برای تجزیهٔ اعداد دودویی (باینری)، هشت‌هشتی (اکتال)، ده‌دهی (دسیمال) و شانزده‌شانزدهی (هگزادسیمال) استفاده می‌کند. یک بلوک منفرد وجود دارد که در آن هر مبنا شرط اختصاصی خود را دارد، و شرط اولیه به همهٔ آن‌ها متصل است. متغیر تعریف‌شده توسط کاربر \fBcond\fP شمارهٔ شرط کنونی را ذخیره می‌کند؛ این متغیر با شمارهٔ شرط اولیه که با بلوک \fBconditions\fP تولید شده مقداردهی اولیه می‌شود. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT \-c %{conditions %} def parse_u32(yyinput): yycursor = 0 yycond = YYC_INIT num = 0 while True: %{ re2c:yyfill:enable = 0; re2c:indent:top = 2; \(aq0b\(aq / [01] :=> BIN \(dq0\(dq :=> OCT \(dq\(dq / [1\-9] :=> DEC \(aq0x\(aq / [0\-9a\-fA\-F] :=> HEX * { return None } [01] { num = num * 2 + (yyinput[yycursor \- 1] \- 48) break } [0\-7] { num = num * 8 + (yyinput[yycursor \- 1] \- 48) break } [0\-9] { num = num * 10 + (yyinput[yycursor \- 1] \- 48) break } [0\-9] { num = num * 16 + (yyinput[yycursor \- 1] \- 48) break } [a\-f] { num = num * 16 + (yyinput[yycursor \- 1] \- 87) break } [A\-F] { num = num * 16 + (yyinput[yycursor \- 1] \- 55) break } * { return num } %} assert parse_u32(b\(dq\e0\(dq) == None assert parse_u32(b\(dq1234567890\e0\(dq) == 1234567890 assert parse_u32(b\(dq0b1101\e0\(dq) == 13 assert parse_u32(b\(dq0x7Fe\e0\(dq) == 2046 assert parse_u32(b\(dq0644\e0\(dq) == 420 assert parse_u32(b\(dq9999999999\e0\(dq) == 9999999999 .ft P .fi .UNINDENT .UNINDENT.SS "وضعیت قابل ذخیره‌سازی (Storable state)" .sp با گزینهٔ \fB\-\-storable\-state\fP، ابزار re2py یک تحلیل‌گر لغوی (lexer) تولید می‌کند که می‌تواند وضعیت فعلی خود را ذخیره کرده، کنترل را به فراخواننده بازگرداند، و بعداً دقیقاً از همان نقطه‌ای که متوقف شده بود ادامه دهد. حالت پیش‌فرض عملکرد در re2py یک مدل «کششی» (\(dqpull\(dq) است که در آن لکسر هر زمان به داده نیاز داشته باشد، ورودی بیشتری دریافت می‌کند. این رفتار ممکن است در مواردی که ورودی به صورت تکه‌تکه در دسترس قرار می‌گیرد غیرقابل‌قبول باشد (برای نمونه، هنگامی که لکسر توسط یک تجزیه‌کننده (parser) فراخوانی می‌شود، یا هنگامی که برنامهٔ لکسر از طریق یک پروتکل سوکت با برنامهٔ دیگری ارتباط دارد که باید پیش از ارسال پیام بعدی، منتظر پاسخ از سوی لکسر بماند). قابلیت وضعیت قابل ذخیره‌سازی دقیقاً برای چنین سناریوهایی طراحی شده است: این ویژگی امکان تولید لکسرهایی را فراهم می‌سازد که در یک مدل «رانشی» (\(dqpush\(dq) کار می‌کنند. زمانی که لکسر به ورودی بیشتری نیاز داشته باشد، وضعیت خود را ذخیره کرده و به فراخواننده بازمی‌گردد. سپس، با مهیا شدن ورودی بیشتر، فراخواننده لکسر را دقیقاً از همان نقطه‌ای که متوقف شده بود از سر می‌گیرد. در مقایسه با مدل «کششی»، چند تغییر ضروری لازم است: .INDENT 0.0 .IP \(bu 2 دستورهای پایهٔ \fBYYSETSTATE()\fP و \fBYYGETSTATE(state)\fP را تعریف کنید. .IP \(bu 2 متغیرهای \fByych\fP، \fByyaccept\fP (در صورت استفاده) و \fBstate\fP را به‌عنوان بخشی از وضعیت پایدار لکسر تعریف کنید. متغیر \fBstate\fP باید با مقدار \fB\-1\fP مقداردهی اولیه شود\&. .IP \(bu 2 دستور \fBYYFILL\fP باید به‌جای تلاش برای تأمین ورودی بیشتر، به برنامهٔ بیرونی بازگردد. کد بازگشتی باید نشان دهد که لکسر به ورودی بیشتری نیاز دارد. .IP \(bu 2 برنامهٔ بیرونی باید شرایطی را که در آن لکسر به ورودی بیشتری نیاز دارد تشخیص داده و واکنش مناسب نشان دهد. .IP \(bu 2 به‌صورت اختیاری، از بلوک \fBgetstate\fP برای تولید سوئیچِ \fBYYGETSTATE\fP جدا از لکسر اصلی استفاده کنید. این قابلیت تنها برای زبان‌هایی کار می‌کند که دارای دستور \fBgoto\fP هستند (نه در حالت \fB\-\-loop\-switch\fP). .IP \(bu 2 از \fBre2c:eof\fP و روش \fI\%sentinel with bounds checks\fP (نگهبان با بررسی مرزها) برای مدیریت پایان ورودی استفاده کنید. روش مبتنی بر لایه‌گذاری (padding) ممکن است کارایی نداشته باشد؛ زیرا مشخص نیست چه زمانی باید لایه‌گذاری اضافه شود: پایان فعلی بافر ورودی لزوماً پایان نهایی داده‌ها نیست و الصاق زودهنگام لایه‌گذاری ممکن است یک لکسمِ طماع (greedy lexeme) را که نیمه‌کاره خوانده شده قطع کند. علاوه بر این، به دلیل منطق سطح بالای برنامه، دریافت ورودی بیشتر ممکن است به پردازش لکسمِ موجود در انتهای بافر بستگی داشته باشد (که از قبل به دلیل شرایط انتهای ورودی مسدود شده است). .UNINDENT .sp در اینجا مثالی از یک لکسر با مدل «رانشی» آورده شده است که خواندن بسته‌ها از یک سوکت را شبیه‌سازی می‌کند. لکسر تا زمانی که به پایان ورودی برسد در یک حلقه اجرا شده و به تابع فراخواننده بازمی‌گردد. تابع فراخواننده با «ارسال» بستهٔ بعدی، ورودی بیشتری را فراهم کرده و تحلیل لغوی را از سر می‌گیرد. این فرایند زمانی که تمام بسته‌ها ارسال شوند یا خطایی رخ دهد پایان می‌یابد. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT \-f from enum import Enum import os # Use a small buffer to cover the case when a lexeme doesn\(aqt fit. # In real world use a larger buffer. BUFSIZE = 10 DEBUG = False class State: def __init__(self, file): self.file = file self.yyinput = bytearray(BUFSIZE) self.yylimit = BUFSIZE \- 1 # exclude terminating null self.yycursor = self.yylimit self.yymarker = self.yylimit self.token = self.yylimit self.yystate = \-1 class Status(Enum): END = 0 READY = 1 WAITING = 2 BIG_PACKET = 3 BAD_PACKET = 4 def fill(st): # Error: lexeme too long. In real life could reallocate a larger buffer. if st.token < 1: return Status.BIG_PACKET # Shift buffer contents (discard everything up to the current token). st.yyinput = st.yyinput[st.token:st.yylimit] st.yycursor \-= st.token; st.yymarker \-= st.token; st.yylimit \-= st.token; st.token = 0; # Fill free space at the end of buffer with new data from file. bytes = st.file.read(BUFSIZE \- st.yylimit \- 1) # \-1 for sentinel if bytes: st.yylimit += len(bytes); st.yyinput += bytes st.yyinput += b\(aq\e0\(aq # append sentinel return Status.READY def lex(yyrecord, recv): while True: yyrecord.token = yyrecord.yycursor %{ re2c:api = record; re2c:YYFILL = \(dqreturn Status.WAITING, recv\(dq; re2c:eof = 0; re2c:indent:top = 2; packet = [a\-z]+[;]; * { return Status.BAD_PACKET, recv } $ { return Status.END, recv } packet { recv += 1 break } %} def test(packets, expect): # Create a pipe (open the same file for reading and writing). fname = \(dqpipe\(dq fw = open(fname, \(dqwb\(dq) fr = open(fname, \(dqrb\(dq) # Initialize lexer state st = State(fr) # Main loop. The buffer contains incomplete data which appears packet by # packet. When the lexer needs more input it saves its internal state and # returns to the caller which should provide more input and resume lexing. send = 0 recv = 0 while True: status, recv = lex(st, recv) if status == Status.END: if DEBUG: print(\(dqdone: got {} packets\(dq.format(recv)) break elif status == Status.WAITING: if DEBUG: print(\(dqwaiting...\(dq); if send < len(packets): if DEBUG: print(\(dqsent packet {}: {}\(dq.format(send, packets[send])) fw.write(packets[send]) fw.flush() send += 1 status = fill(st) if DEBUG: print(\(dqqueue: \(aq{}\(aq, status: {}\(dq.format(st.yyinput, status)) if status == Status.BIG_PACKET: if DEBUG: print(\(dqerror: packet too big\(dq) break assert status == Status.READY else: assert status == Status.BAD_PACKET if DEBUG: print(\(dqerror: ill\-formed packet\(dq) break # Check results. assert status == expect if status == Status.END: assert recv == send # Cleanup: remove input file. fr.close() fw.close() os.remove(fname) def main(): test([], Status.END) test([b\(dqzero;\(dq, b\(dqone;\(dq, b\(dqtwo;\(dq, b\(dqthree;\(dq, b\(dqfour;\(dq], Status.END) test([b\(dqzer0;\(dq], Status.BAD_PACKET) test([b\(dqgoooooooooogle;\(dq], Status.BIG_PACKET) if __name__ == \(aq__main__\(aq: main() .ft P .fi .UNINDENT .UNINDENT.SS "بلوک‌های با قابلیت استفاده مجدد (Reusable blocks)" .sp بلوک‌های چندبارمصرف به شکل \fB/*!rules:re2c[:] ... */\fP یا \fB%{rules[:] ... %}\fP می‌توانند به هر تعداد دفعات دوباره استفاده شده و با سایر بلوک‌های re2py ترکیب شوند. مقدار \fB\fP اختیاری است. یک بلوک قوانین می‌تواند در یک بلوک یا دستورالعمل \fBuse\fP استفاده شود. کد مربوط به یک بلوک قوانین در هر نقطه از استفاده تولید می‌شود. .sp بلوک‌های use با \fB/*!use:re2c[:] ... */\fP یا \fB%{use[:] ... %}\fP\& تعریف می‌شوند. مقدار \fB\fP اختیاری است: اگر مشخص نشده باشد، بلوک قوانین مرتبط، جدیدترین بلوک قبلی خواهد بود (چه نام‌گذاری شده باشد چه بدون نام). یک بلوک use می‌تواند تعاریف با نام، پیکربندی‌ها و قوانین مختص به خود را اضافه کند. یک کاربرد مهم برای بلوک‌های use، تحلیل‌گر لغوی (lexer) با پشتیبانی از چندین کدگذاری ورودی است: همان بلوک قوانین چندین بار با پیکربندی‌های مختص به هر کدگذاری مجدداً استفاده می‌شود (به مثال زیر مراجعه کنید). .sp دستورالعمل درون‌بلوکی \fB!use:;\fP می‌تواند از داخل یک بلوک re2py استفاده شود. این دستور، بلوک ارجاع‌داده‌شده \fB\fP را با بلوک فعلی ادغام می‌کند. اگر برخی از قوانین و پیکربندی‌های ادغام‌شده با موارد تعریف‌شده قبلی هم‌پوشانی داشته باشند، تداخل‌ها به شیوه معمول حل می‌شوند: نخستین قانون اولویت دارد و آخرین پیکربندی جایگزین موارد پیشین می‌شود. یک استثنا قوانین ویژه \fB*\fP، \fB$\fP و (در حالت شرط) \fB\fP هستند که برای آن‌ها، تعریف محلیِ بلوک بر هر تعریف به ارث‌رسیده‌ای ارجحیت دارد. دستورالعمل use امکان ترکیب بلوک‌های مختلف re2py را درون یک بلوک واحد فراهم می‌کند (به مثال زیر مراجعه کنید). .sp بلوک‌های نام‌گذاری‌شده و دستورالعمل درون‌بلوکی use در نگارش 2.2 از re2py افزوده شدند. از آن نگارش به بعد، بلوک‌های چندبارمصرف به‌طور پیش‌فرض مجاز هستند (به هیچ گزینه خاصی نیاز نیست). پیش از نگارش 2.2، حالت استفاده مجدد با گزینه \fB\-r \-\-reusable\fP فعال می‌شد. پیش از نگارش 1.2، امکان ترکیب بلوک‌های چندبارمصرف با بلوک‌های معمولی وجود نداشت. .SS "مثالی از دستورالعمل \fB!use\fP" .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT # This example shows how to combine reusable re2c blocks: two blocks # (\(aqcolors\(aq and \(aqfish\(aq) are merged into one. The \(aqsalmon\(aq rule occurs # in both blocks; the \(aqfish\(aq block takes priority because it is used # earlier. Default rule * occurs in all three blocks; the local (not # inherited) definition takes priority. from enum import Enum class Ans(Enum): COLOR = 1 FISH = 2 DUNNO = 3 %{rules:colors * { raise \(dqah\(dq } \(dqred\(dq | \(dqsalmon\(dq | \(dqmagenta\(dq { return Ans.COLOR } %} %{rules:fish * { raise \(dqoh\(dq } \(dqhaddock\(dq | \(dqsalmon\(dq | \(dqeel\(dq { return Ans.FISH } %} def lex(yyinput): yycursor = 0 %{ re2c:yyfill:enable = 0; re2c:indent:top = 1; !use:fish; !use:colors; * { return Ans.DUNNO } // overrides inherited \(aq*\(aq rules %} assert lex(b\(dqsalmon\(dq) == Ans.FISH assert lex(b\(dqwhat?\(dq) == Ans.DUNNO .ft P .fi .UNINDENT .UNINDENT .SS "مثالی از یک بلوک \fB/*!use:re2c ... */\fP" .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT \-\-input\-encoding utf8 # This example supports multiple input encodings: UTF\-8 and UTF\-32. # Both lexers are generated from the same rules block, and the use # blocks add only encoding\-specific configurations. %{rules re2c:yyfill:enable = 0; re2c:indent:top = 1; \(dq∀x ∃y\(dq { return yycursor } * { return None } %} def lex_utf8(yyinput): yycursor = 0 %{use re2c:encoding:utf8 = 1; %} def lex_utf32(yyinput): yycursor = 0 %{use re2c:encoding:utf32 = 1; %} s8 = [0xe2, 0x88, 0x80, 0x78, 0x20, 0xe2, 0x88, 0x83, 0x79] assert lex_utf8(s8) == len(s8) s32 = [0x2200, 0x78, 0x20, 0x2203, 0x79] assert lex_utf32(s32) == len(s32) .ft P .fi .UNINDENT .UNINDENT.SS "استخراج زیرتطابق (Submatch extraction)" .sp ابزار re2py دو گزینه برای استخراج زیرتطابق دارد. .INDENT 0.0 .TP .B \fBTags\fP نخستین گزینه، استفاده از \fItags\fP (برچسب‌های) مستقل به شکل \fB@stag\fP یا \fB#mtag\fP است، که در آن \fBstag\fP و \fBmtag\fP نام‌های دلخواه تعریف‌شده توسط کاربر هستند. برچسب‌ها با گزینهٔ \fB\-T \-\-tags\fP یا پیکربندی \fBre2c:tags = 1\fP فعال می‌شوند. از نظر معنایی، برچسب‌ها نشانگرهای موقعیت هستند: آن‌ها می‌توانند در هر کجای یک عبارت منظم درج شوند و به موقعیت متناظر (یا چندین موقعیت) در رشتهٔ ورودی پیوند می‌خورند. \fIS\-tags\fP به آخرین موقعیت تطبیق‌یافته متصل می‌شوند و \fIm\-tags\fP به فهرستی از موقعیت‌ها پیوند می‌خورند (آن‌ها ممکن است در زیرعبارت‌های تکرار استفاده شوند، جایی که یک موقعیت واحد در یک عبارت منظم با چندین موقعیت در رشتهٔ ورودی متناظر است). تمام برچسب‌ها باید توسط کاربر تعریف شوند؛ خواه به صورت دستی یا با کمک بلوک‌های \fBsvars\fP و \fBmvars\fP. اگر بیش از یک روش برای تطبیق برچسب‌ها با ورودی وجود داشته باشد، ابهام با استفاده از راهبرد رفع ابهام حریصانهٔ چپ‌ترین (leftmost greedy) برطرف می‌شود. .TP .B \fBCaptures\fP گزینهٔ دوم استفاده از \fIcapturing groups\fP (گروه‌های ضبط) است\&. آن‌ها با گزینهٔ \fB\-\-captures\fP یا پیکربندی \fBre2c:captures = 1\fP فعال می‌شوند. دو گونه برای سیاست‌های مختلف رفع ابهام وجود دارد؛ \fB\-\-leftmost\-captures\fP (پیش‌فرض) برای سیاست حریصانهٔ چپ‌ترین، و \fB\-\-posix\-captures\fP برای سیاست طولانی‌ترین تطابق POSIX است. در این حالت تمام زیرعبارت‌های درون پرانتز گروه‌های ضبط در نظر گرفته می‌شوند و می‌توان از علامت تعجب (bang) برای علامت‌گذاری گروه‌های غیرقابل‌ضبط استفاده کرد: \fB(! ... )\fP\&. با گزینهٔ \fB\-\-invert\-captures\fP یا پیکربندی \fBre2c:invert\-captures = 1\fP معنای علامت تعجب معکوس می‌شود. تعداد گروه‌ها برای قاعدهٔ تطبیق‌یافته در متغیری به نام \fByynmatch\fP ذخیره می‌شود (کل عبارت منظم گروه شمارهٔ صفر است)، و نتایج زیرتطابق در آرایهٔ \fByypmatch\fP ذخیره می‌شوند. هر دو متغیر \fByynmatch\fP و \fByypmatch\fP باید توسط کاربر تعریف شوند، و اندازهٔ \fByypmatch\fP باید حداقل \fB[yynmatch * 2]\fP باشد\&. از بلوک \fBmaxnmatch\fP برای تعریف \fBYYMAXNMATCH\fP استفاده کنید، ثابتی که برابر با بیشترین مقدار \fByynmatch\fP در میان تمام قواعد است. .TP .B \fBCaptvars\fP روش دیگر برای استفاده از گروه‌های ضبط، گزینهٔ \fB\-\-captvars\fP یا پیکربندی \fBre2c:captvars = 1\fP است. تنها تفاوت با \fB\-\-captures\fP در نحوهٔ ذخیره‌سازی نتایج زیرتطابق در کد تولیدشده است: به‌جای \fByynmatch\fP و \fByypmatch\fP، ابزار re2py متغیرهای \fByytl\fP و \fByytr\fP را برای \fIk\fP\-امین گروه ضبط تولید می‌کند (کاربر باید این متغیرها را با استفاده از یک بلوک \fBsvars\fP اعلان کند). گروه‌های ضبط با متغیر از دو سیاست رفع ابهام پشتیبانی می‌کنند: \fB\-\-leftmost\-captvars\fP یا \fBre2c:leftmost\-captvars = 1\fP برای سیاست حریصانهٔ چپ‌ترین (حالت پیش‌فرض) و \fB\-\-posix\-captvars\fP یا \fBre2c:posix\-captvars\fP برای سیاست طولانی‌ترین تطابق POSIX. .UNINDENT .sp در پشت صحنه، تمام این گزینه‌ها به برچسب‌ها و \fI\%Tagged Deterministic Finite Automata with Lookahead\fP ترجمه می‌شوند\&. ایدهٔ اصلی TDFA به حداقل رساندن بار اضافی (overhead) در استخراج زیرتطابق است. در حالت فرین (حد نهایی)، اگر هیچ برچسب یا گروه ضبطی در عبارت منظم نباشد، TDFA صرفاً یک DFA معمولی است. اگر تعداد برچسب‌ها در حد معتدل باشد، بار اضافی به سختی محسوس خواهد بود. اتوماتای TDFA تولیدشده از تعدادی \fItag variables\fP (متغیرهای برچسب) استفاده می‌کند که مستقیماً به برچسب‌ها نگاشت نمی‌شوند: یک متغیر واحد ممکن است برای برچسب‌های متفاوتی استفاده شود، و یک برچسب ممکن است برای نگه‌داشتن تمام مقادیر ممکن خود به چندین متغیر نیاز داشته باشد. در نهایت، ابهام برطرف می‌شود و برای هر برچسب تنها یک متغیر نهایی باقی می‌ماند. متغیرهای برچسب باید با استفاده از بلوک‌های \fBstags\fP یا \fBmtags\fP تعریف شوند. اگر وضعیت تحلیل‌گر لغوی ذخیره شود، متغیرهای برچسب نیز باید بخشی از آن باشند. آن‌ها همچنین باید توسط \fBYYFILL\fP به‌روزرسانی شوند\&. .sp برچسب‌های S\-tags از عملیات زیر پشتیبانی می‌کنند: .INDENT 0.0 .IP \(bu 2 ذخیرهٔ موقعیت ورودی در یک s\-tag: دستور \fBt = YYCURSOR\fP با API اشاره‌گر C یا یک عملیات تعریف‌شده توسط کاربر \fBYYSTAGP(t)\fP با API عمومی (generic) .IP \(bu 2 ذخیرهٔ مقدار پیش‌فرض در یک s\-tag: دستور \fBt = NULL\fP با API اشاره‌گر C یا یک عملیات تعریف‌شده توسط کاربر \fBYYSTAGN(t)\fP با API عمومی .IP \(bu 2 رونوشت از یک s\-tag به دیگری: \fBt1 = t2\fP .UNINDENT .sp برچسب‌های M\-tags از عملیات زیر پشتیبانی می‌کنند: .INDENT 0.0 .IP \(bu 2 الحاق موقعیت ورودی به یک m\-tag: عملیات تعریف‌شده توسط کاربر \fBYYMTAGP(t)\fP با هر دو API پیش‌فرض و عمومی .IP \(bu 2 الحاق مقدار پیش‌فرض به یک m\-tag: عملیات تعریف‌شده توسط کاربر \fBYYMTAGN(t)\fP با هر دو API پیش‌فرض و عمومی .IP \(bu 2 رونوشت از یک m\-tag به دیگری: \fBt1 = t2\fP .UNINDENT .sp برچسب‌های S\-tag را می‌توان به صورت مقادیر اسکالر (اشاره‌گرها یا آفست‌ها) پیاده‌سازی کرد. برچسب‌های M\-tag به نمایش پیچیده‌تری نیاز دارند، زیرا باید دنباله‌ای از مقادیر برچسب را ذخیره کنند. ابتدایی‌ترین و ناکارآمدترین نمایش برای یک m\-tag، یک لیست (آرایه، بردار) از مقادیر برچسب است؛ نمایشی کارآمدتر، ذخیرهٔ تمام m\-tagها در یک درخت پیشوندی (prefix\-tree) است که به صورت آرایه‌ای از گره‌های \fB(v, p)\fP نشان داده می‌شود، که در آن \fBv\fP مقدار برچسب و \fBp\fP اشاره‌گری به گره والد است. .sp در اینجا یک مثال ساده از به‌کارگیری s\-tagها برای تجزیهٔ نگارش‌های معنایی (semantic versions) متشکل از سه جزء عددی آورده شده است: major، minor، patch (مورد آخر اختیاری است). برای یک مثال پیچیده‌تر که از \fBYYFILL\fP استفاده می‌کند، بخش زیر را ببینید\&. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT from collections import namedtuple SemVer = namedtuple(\(aqSemVer\(aq, \(aqmajor minor patch\(aq) NONE = \-1 def parse(yyinput): yycursor = 0 %{ re2c:yyfill:enable = 0; re2c:tags = 1; re2c:indent:top = 1; num = [0\-9]+; @t1 num @t2 \(dq.\(dq @t3 num @t4 (\(dq.\(dq @t5 num)? [\ex00] { major = int(yyinput[t1:t2]) minor = int(yyinput[t3:t4]) patch = int(yyinput[t5:yycursor \- 1]) if t5 != NONE else 0 return SemVer(major, minor, patch) } * { return None } %} assert parse(b\(dq23.34\e0\(dq) == SemVer(23, 34, 0) assert parse(b\(dq1.2.99999\e0\(dq) == SemVer(1, 2, 99999) assert parse(b\(dq1.a\e0\(dq) == None .ft P .fi .UNINDENT .UNINDENT .sp در اینجا مثالی پیچیده‌تر از استفاده از s\-tagها با \fBYYFILL\fP برای تجزیهٔ فایلی با نگارش‌های معنایی جداشده با خط جدید آمده است. متغیرهای برچسب بخشی از وضعیت تحلیل‌گر لغوی هستند، و همانند سایر موقعیت‌های ورودی در \fBYYFILL\fP تنظیم می‌شوند. توجه داشته باشید که این امر برای s\-tagها ضروری است زیرا مقادیر آن‌ها پس از جابه‌جایی محتویات بافر باطل می‌شوند. این کار ممکن است در پیاده‌سازی‌های سفارشی که در آن‌ها متغیرهای برچسب آفست‌ها را به‌جای بافر، نسبت به ابتدای رشتهٔ ورودی ذخیره می‌کنند (که ممکن است در مورد m\-tagها چنین باشد)، ضروری نباشد. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT from collections import namedtuple from enum import Enum import os BUFSIZE = 4096 SemVer = namedtuple(\(aqSemVer\(aq, \(aqmajor minor patch\(aq) class State: def __init__(self, fname): self.file = open(fname, \(dqrb\(dq) self.yyinput = bytearray(BUFSIZE) self.yylimit = BUFSIZE \- 1 # exclude terminating null self.yycursor = self.yylimit self.yymarker = self.yylimit self.token = self.yylimit self.eof = False %{stags format = \(dq\en self.@@ = \-1\(dq; %} def __del__(self): self.file.close() class Status(Enum): OK = 0 EOF = 1 LONG_LEXEME = 2 def fill(st): if st.eof: return Status.EOF # Error: lexeme too long. In real life could reallocate a larger buffer. if st.token < 1: return Status.LONG_LEXEME # Shift buffer contents (discard everything up to the current token). st.yyinput = st.yyinput[st.token:st.yylimit] st.yycursor \-= st.token; st.yymarker \-= st.token; st.yylimit \-= st.token; %{stags format = \(dq\en if st.@@ != \-1: st.@@ \-= st.token\(dq; %} st.token = 0; # Fill free space at the end of buffer with new data from file. bytes = st.file.read(BUFSIZE \- st.yylimit \- 1) # \-1 for sentinel if not bytes: st.eof = True # end of file else: st.yylimit += len(bytes); st.yyinput += bytes st.yyinput += b\(aq\e0\(aq # append sentinel return Status.OK def lex(st, count): vers = [] while True: st.token = st.yycursor %{ re2c:api = record; re2c:yyrecord = st; re2c:YYFILL = \(dqfill(st) == Status.OK\(dq; re2c:eof = 0; re2c:indent:top = 2; re2c:tags = 1; num = [0\-9]+; num @t1 \(dq.\(dq @t2 num @t3 (\(dq.\(dq @t4 num)? [\en] { major = int(st.yyinput[st.token:t1]) minor = int(st.yyinput[t2:t3]) patch = int(st.yyinput[t4:st.yycursor \- 1]) if t4 != \-1 else 0 vers.append(SemVer(major, minor, patch)) break } $ { return vers } * { return None } %} def main(): fname = \(dqinput\(dq verstr = b\(dq1.22.333\en\(dq expect = [SemVer(1, 22, 333)] * BUFSIZE # Prepare input file. f = open(fname, \(dqwb\(dq) for i in range(BUFSIZE): f.write(verstr) f.close() # Run lexer on the prepared file. st = State(fname) assert lex(st, 0) == expect # Cleanup. os.remove(fname) if __name__ == \(aq__main__\(aq: main() .ft P .fi .UNINDENT .UNINDENT.ft P .fi .UNINDENT .UNINDENT .sp در اینجا مثالی از به‌کارگیری گروه‌های تسخیر (capturing groups) برای تجزیهٔ نگارش‌های معنایی (semantic versions) آورده شده است. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT from collections import namedtuple SemVer = namedtuple(\(aqSemVer\(aq, \(aqmajor minor patch\(aq) NONE = \-1 def parse(yyinput): yycursor = 0 %{ re2c:yyfill:enable = 0; re2c:captvars = 1; re2c:indent:top = 1; num = [0\-9]+; (num) \(dq.\(dq (num) (\(dq.\(dq num)? [\ex00] { major = int(yyinput[yytl1:yytr1]) minor = int(yyinput[yytl2:yytr2]) patch = 0 if yytl3 == NONE else int(yyinput[yytl3 + 1:yytr3]) return SemVer(major, minor, patch) } * { return None } %} assert parse(b\(dq23.34\e0\(dq) == SemVer(23, 34, 0) assert parse(b\(dq1.2.99999\e0\(dq) == SemVer(1, 2, 99999) assert parse(b\(dq1.a\e0\(dq) == None .ft P .fi .UNINDENT .UNINDENT .sp در اینجا مثالی از به‌کارگیری m\-tags برای تجزیهٔ نگارشی با تعداد متغیر مؤلفه‌ها آورده شده است. متغیرهای برچسب در یک trie ذخیره می‌شوند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT NONE = \-1 def parse(yyinput): yycursor = 0 %{mtags format = \(aq\en @@ = []\(aq; %} # autogenerated tag variables %{ re2c:YYMTAGP = \(dq@@.append(yycursor)\(dq; re2c:YYMTAGN = \(dq\(dq; // do nothing re2c:yyfill:enable = 0; re2c:tags = 1; re2c:indent:top = 1; num = [0\-9]+; @t1 num @t2 (\(dq.\(dq #t3 num #t4)* [\ex00] { vers = [int(yyinput[t1:t2])] for i in range(len(t3)): vers.append(int(yyinput[t3[i]:t4[i]])) return vers } * { return None } %} assert parse(b\(dq1\e0\(dq) == [1] assert parse(b\(dq1.2.3.4.5.6.7\e0\(dq) == [1, 2, 3, 4, 5, 6, 7] assert parse(b\(dq1.2.\e0\(dq) == None .ft P .fi .UNINDENT .UNINDENT.SS پشتیبانی از کدگذاری (Encoding support) .sp درک تفاوت بین \fBنقطه‌های کد (code points)\fP و \fBواحدهای کد (code units)\fP ضروری است\&. یک نقطه کد، شناسه عددی یک نماد است. یک واحد کد، کوچک‌ترین واحد ذخیره‌سازی در متن کدگذاری‌شده است. یک نقطه کد تکی ممکن است با یک یا چند واحد کد نمایش داده شود. در یک کدگذاری با طول ثابت، تمام نقطه‌های کد با تعداد یکسانی از واحدهای کد نشان داده می‌شوند. در یک کدگذاری با طول متغیر، نقطه‌های کد ممکن است با تعداد متفاوتی از واحدهای کد نمایش داده شوند. توجه داشته باشید که قاعده \(dqany\(dq یعنی \fB[^]\fP با هر نقطه کدی تطابق دارد، اما لزوماً با هر واحد کدی تطابق ندارد (تنها راه تطبیق با هر واحد کد صرف‌نظر از نوع کدگذاری، قاعده پیش‌فرض \fB*\fP است). تحلیل‌گر لغوی تولیدشده با جریانی از واحدهای کد کار می‌کند: \fByych\fP یک واحد کد را ذخیره می‌کند و \fBYYCTYPE\fP نوع واحد کد است. از سوی دیگر، عبارت‌های منظم برحسب نقطه‌های کد مشخص می‌شوند. هنگامی که re2py عبارت‌های منظم را به اتوماتا کامپایل می‌کند، نقطه‌های کد را به واحدهای کد ترجمه می‌نماید. این کار معمولاً یک نگاشت ساده نیست: در کدگذاری‌های با طول متغیر، ممکن است یک بازه از یک نقطه کد منفرد به یک گراف پیچیده از واحدهای کد ترجمه شود. کدگذاری‌های زیر پشتیبانی می‌شوند: .INDENT 0.0 .IP \(bu 2 \fBASCII\fP (به‌طور پیش‌فرض فعال است). یک کدگذاری با طول ثابت با فضای کد \fB[0\-255]\fP و نقطه‌های کد و واحدهای کد ۱\-بایتی است. .IP \(bu 2 \fBEBCDIC\fP (فعال‌سازی با \fB\-\-ebcdic\fP یا \fBre2c:encoding:ebcdic\fP). یک کدگذاری با طول ثابت با فضای کد \fB[0\-255]\fP و نقطه‌های کد و واحدهای کد ۱\-بایتی است. .IP \(bu 2 \fBUCS2\fP (فعال‌سازی با \fB\-\-ucs2\fP یا \fBre2c:encoding:ucs2\fP). یک کدگذاری با طول ثابت با فضای کد \fB[0\-0xFFFF]\fP و نقطه‌های کد و واحدهای کد ۲\-بایتی است. .IP \(bu 2 \fBUTF8\fP (فعال‌سازی با \fB\-\-utf8\fP یا \fBre2c:encoding:utf8\fP). یک کدگذاری Unicode با طول متغیر است. اندازه واحد کد ۱ بایت است. نقطه‌های کد با 1 \-\- 4 واحد کد نمایش داده می‌شوند. .IP \(bu 2 \fBUTF16\fP (فعال‌سازی با \fB\-\-utf16\fP یا \fBre2c:encoding:utf16\fP). یک کدگذاری Unicode با طول متغیر است. اندازه واحد کد ۲ بایت است. نقطه‌های کد با 1 \-\- 2 واحد کد نمایش داده می‌شوند. .IP \(bu 2 \fBUTF32\fP (فعال‌سازی با \fB\-\-utf32\fP یا \fBre2c:encoding:utf32\fP). یک کدگذاری Unicode با طول ثابت با فضای کد \fB[0\-0x10FFFF]\fP و نقطه‌های کد و واحدهای کد ۴\-بایتی است. .UNINDENT .sp فایل‌های ضمیمه \fBinclude/unicode_blocks.re\fP، \fBinclude/unicode_categories.re\fP و \fBinclude/unicode_properties.re\fP تعاریف re2py را برای بلوک‌ها، دسته‌ها و ویژگی‌های شرح‌داده‌شده در استاندارد Unicode ارائه می‌دهند. .sp گزینه \fB\-\-input\-encoding\fP کدگذاری فایل منبع را مشخص می‌کند، که می‌تواند برای فعال‌سازی لیترال‌های Unicode در عبارت‌های منظم استفاده شود. برای مثال، \fB\-\-input\-encoding utf8\fP به re2py اعلام می‌کند که فایل منبع به فرمت UTF8 است (این با \fB\-\-utf8\fP که کدگذاری متن ورودی را تنظیم می‌کند متفاوت است). گزینه \fB\-\-encoding\-policy\fP نحوه مدیریت جانشین‌های یونیکد (Unicode surrogates؛ نقطه‌های کد در محدوده \fB[0xD800\-0xDFFF]\fP) را توسط re2py تعیین می‌کند. .sp در زیر نمونه‌ای از یک تحلیل‌گر لغوی برای شناسه‌های Unicode با کدگذاری UTF8 آورده شده است. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT \-\-utf8 %{include \(dqunicode_categories.re\(dq %} def lex(yyinput): yycursor = 0 %{ re2c:yyfill:enable = 0; re2c:indent:top = 1; // Simplified \(dqUnicode Identifier and Pattern Syntax\(dq // (see https://unicode.org/reports/tr31) id_start = L | Nl | [$_]; id_continue = id_start | Mn | Mc | Nd | Pc | [\eu200D\eu05F3]; identifier = id_start id_continue*; identifier { return True } * { return False } %} assert lex(bytes(\(dq_Ыдентификатор\e0\(dq, \(dqutf\-8\(dq)) .ft P .fi .UNINDENT .UNINDENT.SS فایل‌های ضمیمه (Include files) .sp ابزار re2py به شما اجازه می‌دهد فایل‌های دیگر را با استفاده از بلوکی به شکل \fB/*!include:re2c FILE */\fP یا \fB%{include FILE %}\fP، یا دستور درون‌بلوکی \fB!include FILE ;\fP ضمیمه کنید، که در آن \fBFILE\fP مسیر فایلی است که باید ضمیمه شود. re2py فایل‌های ضمیمه را در دایرکتوریِ فایلِ دربرگیرنده و در مکان‌های include (که می‌توان با گزینهٔ \fB\-I\fP مشخص کرد) جستجو می‌کند. بلوک‌ها/دستورهای ضمیمه‌سازی در re2py به همان شیوهٔ \fB#include\fP در C/C++ عمل می‌کنند: محتویات \fBFILE\fP عیناً به جای بلوک/دستور کپی و جای‌گذاری می‌شوند. فایل‌های ضمیمه می‌توانند خود دارای includeهای بیشتری باشند. از گزینهٔ \fB\-\-depfile\fP برای ردیابی وابستگی‌های ساخت فایل خروجی نسبت به فایل‌های ضمیمه استفاده کنید. ابزار re2py تعدادی فایل ضمیمه از پیش تعریف‌شده ارائه می‌دهد که در زیردایرکتوری \fBinclude/\fP از پروژه قرار دارند. این فایل‌ها شامل تعاریفی هستند که ممکن است برای پروژه‌های دیگر نیز مفید باشند (مانند دسته‌بندی‌های Unicode) و چیزی شبیه به یک کتابخانه استاندارد را برای re2py تشکیل می‌دهند\&. در ادامه مثالی از به‌کارگیری فایل‌های ضمیمه آورده شده است. .SS فایل ضمیمه ۱ (definitions.py) .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C from enum import Enum class Num(Enum): INT = 1 FLOAT = 2 NAN = 3 %{ number = [1\-9][0\-9]*; %} .ft P .fi .UNINDENT .UNINDENT .SS فایل ضمیمه ۲ (extra_rules.re.inc) .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // floating\-point numbers frac = [0\-9]* \(dq.\(dq [0\-9]+ | [0\-9]+ \(dq.\(dq; exp = \(aqe\(aq [+\-]? [0\-9]+; float = frac exp? | [0\-9]+ exp; float { return Num.FLOAT } .ft P .fi .UNINDENT .UNINDENT .SS فایل ورودی (Input file) .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT %{include \(dqdefinitions.py\(dq %} def lex(yyinput): yycursor = 0 %{ re2c:yyfill:enable = 0; re2c:indent:top = 1; * { return Num.NAN } number { return Num.INT } !include \(dqextra_rules.re.inc\(dq; %} assert lex(b\(dq123\e0\(dq) == Num.INT assert lex(b\(dq123.4567\e0\(dq) == Num.FLOAT .ft P .fi .UNINDENT .UNINDENT.SS "فایل‌های سرآیند (Header files)" .sp ابزار re2py به کاربر امکان می‌دهد تا با استفاده از گزینهٔ \fB\-\-header\fP یا پیکربندی \fBre2c:header\fP و جفت‌بلوک‌هایی به شکل \fB/*!header:re2c:on*/\fP و \fB/*!header:re2c:off*/\fP، یا \fB%{header:on%}\fP و \fB%{header:off%}\fP\&، از فایل ورودی \fB\&.re\fP یک فایل سرآیند تولید کند. بلوک نخست آغاز فایل سرآیند و بلوک دوم پایان آن را مشخص می‌سازد. هر آنچه میان این دو بلوک قرار گیرد توسط re2py پردازش شده و کد تولیدشده در فایلی که با گزینهٔ \fB\-\-header\fP یا پیکربندی \fBre2c:header\fP مشخص شده نوشته می‌شود (یا در صورت عدم استفاده از گزینه یا پیکربندی، در \fBstdout\fP نوشته خواهد شد). فایل سرآیند تولیدشدهٔ خودکار ممکن است در مواردی نیاز باشد که از re2py برای ایجاد تعاریفی استفاده می‌شود که باید از سایر واحدهای ترجمه (translation units) قابل مشاهده باشند. .sp در ادامه مثالی از تولید یک فایل سرآیند آورده شده است که شامل تعریف وضعیت لکسر (lexer state) به همراه متغیرهای برچسب (tag variables) است (تعداد متغیرها به دستور زبان باقاعده بستگی داشته و برای برنامه‌نویس نامشخص است). .SS "فایل ورودی (Input file)" .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # re2py $INPUT \-o $OUTPUT \-\-header lexer/state.py from lexer.state import State %{header:on %} class State: def __init__(self, str): self.yyinput = str self.yycursor = 0 %{stags format = \(dq\en self.@@ = 0\(dq; %} %{header:off %} def lex(yyrecord): %{ re2c:api = record; re2c:tags = 1; re2c:yyfill:enable = 0; re2c:indent:top = 1; re2c:header = \(dqlexer/state.py\(dq; [a]* @t [b]* { return t } %} assert lex(State(b\(dqab\e0\(dq)) == 1 .ft P .fi .UNINDENT .UNINDENT .SS "فایل سرآیند (Header file)" .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C # Generated by re2c class State: def __init__(self, str): self.yyinput = str self.yycursor = 0 self.yyt1 = 0 .ft P .fi .UNINDENT .UNINDENT .SS "برنامه‌های اسکلت (Skeleton programs)" .sp با استفاده از گزینهٔ \fB\-S, \-\-skeleton\fP، ابزار re2py تمام کدهای غیر re2py را نادیده گرفته و یک برنامهٔ خودکفای C تولید می‌کند که می‌تواند در ادامه کامپایل و اجرا شود. این برنامه از کد لکسر و داده‌های ورودی تشکیل شده است. به ازای هر DFA (بلوک یا شرط) ساخته‌شده، re2py یک لکسر مستقل و دو فایل تولید می‌کند: یک فایل \fB\&.input\fP شامل رشته‌های مشتق‌شده از DFA و یک فایل \fB\&.keys\fP با نتایج تطابق مورد انتظار. برنامه هر لکسر را روی فایل \fB\&.input\fP متناظر اجرا کرده و نتایج را با موارد مورد انتظار مقایسه می‌کند. برنامه‌های اسکلت به دلایل متعددی بسیار سودمند هستند: .INDENT 0.0 .IP \(bu 2 آن‌ها می‌توانند صحت بهینه‌سازی‌های گوناگون re2py را بررسی کنند (داده‌ها در مراحل اولیهٔ پردازش و پیش از اعمال هرگونه دگرگونی بر روی DFA تولید می‌شوند). .IP \(bu 2 تولید مجموعه‌ای از داده‌های ورودی با پوشش‌دهی مناسب می‌تواند هم برای آزمون و هم برای سنجش کارایی (benchmarking) مفید باشد. .IP \(bu 2 تولید برنامه‌های اجرایی خودکفا امکان به‌دست آوردن نمونه‌های آزمون کمینه‌شده (minimized test cases) را فراهم می‌سازد (چرا که کد اصلی ممکن است بسیار بزرگ بوده یا وابستگی‌های فراوانی داشته باشد). .UNINDENT .sp دشواری تولید داده‌های ورودی در این است که برای تمامی موارد به جز ساده‌ترین حالت‌ها، تعداد رشته‌های ورودیِ ممکن بیش از حد زیاد است (حتی در حالتی که طول رشته محدود باشد). ابزار re2py این مشکل را با تولید رشته‌های کافی به منظور پوشش تقریباً تمام گذارهای DFA حل می‌کند. این ابزار از الگوریتم زیر بهره می‌برد: نخست، اسکلتی از DFA می‌سازد. برای کدگذاری‌هایی با اندازهٔ واحد کد ۱ بایتی (مانند ASCII، UTF\-8 و EBCDIC) اسکلت تنها یک رونوشت دقیق از DFA اولیه است. برای کدگذاری‌هایی با واحدهای کد چندبایتی، اسکلت رونوشتی از DFA با حذف برخی گذارهاست: به این صورت که re2py برای هر بازهٔ پیوسته و مجزا که با یک گذار DFA مطابقت دارد، حداکثر ۲۵۶ واحد کد برمی‌گزیند. مقادیر انتخاب‌شده به‌طور یکنواخت توزیع شده‌اند و شامل کران‌های بازه نیز می‌شوند. re2py به جای تلاش برای پوشش تمام مسیرهای ممکن در اسکلت (که امری ناشدنی است)، مسیرهای کافی را برای پوشش تمامی گذارهای اسکلت ایجاد می‌کند و بدین ترتیب پرش‌های شرطی متناظر را در لکسر فعال می‌سازد. پیاده‌سازی این الگوریتم به حدود ۱ گیگابایت گذار محدود شده است و مقدار ثابتی از حافظه را مصرف می‌کند (re2py داده‌ها را به محض تولید، در فایل می‌نویسد)..SS "بصری‌سازی و اشکال‌زدایی" .sp با گزینهٔ \fB\-D, \-\-emit\-dot\fP، برنامهٔ re2py کدی تولید نمی‌کند. در عوض، DFA تولیدشده را در قالب DOT خروجی می‌دهد. می‌توان این خروجی را با استفاده از Graphviz یا کتابخانه‌ای دیگر به تصویری از DFA تبدیل کرد. توجه داشته باشید که این گزینه، DFA نهایی را پس از اعمال چندین مرحله بهینه‌سازی و تبدیل نمایش می‌دهد. مراحل پیشین را می‌توان با گزینه‌های گوناگون اشکال‌زدایی، مانند \fB\-\-dump\-nfa\fP، \fB\-\-dump\-dfa\-raw\fP و غیره خروجی گرفت (فهرست کامل گزینه‌ها را ببینید). .SH "همچنین ببینید (SEE ALSO)" .sp می‌توانید اطلاعات بیشتری دربارهٔ re2c در وبگاه رسمی بیابید: \fI\%http://re2c.org\fP\&. برنامه‌های مشابه عبارتند از flex(1)، lex(1)، quex(\fI\%http://quex.sourceforge.net\fP). .SH "نویسندگان (AUTHORS)" .sp برنامهٔ re2py در ابتدا توسط Peter Bumbulis (\fI\%peter@csg.uwaterloo.ca\fP) در سال ۱۹۹۳ نوشته شد. Marcus Boerger و Dan Nuffer چندین سال وقت صرف کردند تا ایدهٔ اولیه را به یک مولد کد آماده برای استفاده در محیط عملیاتی تبدیل کنند. از آن زمان تاکنون، این پروژه توسط داوطلبان متعددی نگهداری و توسعه یافته است، به‌ویژه: Brian Young (\fI\%bayoung@acm.org\fP)، \fI\%Marcus Boerger\fP، Dan Nuffer (\fI\%nuffer@users.sourceforge.net\fP)، \fI\%Ulya Trofimovich\fP (\fI\%skvadrik@gmail.com\fP)، \fI\%Serghei Iakovlev\fP، \fI\%Sergei Trofimovich\fP، \fI\%Petr Skocik\fP، \fI\%ligfx\fP \fI\%raekye\fP و \fI\%PolarGoose\fP\&. .\" Generated by docutils manpage writer. .