.\" 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 "RE2JS" 1 "" "" "" .SH "نام (NAME)" re2js \- تولید تحلیل‌گرهای واژگانی سریع برای JavaScript .SH "خلاصه دستور (SYNOPSIS)" .sp re2js \fB[ OPTIONS ]\fP \fB[ WARNINGS ]\fP \fBINPUT\fP .sp ورودی می‌تواند یک فایل یا \fB\-\fP برای stdin باشد. .SH "مقدمه (INTRODUCTION)" .sp ابزار re2js مانند یک پیش‌پردازنده عمل می‌کند. این ابزار فایل ورودی (که معمولاً برنامه‌ای در JavaScript است، اما می‌تواند هر چیز دیگری باشد) را می‌خواند و به دنبال بلوک‌های کدی می‌گردد که درون نشانگرهای آغاز/پایان با فرم خاص محصور شده‌اند. متن خارج از این بلوک‌ها عیناً به فایل خروجی کپی می‌شود. محتوای درون بلوک‌ها توسط re2js پردازش می‌شود. این ابزار آن‌ها را به کد JavaScript ترجمه کرده و کد تولیدشده را به جای آن بلوک قرار می‌دهد. .sp در اینجا مثالی از یک برنامه کوچک آورده شده است که بررسی می‌کند آیا رشته داده‌شده شامل یک عدد ده‌دهی است یا خیر: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $INPUT \-o $OUTPUT function lex(yyinput) { let yycursor = 0; /*!re2c re2c:yyfill:enable = 0; [1\-9][0\-9]* { return true; } * { return false; } */ } if (!lex(\(dq1234\e0\(dq)) { throw \(dqerror!\(dq } .ft P .fi .UNINDENT .UNINDENT .sp در خروجی، re2js بلوک میانی را با کد تولیدشده جایگزین کرده است: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // Generated by re2js // re2js $INPUT \-o $OUTPUT function lex(yyinput) { let yycursor = 0; { let yych = 0 let yystate = 0 yyl: while (true) { switch (yystate) { case 0: yych = yyinput.charCodeAt(yycursor) yycursor += 1; switch (yych) { case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: yystate = 2 continue yyl default: yystate = 1 continue yyl } case 1: { return false; } case 2: yych = yyinput.charCodeAt(yycursor) switch (yych) { case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: yycursor += 1; yystate = 2 continue yyl default: yystate = 3 continue yyl } case 3: { return true; } default: throw \(dqinternal lexer error\(dq } } } } if (!lex(\(dq1234\e0\(dq)) { throw \(dqerror!\(dq } .ft P .fi .UNINDENT .UNINDENT.SH "مبانی (BASICS)" .sp یک برنامهٔ re2js شامل دنباله‌ای از \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 نمایی کلی از نحو عبارت‌های منظم در re2js ارائه می‌دهد. پس از تعریف، \fBname\fP می‌تواند در دیگر عبارت‌های منظم و قواعد استفاده شود. بازگشت در تعاریف نام‌گذاری‌شده مجاز نیست و هر نام باید پیش از استفاده تعریف شده باشد. یک بلوک، تعاریف نام‌گذاری‌شده را از حوزهٔ سراسری به ارث می‌برد. تعریف مجدد نامی که در حوزهٔ فعلی وجود دارد یک خطا است. .TP .B \fBconfiguration = value ;\fP یک \fIپیکربندی\fP امکان تغییر رفتار re2js و سفارشی‌سازی کد تولیدشده را فراهم می‌کند. برای مشاهدهٔ فهرست کاملی از پیکربندی‌های پشتیبانی‌شده در re2js بخش \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 or \fB%{[:] ... %}\fP یک \fIبلوک سراسری\fP شامل تعاریف، پیکربندی‌ها، قواعد و دستورالعمل‌ها است. ابزار re2js عبارت‌های منظم مربوط به هر قاعده را در یک اتوماتون متناهی معین کامپایل کرده، آن را در قالب پرش‌های شرطی در زبان مقصد کدگذاری می‌کند و بلوک را با کد تولیدشده جایگزین می‌نماید. نام‌ها و پیکربندی‌های تعریف‌شده در یک بلوک سراسری به حوزهٔ سراسری اضافه شده و برای بلوک‌های بعدی قابل مشاهده خواهند بود. در ابتدای برنامه، حوزهٔ سراسری با \fI\%گزینه‌های\fP خط فرمان مقداردهی اولیه می‌شود\&. .TP .B \fB/*!local:re2c[:] ... */\fP or \fB%{local[:] ... %}\fP یک \fIبلوک محلی\fP شبیه یک بلوک سراسری است، اما نام‌ها و پیکربندی‌های موجود در آن حوزهٔ محلی دارند (بر سایر بلوک‌ها تأثیری نمی‌گذارند). .TP .B \fB/*!rules:re2c[:] ... */\fP or \fB%{rules[:] ... %}\fP یک \fIبلوک قواعد\fP شبیه یک بلوک محلی است، با این تفاوت که به خودی خود کدی تولید نمی‌کند و تعریفی را هم به حوزهٔ سراسری اضافه نمی‌نماید \-\- بلکه هدف آن، استفادهٔ مجدد در سایر بلوک‌ها است. این روشی برای اشتراک‌گذاری کد است (جزئیات بیشتر در بخش \fI\%بلوک‌های با قابلیت استفاده مجدد\fP). پیش از نسخهٔ 2.2 در re2js، بلوک‌های قواعد نیازمند گزینهٔ \fB\-r \-\-reusable\fP بودند. .TP .B \fB/*!use:re2c[:] ... */\fP or \fB%{use[:] ... %}\fP یک بلوک استفاده که به یک بلوک قواعد از پیش تعریف‌شده ارجاع می‌دهد. اگر نامی مشخص شده باشد، re2js به دنبال یک بلوک قواعد با این نام می‌گردد. در غیر این صورت، نزدیک‌ترین بلوک قواعد قبلی استفاده می‌شود (چه نام‌گذاری‌شده باشد و چه بی‌نام). یک بلوک استفاده می‌تواند تعاریف، پیکربندی‌ها و قواعد مخصوص به خود را اضافه کند که به موارد موجود در بلوک قواعد ارجاع‌شده افزوده می‌شوند. پیش از نسخهٔ 2.2 در re2js، بلوک‌های استفاده به گزینهٔ \fB\-r \-\-reusable\fP نیاز داشتند. .TP .B \fB/*!max:re2c[:[:...]] ... */\fP or \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 or \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 or \fB%{stags[:[:...]] ... %}\fP, \fB%{mtags[:[:...]] ... %{\fP بلوک‌هایی که یک قطعه‌کد الگو را مشخص می‌کنند که برای هر متغیر s\-tag/m\-tag تولیدشده توسط re2js بسط داده می‌شود\&. یک فهرست اختیاری از نام‌های بلوک مشخص می‌کند که هنگام محاسبهٔ مجموعه متغیرهای برچسب کدام بلوک‌ها باید لحاظ گردند (اگر فهرست خالی باشد، تمام بلوک‌ها لحاظ می‌شوند). دو پیکربندی اختیاری وجود دارد: \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 or \fB%{svars[:[:...]] ... %}\fP, \fB%{mvars[:[:...]] ... %{\fP بلوک‌هایی که یک قطعه‌کد الگو را تعیین می‌کنند که برای هر s\-tag/m\-tag صریحاً ذکرشده توسط قواعد (با گزینهٔ \fB\-\-tags\fP) یا به صورت ضمنی تولیدشده توسط re2js (با گزینه‌های \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 or \fB%{getstate[:[:...]] ... %}\fP بلوکی که یک ارسال شرطی روی وضعیت تحلیل‌گر لغوی تولید می‌کند (به گزینهٔ \fB\-\-storable\-state\fP نیاز دارد). یک فهرست اختیاری از نام‌های بلوک مشخص می‌کند که کدام بلوک‌ها باید در ارسال وضعیت گنجانده شوند. گذار پیش‌فرض به برچسب شروع اولین بلوک موجود در فهرست می‌رود. اگر فهرست خالی باشد، همهٔ بلوک‌ها گنجانده شده و گذار پیش‌فرض به نخستین بلوک دارای برچسب شروع در فایل منتقل می‌شود. این نوع بلوک با گزینهٔ \fB\-\-loop\-switch\fP ناسازگار است، چرا که به گذارهای بین‌بلوکی نیاز دارد که بدون \fBgoto\fP یا فراخوانی‌های توابع پشتیبانی نمی‌شوند. .TP .B \fB/*!conditions:re2c[:[:...]] ... */\fP, \fB/*!types:re2c... */\fP or \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 or \fB%{include %}\fP این بلوک امکان درج \fB\fP را فراهم می‌کند، که باید یک مسیر فایل درون علامت نقل‌قول دوتایی باشد. محتویات فایل عیناً به جای بلوک جایگزین می‌شود، دقیقاً به همان شیوه‌ای که \fB#include\fP در C/C++ عمل می‌کند. این بلوک می‌تواند همراه با گزینهٔ \fB\-\-depfile\fP برای تولید وابستگی‌های سامانهٔ ساخت به فایل‌های درج‌شده به کار رود. .TP .B \fB/*!header:re2c:on*/\fP or \fB%{header:on %}\fP این بلوک نشان‌دهندهٔ آغاز فایل سرآیند است. هر چیزی پس از آن و تا بلوک بعدی \fBheader:off\fP توسط re2js پردازش شده و در فایل سرآیند تعیین‌شده با گزینهٔ \fB\-t \-\-type\-header\fP نوشته می‌شود. .TP .B \fB/*!header:re2c:off*/\fP or \fB%{header:off %}\fP این بلوک نشان‌دهندهٔ پایان فایل سرآیندی است که با بلوک \fBheader:on*/\fP آغاز شده بود. .TP .B \fB/*!ignore:re2c ... */\fP or \fB%{ignore ... %}\fP بلوکی که محتویات آن نادیده گرفته شده و از فایل خروجی حذف می‌شود. .UNINDENT.SS "پیکربندی‌ها (Configurations)" .sp در اینجا فهرست کاملی از پیکربندی‌های پشتیبانی‌شده توسط re2js آورده شده است: .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 است\&. یک جای‌نگه‌دار با نشانگر آغاز شده و به دنبال آن نام آرگومان درون دو آکولاد می‌آید. برای مثال، اگر نشانگر روی \fB$\fP تنظیم شود، جای‌نگه‌دارها به شکل \fB${name}\fP خواهند بود\&. رابط‌های تک‌آرگومانی ممکن است از نشانه‌گذاری کوتاه بدون نام درون آکولاد استفاده کنند. این گزینه می‌تواند با گزینه‌های مربوط به هر بنیادینهٔ 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)، اما برای بافتار کلی لکسر ارائه نمی‌شوند؛ بنابراین این بنیادینه‌ها رفتاری شبیه‌تر به ماکروها در 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 تودرتو و نقشه‌های بیتی می‌شود. مقدار پیش‌فرض \fB9\fP است\&. .TP .B \fBre2c:cond:abort\fP اگر روی یک مقدار عددی صحیح مثبت تنظیم شود، حالت پیش‌فرض در توزیع شرط تولیدشده، اجرای برنامه را لغو می‌کند. .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 نماد دیده‌بان (sentinel symbol) مورد استفاده همراه با قاعدهٔ پایان ورودی \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 عبارت مورد استفاده برای متغیرهای برچسب را مشخص می‌کند. به‌طور پیش‌فرض re2js عبارت‌هایی به شکل \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 است (در این حالت re2js فرض می‌کند که نماد نگهبان صفر است که معمول‌ترین حالت می‌باشد). تنها اعداد ده‌دهی شناسایی می‌شوند. .TP .B \fBre2c:state:abort\fP اگر روی یک مقدار صحیح مثبت تنظیم شود، حالت پیش‌فرض (default case) در توزیع وضعیت (state dispatch) تولیدشده، اجرای برنامه را لغو (abort) می‌کند، و یک حالت صریح \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 است، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. اگر روی صفر تنظیم شود، از تولید بسته‌بندی‌های (wrappers) \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 را باطل (override) می‌کند. .TP .B \fBre2c:YYFILL:naked\fP, \fBre2c:define:YYFILL:naked\fP پیکربندی عمومی‌تر \fBre2c:api:style\fP را برای \fBYYFILL\fP باطل (override) می‌کند. مقدار صفر متناظر با شیوهٔ API با قالب آزاد (free\-form) است. .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 باطل (override) می‌کند. مقدار صفر متناظر با شیوهٔ API با قالب آزاد است. .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 باطل (override) می‌کند. مقدار صفر متناظر با شیوهٔ API با قالب آزاد است. .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 را باطل (override) می‌کند. .TP .B \fBre2c:YYSETCOND:naked\fP, \fBre2c:define:YYSETCONDITION:naked\fP پیکربندی عمومی‌تر \fBre2c:api:style\fP را برای \fBYYSETCOND\fP باطل (override) می‌کند. مقدار صفر متناظر با شیوهٔ API با قالب آزاد است. .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 را باطل (override) می‌کند. .TP .B \fBre2c:YYSETSTATE:naked\fP, \fBre2c:define:YYSETSTATE:naked\fP پیکربندی عمومی‌تر \fBre2c:api:style\fP را برای \fBYYSETSTATE\fP باطل (override) می‌کند. مقدار صفر متناظر با شیوهٔ API با قالب آزاد است. .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 اگر روی غیرصفر تنظیم شود، re2js به طور خودکار هر بار که \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 در generic API و مقایسهٔ مبتنی بر \fBYYLIMIT\fP در C pointer API) جلوگیری می‌کند. مقدار پیش‌فرض غیرصفر است (بررسی را تولید می‌کند). .TP .B \fBre2c:yyfill:enable\fP اگر روی صفر تنظیم شود، از تولید \fBYYFILL\fP (همراه با بررسی آن) جلوگیری می‌کند. این تنظیم زمانی باید استفاده شود که کل ورودی در یک بخش یکپارچه از حافظه قرار می‌گیرد (نیازی به بافر کردن نیست) و بررسی‌های پایان ورودی به بررسی‌های \fBYYFILL\fP متکی نیستند (برای مثال اگر از یک نویسهٔ نگهبان استفاده شود). برای اطمینان از اینکه تحلیل‌گر لغوی تولیدشده نمی‌تواند فراتر از پایان ورودی را بخواند، از هشدارها (گزینهٔ \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 ابزار re2js از نحو زیر برای عبارات باقاعده استفاده می‌کند: .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؛ پرانتزها برای تغییر اولویت استفاده می‌شوند. اگر استخراج زیرتطبیق فعال باشد، \fB(R)\fP بسته به گزینهٔ \fB\-\-invert\-captures\fP یک گروه گیرنده یا غیرگیرنده خواهد بود. .TP .B \fB(!R)\fP اگر استخراج زیرتطبیق فعال باشد، \fB(!R)\fP بسته به گزینهٔ \fB\-\-invert\-captures\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 در اینجا فهرستی از کنش‌های از پیش تعریف‌شده که توسط re2js پشتیبانی می‌شوند آمده است: .INDENT 0.0 .TP .B \fB!entry code\fP کنش ورود، یک بلوک تعریف‌شده توسط کاربر از \fBcode\fP را به وضعیت آغازین ماشین حالت متناهی فعلی مقید می‌کند. اگر از \fI\%شرایط آغازین\fP استفاده شود، کنش ورود را می‌توان به صورت جداگانه برای هر شرط تنظیم کرد. از این کنش می‌توان برای انجام مقداردهی اولیه، مانند ذخیره مکان آغاز نشانه (lexeme)، استفاده کرد. .TP .B \fB!pre_rule code\fP کنش پیش‌قاعده، یک بلوک تعریف‌شده توسط کاربر از \fBcode\fP را به ابتدای کنش‌های معنایی تمام قواعد در بلوک فعلی (یا شرط، در صورت استفاده از \fI\%شرایط آغازین\fP) می‌افزاید. از این کنش می‌توان برای فاکتورگیری بخش مشترک تمام کنش‌های معنایی (مانند ذخیره مکان پایان نشانه) استفاده کرد. .TP .B \fB!post_rule code\fP کنش پس‌قاعده، یک بلوک تعریف‌شده توسط کاربر از \fBcode\fP را به انتهای کنش‌های معنایی تمام قواعد در بلوک فعلی (یا شرط، در صورت استفاده از \fI\%شرایط آغازین\fP) پیوست می‌کند. از این کنش می‌توان برای صدور دستورهای تله (trap statements) که در برابر جریان کنترل ناخواسته محافظت می‌کنند استفاده کرد. .UNINDENT .SS "دستورالعمل‌ها (Directives)" .sp در اینجا فهرست کاملی از دستورالعمل‌های پشتیبانی‌شده توسط re2js آمده است: .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بنیادین‌ها\fP که مجموعاً به عنوان \fIAPI\fP شناخته می‌شوند، با برنامه بیرونی ارتباط برقرار می‌کند. اینکه کدام بنیادین‌ها باید برای یک برنامه خاص تعریف شوند به عوامل متعددی بستگی دارد، از جمله پیچیدگی عبارات باقاعده، نحوه نمایش ورودی، بافرینگ و استفاده از ویژگی‌های گوناگون. تمام بنیادین‌های ضروری باید توسط کاربر در قالب ماکروها، توابع، متغیرها یا هر شکل مناسب دیگری که کد تولیدشده را از نظر نحوی و معنایی درست می‌سازد تعریف شوند. re2js تعاریف را بررسی نمی‌کند (و نمی‌تواند بکند)، بنابراین اگر چیزی ناقص باشد یا نادرست تعریف شده باشد، برنامه تولیدشده ممکن است خطاهای زمان کامپایل یا زمان اجرا داشته باشد. این راهنما مثال‌هایی از تعاریف API را در رایج‌ترین موارد ارائه می‌دهد. .sp ابزار re2js دارای سه شیوه برای API است که مجموعه اصلی بنیادین‌های مورد استفاده توسط یک برنامه را مشخص می‌کنند: .INDENT 0.0 .TP .B \fBSimple API\fP این API پیش‌فرض برای بخش پسین (backend) جاوااسکریپت است. این رابط از بنیادین‌های زیر تشکیل شده است: \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 فعال می‌شود. این رابط شامل بنیادین‌هایی برای عملیات عمومی است: \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 ورودی رسیده باشیم (به استثنای هرگونه نویسه پرکننده یا نمادهای نگهبان [sentinel])، برابر با \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 یک دستور پایه عمومی API که باید موقعیت زمینه پایانی (trailing context) ذخیره‌شده با \fBYYBACKUPCTX\fP را بازیابی کند\&. .TP .B \fBYYRESTORETAG\fP یک دستور پایه عمومی API با یک متغیر \fBtag\fP که باید موقعیت زمینه پایانی را به مقدار \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 واحد کد (code unit) جابه‌جا کند (مقدار جابه‌جایی ممکن است منفی باشد). .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 قابل تغییر نیستند. گزینه‌های اشکال‌زدایی به‌طور کلی نیازمند ساخت re2c در پیکربندی اشکال‌زدایی هستند. گزینه‌های داخلی برای آزمایش الگوریتم‌های به‌کاررفته در re2c مفید هستند. .INDENT 0.0 .TP .B \fB\-? \-\-help \-h\fP نمایش پیام راهنما. .TP .B \fB\-\-api \fP تعیین API مورد استفاده توسط کد تولیدشده برای برقراری ارتباط با کد تعریف‌شده توسط کاربر. گزینهٔ \fBsimple\fP باید در موارد ساده‌ای که نیازی به پر کردن مجدد بافر و ذخیرهٔ وضعیت تحلیل‌گر واژگانی (lexer) نیست به کار رود. گزینهٔ \fBrecord\fP باید زمانی استفاده شود که وضعیت تحلیل‌گر واژگانی باید در یک رکورد (\fBstruct\fP، \fBclass\fP و غیره) ذخیره شود. گزینهٔ \fBgeneric\fP باید در موارد پیچیده‌ای استفاده شود که دو API دیگر به قدر کافی انعطاف‌پذیر نیستند. .TP .B \fB\-\-bit\-vectors \-b\fP بهینه‌سازی پرش‌های شرطی با استفاده از ماسک‌های بیتی. این گزینه مستلزم \fB\-\-nested\-ifs\fP است\&. .TP .B \fB\-\-captures\fP, \fB\-\-leftmost\-captures\fP فعال‌سازی استخراج زیرتطابق با گروه‌های گیرندهٔ حریص چپ‌ترین (leftmost greedy). نتیجه در یک آرایهٔ \fByybmatch\fP با گنجایش \fB2 * YYMAXNMATCH\fP جمع‌آوری شده و \fByynmatch\fP به تعداد گروه‌ها برای قاعدهٔ تطابق‌یافته تنظیم می‌شود. .TP .B \fB\-\-captvars\fP, \fB\-\-leftmost\-captvars\fP فعال‌سازی استخراج زیرتطابق با گروه‌های گیرندهٔ حریص چپ‌ترین (leftmost greedy). نتیجه در متغیرهای \fByytl\fP و \fByytr\fP برای \fBk\fP\-امین گروه گیرنده جمع‌آوری می‌شود. .TP .B \fB\-\-case\-insensitive\fP رفتار با رشته‌های محصور در نقل‌قول تکی و جفتی به‌صورت غیرحساس به بزرگی و کوچکی حروف (case\-insensitive). .TP .B \fB\-\-case\-inverted\fP معکوس کردن مفهوم رشته‌های درون نقل‌قول تکی و جفتی: رفتار با رشته‌های درون نقل‌قول تکی به‌صورت حساس به بزرگی و کوچکی حروف و رشته‌های درون نقل‌قول جفتی به‌صورت غیرحساس به حروف. .TP .B \fB\-\-case\-ranges\fP ادغام caseهای متوالی در دستور switch به یک بازه به فرم \fBlow ... high\fP\&. این نحو یک افزونهٔ زبان C/C++ است که توسط کامپایلرهایی چون GCC، Clang و Tcc پشتیبانی می‌شود. مزیت اصلی نسبت به استفاده از caseهای منفرد، کد تولیدشدهٔ کوچک‌تر و زمان تولید سریع‌تر است، اگرچه برای برخی کامپایلرها نظیر Tcc به حجم باینری کوچک‌تر نیز می‌انجامد. .TP .B \fB\-\-computed\-gotos \-g\fP بهینه‌سازی پرش‌های شرطی با استفاده از افزونهٔ غیراستاندارد \(dqcomputed goto\(dq (که باید توسط کامپایلر پشتیبانی شود). برنامه re2js جدول‌های پرش را تنها در موارد پیچیده با انشعاب‌های شرطی فراوان تولید می‌کند. آستانهٔ پیچیدگی را می‌توان با پیکربندی \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 (conditions) مشابه Flex: چند تحلیل‌گر واژگانی مرتبط درون یک بلوک واحد. این یک راهکار جایگزین برای تعیین دستی بلوک‌های مختلف re2js است که با \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 می‌خواند. re2js فرض می‌کند بازهٔ نویسه‌ها 0 \-\- 0xFF و اندازهٔ نویسه ۱ بایت است. .TP .B \fB\-\-empty\-class \fP تعریف شیوهٔ برخورد re2js با رده‌های نویسه‌ای خالی. با \fBmatch\-empty\fP (پیش‌فرض) ردهٔ خالی با ورودی خالی تطابق می‌یابد (که غیرمنطقی است، اما برای سازگاری با گذشته حفظ شده است). با \fBmatch\-none\fP ردهٔ خالی همیشه در تطابق شکست می‌خورد. با \fBerror\fP ردهٔ خالی خطای کامپایل ایجاد می‌کند. .TP .B \fB\-\-encoding\-policy \fP تعریف شیوهٔ برخورد re2js با جانشین‌های یونیکد (Unicode surrogates). با \fBfail\fP برنامه re2js هنگام مواجهه با یک جانشین با خطا متوقف می‌شود. با \fBsubstitute\fP برنامه re2js بدون هشدار، جانشین‌ها را با نقطه کد خطای 0xFFFD جایگزین می‌کند. با \fBignore\fP (پیش‌فرض) re2js با جانشین‌ها مانند نقاط کد عادی رفتار می‌کند. استاندارد یونیکد بیان می‌کند که جانشین‌های مستقل نامعتبر هستند، اما برنامه‌ها و کتابخانه‌های دنیای واقعی رفتارهای متفاوتی دارند. .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 \-I PATH افزودن \fBPATH\fP به فهرست مکان‌هایی که هنگام جستجوی فایل‌های include استفاده می‌شوند. این گزینه در ترکیب با بلوک یا دستورالعمل \fBinclude\fP کاربرد دارد. برنامه re2js به دنبال \fBFILE\fP در دایرکتوری فایل والد و در مسیرهای include مشخص‌شده با گزینهٔ \fB\-I\fP می‌گردد. .TP .B \fB\-\-input \fP نام مستعار منسوخ‌شده برای \fB\-\-api\fP\&. گزینهٔ \fBdefault\fP متناظر با \fBsimple\fP است (در واقع برای اکثر بک‌اندها پیش‌فرض است، اما نه همه). گزینهٔ \fBcustom\fP متناظر با \fBgeneric\fP است\&. .TP .B \fB\-\-input\-encoding \fP تعیین شیوهٔ تجزیهٔ عبارت‌های باقاعده توسط re2js. با \fBascii\fP (پیش‌فرض) re2js با ورودی به صورت کدگذاری‌شده با ASCII رفتار می‌کند: هر دنباله‌ای از واحدهای کد، دنباله‌ای از نویسه‌های تک‌بایتی مستقل است. با \fButf8\fP برنامه re2js ورودی را با کدگذاری 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\&. نتیجه در متغیرهای \fByytl\fP و \fByytr\fP برای \fBk\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 تولید یک تحلیل‌گر لغوی که می‌تواند وضعیت درونی خود را ذخیره کند. این ویژگی در تحلیل‌گرهای لغوی مدل push که در صورت نبود ورودی کافی توسط یک برنامهٔ بیرونی متوقف شده و سپس با فراهم شدن ورودی بیشتر از سر گرفته می‌شوند، مفید است. در این حالت کاربران باید علاوه بر این موارد اولیهٔ \fBYYGETSTATE\fP و \fBYYSETSTATE\fP را تعریف کنند، و متغیرهای \fByych\fP، \fByyaccept\fP و \fBstate\fP باید بخشی از وضعیت ذخیره‌شدهٔ تحلیل‌گر لغوی باشند. .TP .B \fB\-\-syntax FILE\fP بارگذاری پیکربندی‌ها از \fBFILE\fP مشخص‌شده و اعمال آن‌ها روی فایل نحو پیش‌فرض. توجه داشته باشید که \fBFILE\fP می‌تواند تنها چند پیکربندی را تعریف کند (اگر برای اصلاح فایل نحو پیش‌فرض استفاده شود)، یا می‌تواند یک backend زبان کاملاً جدید را تعریف کند (در حالت دوم توصیه می‌شود از گزینهٔ \fB\-\-lang none\fP استفاده شود). .TP .B \fB\-\-tags \-T\fP فعال‌سازی استخراج تطابق‌های فرعی (submatch) با تگ‌ها. .TP .B \fB\-\-ucs2 \-\-wide\-chars \-w\fP تولید یک تحلیل‌گر لغوی که ورودی با کدگذاری UCS2 را می‌خواند. re2js فرض می‌کند که بازهٔ نویسه‌ها 0 \-\- 0xFFFF و اندازهٔ نویسه ۲ بایت است. این گزینه مستلزم \fB\-\-nested\-ifs\fP است\&. .TP .B \fB\-\-utf8 \-\-utf\-8 \-8\fP تولید یک تحلیل‌گر لغوی که ورودی را با کدگذاری UTF-8 می‌خواند. re2js فرض می‌کند که بازهٔ نویسه‌ها 0 \-\- 0x10FFFF و اندازهٔ نویسه ۱ بایت است. .TP .B \fB\-\-utf16 \-\-utf\-16 \-x\fP تولید یک تحلیل‌گر لغوی که ورودی با کدگذاری UTF16 را می‌خواند. re2js فرض می‌کند که بازهٔ نویسه‌ها 0 \-\- 0x10FFFF و اندازهٔ نویسه ۲ بایت است. این گزینه مستلزم \fB\-\-nested\-ifs\fP است\&. .TP .B \fB\-\-utf32 \-\-unicode \-u\fP تولید یک تحلیل‌گر لغوی که ورودی با کدگذاری UTF32 را می‌خواند. re2js فرض می‌کند که بازهٔ نویسه‌ها 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 منسوخ‌شده. هیچ کاری انجام نمی‌دهد (اکنون تک‌گذره یا single pass حالت پیش‌فرض است). .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 گزینهٔ اشکال‌زدایی: خروجی دادن گراف جریان کنترل متغیرهای تگ (به قالب 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 مورد استفاده توسط re2js\&. گزینهٔ \fBmoore\fP همان الگوریتم مور است (که پیش‌فرض می‌باشد). گزینهٔ \fBtable\fP الگوریتم \(dqپر کردن جدول\(dq است. هر دو الگوریتم باید صرف‌نظر از برچسب‌گذاری مجدد وضعیت‌ها، DFA یکسانی تولید کنند؛ روش پر کردن جدول ساده‌تر و بسیار کندتر است و به عنوان پیاده‌سازی مرجع به‌کار می‌رود. .TP .B \fB\-\-eager\-skip\fP گزینهٔ داخلی: وادار کردن تحلیل‌گر لغوی تولیدشده به پیشروی مشتاقانه در موقعیت ورودی \-\- بلافاصله پس از خواندن نماد ورودی. این گزینه رفتار پیش‌فرض را که در آن موقعیت ورودی با تأخیر \-\- پس از گذار به وضعیت بعدی پیش می‌رود، تغییر می‌دهد. .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 گزینهٔ داخلی: مشخص‌کردن الگوریتم کوتاه‌ترین مسیر مورد استفاده برای ساخت بستار اپسیلون با معناشناسی رفع ابهام POSIX: گزینهٔ \fBgor1\fP (پیش‌فرض) بیانگر الگوریتم Goldberg\-Radzik است، و \fBgtop\fP بیانگر الگوریتم \(dqترتیب توپولوژیکی سراسری\(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 گزینهٔ داخلی: مشخص می‌کند که آیا بهینه‌سازی تگ ثابت باید برای همهٔ تگ‌ها اعمال شود (\fBall\fP)، برای هیچ‌کدام اعمال نشود (\fBnone\fP)، یا فقط برای تگ‌های موجود در الحاق بالاترین سطح اعمال گردد (\fBtoplevel\fP). پیش‌فرض \fBall\fP است\&. تگ‌های \(dqثابت\(dq آن‌هایی هستند که در یک فاصلهٔ مشخص از تگی دیگر (موسوم به \(dqپایه\(dq) قرار دارند. در چنین مواردی فقط تگ پایه باید ردگیری شود، و مقدار تگ ثابت می‌تواند به‌عنوان مقدار تگ پایه به‌علاوهٔ یک آفست ایستا محاسبه شود. برای تگ‌هایی که تحت انتخاب یا تکرار هستند، بررسی این که آیا تگ پایه مقدار عدم‌تطابق دارد یا خیر نیز الزامی است (در این حالت تگ ثابت نیز باید با نادیده گرفتن آفست، روی عدم‌تطابق تنظیم شود). برای تگ‌های موجود در الحاق بالاترین سطح نیازی به این بررسی نیست، زیرا آن‌ها همیشه مطابقت دارند. .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 اگر یک عبارت باقاعده حاوی یک کلاس نویسهٔ خالی باشد، هشدار می‌دهد. تلاش برای تطبیق یک کلاس نویسهٔ خالی بی‌معنی است: همیشه باید ناموفق باشد. با این حال، به دلایل سازگاری با گذشته، re2js کلاس‌های نویسهٔ خالی را مجاز دانسته و با آن‌ها مانند رشته‌های خالی رفتار می‌کند. از گزینهٔ \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 دربارهٔ قواعدی که توسط سایر قواعد پوشانده شده‌اند و هرگز تطبیق نخواهند یافت، هشدار می‌دهد. .TP .B \fB\-Wdeprecated\-eof_rule\fP دربارهٔ قواعد مستقل پایان ورودی \fB$\fP که با تغییرات آینده از کار خواهند افتاد و نیاز به اصلاح دارند، هشدار می‌دهد. در حال حاضر این قواعد هنگام تداخل با سایر قواعد اولویت دارند، اما پس از معرفی نماد تعمیم‌یافتهٔ پایان ورودی \fB$\fP، ترتیب اولویت تغییر خواهد کرد و این قواعد توسط سایر قواعد پوشانده خواهند شد. .TP .B \fB\-Wuseless\-escape\fP اگر نمادی گریز داده شده باشد (escaped) در حالی که نباید می‌بود، هشدار می‌دهد. به‌طور پیش‌فرض، re2js چنین گریزهایی را نادیده می‌گیرد، اما این ممکن است نشان‌دهندهٔ یک اشتباه تایپی یا خطا در توالی گریز باشد. .TP .B \fB\-Wnondeterministic\-tags\fP اگر یک برچسب دارای درجهٔ \fBn\fP\-ام از عدم‌قطعیت باشد، در جایی که \fBn\fP بزرگ‌تر از ۱ است، هشدار می‌دهد. .TP .B \fB\-Wsentinel\-in\-midrule\fP اگر نماد نگهبان در میانهٔ یک قاعده رخ دهد هشدار می‌دهد \-\-\- این امر ممکن است باعث خواندن فراتر از انتهای بافر، فروپاشی یا خرابی حافظه در تحلیل‌گر لغوی تولیدشده شود. این هشدار تنها در صورتی کاربرد دارد که از روش نگهبان برای بررسی پایان ورودی استفاده شود. اگر از پیکربندی \fBre2c:sentinel\fP استفاده شود، این هشدار به خطا تبدیل می‌شود. .TP .B \fB\-Wundefined\-syntax\-config\fP اگر فایل نحو مشخص‌شده با گزینهٔ \fB\-\-syntax\fP فاقد تعاریف برخی از پیکربندی‌ها باشد، هشدار می‌دهد. این امر به نگهداری فایل‌های نحو تعریف‌شده توسط کاربر کمک می‌کند: اگر انتشار جدیدی پیکربندی‌هایی را اضافه کند، فایل نحو قدیمی هشداری صادر کرده و کاربر مطلع خواهد شد. اگر برخی از پیکربندی‌ها استفاده نمی‌شوند و نیازی به تعریف ندارند، باید صراحتاً روی \fB\fP تنظیم شوند. .UNINDENT .SS "فایل‌های نحو (Syntax files)" .sp پشتیبانی از زبان‌های مختلف در re2c بر پایهٔ ایدهٔ \fIفایل‌های نحو\fP استوار است. یک فایل نحو، فایلی پیکربندی است که نحو زبان مقصد را تعریف می‌کند \-\- نه کل زبان، بلکه بخش کوچکی از آن را که توسط کد تولیدشده استفاده می‌شود. فایل‌های نحو re2c را بسیار انعطاف‌پذیر می‌کنند، اما نباید به‌عنوان جایگزینی برای پیکربندی‌های \fBre2c:\fP استفاده شوند: هدف آن‌ها تعریف نحو زبان مقصد است، نه سفارشی‌سازی یک تحلیل‌گر لغوی خاص. تمام زبان‌های پشتیبانی‌شده دارای فایل‌های نحو پیش‌فرضی هستند که بخشی از توزیع به شمار می‌روند (زیرشاخهٔ \fBinclude/syntax\fP را ببینید)؛ آن‌ها همچنین در فایل باینری re2js تعبیه شده‌اند. کاربران می‌توانند یک فایل نحو سفارشی ارائه دهند که چند پیکربندی را برای یکی از زبان‌های پشتیبانی‌شده بازنویسی می‌کند، یا می‌توانند همهٔ پیکربندی‌ها را مجدداً تعریف نمایند (در آن صورت باید از گزینهٔ \fB\-\-lang none\fP استفاده شود). فایل‌های نحو شامل چهار نوع پیکربندی مختلف هستند: فهرست ویژگی‌ها، پیکربندی‌های زبان، پیکربندی‌های درجا و الگوهای کد. .sp \fBفهرست‌های ویژگی (Feature lists)\fP .INDENT 0.0 .INDENT 3.5 چند پیکربندی فهرستی، ویژگی‌های مختلف پشتیبانی‌شده توسط یک پیشانه (backend) مفروض را تعریف می‌کنند، تا در صورت تلاش کاربر برای فعال‌سازی ویژگی پشتیبانی‌نشده، re2js بتواند خطایی واضح صادر کند: .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 چند پیکربندی بولی ویژگی‌های زبان مقصد را توصیف می‌کنند که بر تجزیه‌کننده و تولیدکنندهٔ کد re2js تأثیر می‌گذارند: .INDENT 0.0 .TP .B \fBsemicolons\fP غیرصفر در صورتی که زبان پس از دستورها از نقطه‌ویرگول (semicolon) استفاده کند. .TP .B \fBbacktick_quoted_strings\fP غیرصفر در صورتی که زبان دارای رشته‌های درون بک‌تیک (backtick) باشد. .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 الگوهای کد، نحو زبان مقصد را تعریف می‌کنند. آن‌ها در یک زبان ویژه‌دامنهٔ ساده با دستور زبان رسمی زیر نوشته می‌شوند: .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 است. متغیرها جای‌نگه‌دارهایی هستند که در طول مرحلهٔ تولید کد جایگزین می‌شوند. متغیرهای فهرستی خاص هستند: هنگام بسط الگوهای فهرستی، re2js عبارت‌های سمت راست دونقطه را چند بار تکرار می‌کند و هر بار رخدادهای متغیر فهرستی را با مقداری مختص به آن تکرار جایگزین می‌نماید. فهرست‌ها دارای کران‌های اختیاری هستند (مقادیر منفی از انتها شمرده می‌شوند، برای نمونه \fB\-1\fP به معنای آخرین عنصر است). نام‌های شرطی با یک نقطه شروع می‌شوند. هم شرط‌ها و هم متغیرها می‌توانند محلی (مختص به الگوی کد مفروض) یا سراسری (مجاز در تمام الگوهای کد) باشند. هنگامی که re2js فایل نحو را می‌خواند، بررسی می‌کند که هر الگوی کد فقط از متغیرها و شرط‌هایی استفاده کند که در آن مجاز هستند. .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 در ادامه فهرستی از تمام الگوهای کد پشتیبانی‌شده توسط re2js به همراه متغیرها و شرط‌های محلی آن‌ها آمده است. توجه داشته باشید که یک تعریف خاص ممکن است از متغیرها و شرط‌های محلی استفاده کند، اما الزامی به آن ندارد. هر الگوی کد استفاده‌نشده باید روی \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 نوع عدد صحیح علامت‌دار (signed). .TP .B \fBcode:type_uint\fP نوع عدد صحیح بدون علامت (unsigned). .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 عملگر «مساوی» (\(dqequals\(dq). .TP .B \fBcode:cmp_ne\fP عملگر «نامساوی» (\(dqnot equals\(dq). .TP .B \fBcode:cmp_lt\fP عملگر «کوچک‌تر از» (\(dqless than\(dq). .TP .B \fBcode:cmp_gt\fP عملگر «بزرگ‌تر از» (\(dqgreater than\(dq). .TP .B \fBcode:cmp_le\fP عملگر «کوچک‌تر یا مساوی» (\(dqless or equal\(dq). .TP .B \fBcode:cmp_ge\fP عملگر «بزرگ‌تر یا مساوی» (\(dqgreater or equal\(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 محاسباتی (computed). متغیرهای پشتیبانی‌شده: \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 (نسخه re2js که برای تولید این فایل استفاده شده است) و \fBdate\fP (تاریخ تولید). .TP .B \fBcode:line_info\fP قالب دستورات خط (line directives) (اگر این مقدار روی \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 در اینجا فهرستی از تمام متغیرهای سراسری مجاز در فایل‌های نحو (syntax files) آمده است: .INDENT 0.0 .TP .B \fBnl\fP یک خط جدید. .TP .B \fBindent\fP متغیری که هیچ کدی تولید نمی‌کند، اما اثر جانبی افزایش سطح تورفتگی را به همراه دارد..TP .B \fBdedent\fP متغیری که هیچ کدی تولید نمی‌کند، اما دارای اثر جانبیِ کاهش سطح تورفتگی است. .TP .B \fBtopindent\fP رشتهٔ تورفتگی برای گزارهٔ فعلی. سطح تورفتگی توسط مولد کد ردیابی شده و به‌طور خودکار به‌روزرسانی می‌شود. .UNINDENT .sp در اینجا فهرستی از تمام شرط‌های سراسری مجاز در فایل‌های نحو آمده است: .INDENT 0.0 .TP .B \fB\&.api.simple\fP درست (True) است اگر از 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 درست است اگر حلقه‌های تولیدشده توسط re2js باید دارای برچسب باشند (\fBre2c:label:yyloop\fP روی یک رشتهٔ غیرخالی تنظیم شده باشد). .TP .B \fB\&.monadic\fP درست است اگر کد تولیدشده باید مونادیک (monadic) باشد (\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 درست است اگر re2js برای تولید کد سریع‌تر باید از بلوک‌های \(dqunsafe\(dq استفاده کند (\fB\-\-unsafe\fP، \fBre2c:unsafe = 1\fP). این مورد فقط برای زبان‌هایی که دارای قابلیت \(dqunsafe\(dq هستند مرتبط است. .TP .B \fB\&.version\fP درست است اگر اثرانگشت تولیدشده باید حاوی نسخهٔ re2js باشد. .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 متوقف می‌کنند: به وضعیتی بدون هیچ انتقال خروجی می‌رسد، و فرایند تطبیق به‌طور خودکار متوقف می‌شود. شرط سوم، یعنی پایان ورودی، متفاوت است: ممکن است در هر وضعیتی رخ دهد و تحلیل‌گر باید بتواند آن را مدیریت کند. بررسی پایان ورودی، گردش کار عادی تحلیل‌گر را متوقف کرده و شاخه‌های شرطی را به برنامهٔ تولیدشده اضافه می‌کند، بنابراین به حداقل رساندن تعداد چنین بررسی‌هایی ضروری است. re2js از چندین روش مختلف برای مدیریت پایان ورودی پشتیبانی می‌کند. استفاده از هر یک از آن‌ها به پیچیدگی عبارات باقاعده، نیاز به بافرسازی، ملاحظات کارایی و سایر عوامل بستگی دارد. در ادامه فهرستی از این روش‌ها آورده شده است: .INDENT 0.0 .IP \(bu 2 \fBSentinel (نویسهٔ نگهبان).\fP این روش نیاز به بررسی‌های پایان ورودی را به‌کلی برطرف می‌کند. این روش ساده و کارآمد است، اما محدود به مواردی است که یک نویسهٔ \(dqنگهبان\(dq طبیعی وجود داشته باشد که هرگز نتواند در ورودی معتبر رخ دهد. این نویسه ممکن است همچنان در ورودی نامعتبر رخ دهد، اما نباید توسط عبارات باقاعده مجاز دانسته شود، مگر شاید به عنوان آخرین نویسهٔ یک قاعده. نویسهٔ نگهبان به انتهای ورودی ضمیمه می‌شود و به عنوان سیگنال توقف عمل می‌کند: هنگامی که تحلیل‌گر این نویسه را بخواند، یا خطای نحوی رخ داده یا پایان ورودی است. در هر دو حالت تحلیل‌گر باید متوقف شود. این روش در صورتی استفاده می‌شود که \fBYYFILL\fP با \fBre2c:yyfill:enable = 0;\fP غیرفعال شده باشد و \fBre2c:eof\fP مقدار پیش‌فرض \fB\-1\fP را داشته باشد. .nf .fi .sp .IP \(bu 2 \fBSentinel همراه با بررسی‌های مرز (Sentinel with bounds checks).\fP این روش عمومی (generic) است: امکان مدیریت هر ورودی را بدون محدودیت روی عبارات باقاعده فراهم می‌کند. ایده این است که تعداد بررسی‌های پایان ورودی با انجام آن‌ها تنها روی نویسه‌هایی خاص کاهش یابد. مشابه روش \(dqنگهبان\(dq، یکی از نویسه‌ها به عنوان \(dqنگهبان\(dq انتخاب شده و به انتهای ورودی اضافه می‌شود. با این حال، هیچ محدودیتی در مورد محل وقوع نگهبان وجود ندارد (در واقع هر نویسه‌ای می‌تواند به عنوان نگهبان انتخاب شود). هنگامی که تحلیل‌گر این نویسه را بخواند، علاوه بر این یک بررسی مرز (bounds check) نیز انجام می‌دهد. اگر موقعیت فعلی در محدوده باشد، تحلیل‌گر تطبیق را از سر می‌گیرد و با نگهبان مانند یک نویسهٔ معمولی رفتار می‌کند. در غیر این صورت \fBYYFILL\fP را فراخوانی می‌کند (مگر اینکه غیرفعال شده باشد). اگر ورودی بیشتری ارائه شود، تحلیل‌گر نویسهٔ آخر را دوباره مطابقت می‌دهد و طوری ادامه می‌دهد که انگار نگهبان در آنجا نبوده است. در غیر این صورت، ورودی واقعاً به پایان رسیده است و تحلیل‌گر متوقف می‌شود. این روش زمانی استفاده می‌شود که \fBre2c:eof\fP مقدار غیرمنفی داشته باشد (باید روی مقدار عددی نگهبان تنظیم شود). \fBYYFILL\fP اختیاری است. .nf .fi .sp .IP \(bu 2 \fBبررسی‌های مرز با لایه‌گذاری (Bounds checks with padding).\fP این روش عمومی است و ممکن است سریع‌تر از روش \(dqSentinel همراه با بررسی‌های مرز\(dq باشد، اما پیچیده‌تر نیز هست. ایده این است که وضعیت‌های DFA به مؤلفه‌های قویاً همبند (SCCها) افراز شوند و برای هر SCC یک بررسی منفرد برای تعداد نویسهٔ کافی جهت پوشش دادن طولانی‌ترین مسیر بدون حلقه در آن SCC تولید شود. این کار تعداد بررسی‌ها را کاهش می‌دهد، اما برای نشانه‌های (lexemes) کوتاه در انتهای ورودی مشکلی ایجاد می‌کند، زیرا بررسی به تعداد نویسهٔ کافی برای پوشش طولانی‌ترین نشانه نیاز دارد. این مشکل را می‌توان با لایه‌گذاری (padding) ورودی با چند نویسهٔ ساختگی که پسوند معتبری برای هیچ نشانه‌ای تشکیل نمی‌دهند (به طوری که تحلیل‌گر نتواند با آن‌ها تطبیق یابد) برطرف کرد. طول لایه‌گذاری باید \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) اجازه می‌دهد عملیات پایه‌ای مانند خواندن یک نویسه بازنویسی شوند، که این امر گنجاندن بررسی‌های پایان ورودی را به عنوان بخشی از این عملیات ممکن می‌سازد. این رویکرد مستعد خطا بوده و باید با احتیاط استفاده شود. برای استفاده از یک روش سفارشی، 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 // re2js $INPUT \-o $OUTPUT // expects a null\-terminated string function lex(yyinput) { let yycursor = 0; let count = 0 loop: while (true) { /*!re2c re2c:yyfill:enable = 0; * { return \-1 } [\ex00] { return count } [ ]+ { continue loop } [a\-z]+ { count += 1; continue loop } */ } } function test(s, n) { if (lex(s) != n) throw \(dqerror!\(dq; } test(\(dq\e0\(dq, 0) test(\(dqone two three\e0\(dq, 3) test(\(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 // re2js $INPUT \-o $OUTPUT // expects a null\-terminated string function lex(yyinput) { let yycursor = 0; let yylimit = yyinput.length \- 1 // terminating null not included let count = 0 loop: while (true) { /*!re2c re2c:yyfill:enable = 0; re2c:eof = 0; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; * { return \-1 } $ { return count } [ ]+ { continue loop } str { count += 1; continue loop } */ } } function test(s, n) { if (lex(s) != n) throw \(dqerror!\(dq; } test(\(dq\e0\(dq, 0) test(\(dq\(aqqu\e0tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \e0\(dq, 3) test(\(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 برای لایه‌گذاری الزامی نیست \-\-\- هر نویسه‌ای تا زمانی که پسوندی برای یک واحد واژگانی معتبر نسازد می‌تواند استفاده شود (در این مثال لایه‌گذاری نباید شامل تک‌نقل‌قول باشد، زیرا ممکن است با پسوند یک رشتهٔ محصور در تک‌نقل‌قول اشتباه گرفته شود). یک قاعدهٔ \(dqstop\(dq وجود دارد که با نخستین نویسهٔ لایه‌گذاری (null) تطبیق می‌یابد و تحلیل‌گر لغوی را خاتمه می‌دهد (توجه داشته باشید که این قاعده بررسی می‌کند آیا null در ابتدای لایه‌گذاری است یا خیر، در غیر این صورت یک خطای نحوی است). بررسی‌های مرز تنها در برخی وضعیت‌ها تولید می‌شوند که توسط مؤلفه‌های قویاً همبند در اتوماتون زیربنایی تعیین می‌گردند. بررسی‌ها به صورت \fB(YYLIMIT \- YYCURSOR) < n\fP یا با API عمومی به شکل \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 // re2js $INPUT \-o $OUTPUT /*!max:re2c*/ function lex(yyinput) { let yycursor = 0; let yylimit = yyinput.length let count = 0 loop: while (true) { /*!re2c re2c:YYFILL = \(dqreturn \-1\(dq; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; [\ex00] { // check that it is the sentinel, not some unexpected null return (yycursor == yylimit \- YYMAXFILL + 1) ? count : \-1 } str { count += 1; continue loop } [ ]+ { continue loop } * { return \-1 } */ } } function test(s, n) { let padded_s = s + \(dq\e0\(dq.repeat(YYMAXFILL) if (lex(padded_s) != n) throw \(dqerror!\(dq } test(\(dq\(dq, 0) test(\(dq\(aqunterminated\e\e\(aq\(dq, \-1) test(\(dq\(aqqu\e0tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \(dq, 3) test(\(dq\(aqunexpected \e0 null\(dq, \-1) .ft P .fi .UNINDENT .UNINDENT.SS "بررسی‌های سفارشی (Custom checks)" .sp این مثال از یک روش سفارشی مدیریت پایان ورودی بر پایه generic API استفاده می‌کند. این برنامه رشته‌های محصور در نقل‌قول تکی را که با فاصله جدا شده‌اند، می‌شمارد. این برنامه مشابه با مثال \fI\%sentinel\fP است، با این تفاوت که ورودی به نویسه تهی ختم نمی‌شود (null\-terminated نیست). برای جبران نبود نویسه sentinel در پایان ورودی، \fBYYPEEK\fP بازتعریف شده است تا پیش از خواندن نویسه بعدی ورودی، یک بررسی محدوده انجام دهد. این روش ناکارآمد است زیرا بررسی‌ها با بسامد بسیار بالایی انجام می‌شوند. اگر شرط بررسی برقرار نباشد، \fBYYPEEK\fP نویسه واقعی را برمی‌گرداند؛ در غیر این صورت، یک نویسه sentinel جعلی بازمی‌گرداند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $INPUT \-o $OUTPUT // expects a string without terminating null function lex(str) { let cur = 0; let lim = str.length let count = 0 loop: while (true) { /*!re2c re2c:api = generic; re2c:YYPEEK = \(dqcur < lim ? str.charCodeAt(cur) : 0\(dq; re2c:YYSKIP = \(dqcur += 1\(dq; re2c:yyfill:enable = 0; * { return \-1 } [\ex00] { return count } [ ]+ { continue loop } [a\-z]+ { count += 1; continue loop } */ } } function test(s, n) { if (lex(s) != n) throw \(dqerror!\(dq; } test(\(dq\(dq, 0) test(\(dqone two three\(dq, 3) test(\(dqf0ur\(dq, \-1) .ft P .fi .UNINDENT .UNINDENT .SH "پر کردن مجدد بافر (BUFFER REFILLING)" .sp نیاز به بافرینگ زمانی رخ می‌دهد که نتوان کل ورودی را به‌طور هم‌زمان در حافظه نگاشت کرد: یا ورودی بیش از حد بزرگ است، یا به صورت جریانی (مانند خواندن از یک سوکت) دریافت می‌شود. روش معمول در چنین مواردی، تخصیص یک بافر حافظه با اندازه ثابت و پردازش ورودی در تکه‌هایی (chunks) است که در بافر جا می‌شوند. هنگامی که تکه فعلی پردازش شد، به بیرون منتقل شده و داده‌های جدید به بافر وارد می‌شوند. در عمل این فرآیند تا حدی پیچیده‌تر است، زیرا وضعیت تحلیل‌گر لغوی (lexer) تنها از یک موقعیت ورودی تشکیل نشده، بلکه مجموعه‌ای از موقعیت‌های مرتبط با یکدیگر است: .INDENT 0.0 .IP \(bu 2 cursor: نویسه بعدی ورودی برای خواندن (\fBYYCURSOR\fP در C pointer API یا \fBYYSKIP\fP/\fBYYPEEK\fP در generic API) .IP \(bu 2 limit: موقعیت بعد از آخرین نویسه ورودی موجود (\fBYYLIMIT\fP در C pointer API، که به‌طور ضمنی توسط \fBYYLESSTHAN\fP در generic API مدیریت می‌شود) .IP \(bu 2 marker: موقعیت تازه‌ترین تطابق، در صورت وجود (\fBYYMARKER\fP در default API یا \fBYYBACKUP\fP/\fBYYRESTORE\fP در generic API) .IP \(bu 2 token: ابتدای جزء واژگانی (lexeme) فعلی (به‌طور ضمنی در re2js API، زیرا برای عملکرد عادی تحلیل‌گر لغوی نیازی به آن نیست و می‌تواند توسط کاربر تعریف و به‌روزرسانی شود) .IP \(bu 2 context marker: موقعیت زمینه دنباله‌دار (\fBYYCTXMARKER\fP در C pointer API یا \fBYYBACKUPCTX\fP/\fBYYRESTORECTX\fP در generic API) .IP \(bu 2 متغیرهای برچسب (tag variables): موقعیت‌های زیرتطابق (تعریف‌شده با بلوک‌های \fBstags\fP و \fBmtags\fP و سازوکارهای اولیه generic API شامل \fBYYSTAGP\fP/\fBYYSTAGN\fP/\fBYYMTAGP\fP/\fBYYMTAGN\fP) .UNINDENT .sp تمام این موارد در هر حالتی استفاده نمی‌شوند، اما در صورت استفاده، باید توسط \fBYYFILL\fP\& به‌روزرسانی شوند. تمام موقعیت‌های فعال در بازه میان token و cursor قرار دارند، بنابراین هر آنچه میان آغاز بافر و token قرار دارد را می‌توان دور ریخت، بخش میان token تا limit باید به ابتدای بافر منتقل شود، و فضای خالی انتهای بافر باید با داده‌های جدید پر گردد. به منظور جلوگیری از فراخوانی‌های مکرر \fBYYFILL\fP\&، بهتر است تا حد امکان نویسه‌های ورودی بیشتری پر شوند (حتی اگر نویسه‌های کمتری برای از سرگیری کار تحلیل‌گر لغوی کافی باشد). جزئیات پیاده‌سازی \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 در C pointer API و \fBYYLESSTHAN()\fP در generic API فعال می‌شود. مقدار بازگشتی غیرصفر به این معنی است که \fBYYFILL\fP با شکست مواجه شده است. یک فراخوانی موفق \fBYYFILL\fP باید حداقل یک نویسه را فراهم کند و موقعیت‌های ورودی را بر همین اساس تنظیم نماید. limit همیشه باید بر روی یک موقعیت پس از آخرین موقعیت ورودی در بافر تنظیم شود، و نویسه موجود در موقعیت limit باید نماد نشانگر (sentinel) مشخص‌شده توسط پیکربندی \fBre2c:eof\fP باشد. تصاویر زیر مکان‌های نسبی موقعیت‌های ورودی در بافر را قبل و بعد از فراخوانی \fBYYFILL\fP نشان می‌دهند (نماد sentinel با \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 // re2js $INPUT \-o $OUTPUT const fs = require(\(aqfs\(aq) const BUFSIZE = 4096 const OK = 0 const EOF = 1 const LONG_LEXEME = 2 function fill(st) { if (st.eof) return EOF // Error: lexeme too long. In real life could reallocate a larger buffer. if (st.token < 1) return LONG_LEXEME // Shift buffer contents (discard everything up to the current token). st.yyinput.copy(st.yyinput, 0, st.token, st.yylimit) st.yycursor \-= st.token; st.yymarker \-= st.token; st.yylimit \-= st.token; st.token = 0; // Read a new chunk of data from file and append it to \(gayyinput\(ga. let want = BUFSIZE \- st.yylimit \- 1 // \-1 for sentinel let nread = fs.readSync(st.file, st.yyinput, st.yylimit, want) st.eof = nread < want // end of file? st.yylimit += nread st.yyinput.writeUInt8(0, st.yylimit) // sentinel return OK } function lex(yyrecord, count) { loop: while (true) { yyrecord.token = yyrecord.yycursor /*!re2c re2c:api = record; re2c:YYPEEK = \(dqreadUInt8\(dq; re2c:YYFILL = \(dqfill(yyrecord) == OK\(dq; re2c:eof = 0; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; * { return \-1 } $ { return count } [ ]+ { continue loop } str { count += 1; continue loop } */ } } function main() { let fname = \(dqinput\(dq // Create input file. let content = \(dq\(aqqu\e0tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \(dq.repeat(BUFSIZE) fs.writeFileSync(fname, content, function(err) { if (err) throw err; }) // Init lexer state. let limit = BUFSIZE \- 1 // exclude terminating null let st = { file: fs.openSync(fname, \(aqr\(aq), yyinput: Buffer.alloc(BUFSIZE), yylimit: limit, yycursor: limit, yymarker: limit, token: limit, eof: false } // Run lexer on the prepared file. if (lex(st, 0) != 3 * BUFSIZE) { throw \(dqerror :[\(dq } // Cleanup. fs.unlink(fname, function(err){ if (err) throw err; }) } main() .ft P .fi .UNINDENT .UNINDENT.SS YYFILL با لایه‌گذاری (padding) .sp در حالت پیش‌فرض (زمانی که از قاعده EOF استفاده نمی‌شود)، \fBYYFILL\fP یک سازوکار پایه‌ایِ تابع‌مانند است که یک تک‌آرگومان می‌پذیرد و هیچ مقداری را بازنمی‌گرداند. فراخوانی \fBYYFILL\fP با شرط \fB(YYLIMIT \- YYCURSOR) < n\fP در C pointer API و با \fBYYLESSTHAN(n)\fP در generic API فعال می‌شود. آرگومان ارسالی به \fBYYFILL\fP، کمینه تعداد نویسه‌هایی است که باید تأمین شوند. اگر در انجام این کار ناموفق باشد، \fBYYFILL\fP نباید کنترل را به لکسر (lexer) بازگرداند (به همین دلیل، بهتر است به صورت ماکرویی پیاده‌سازی شود که هنگام شکست، از تابع فراخواننده بازگردد). در صورت فراخوانی موفقیت‌آمیز \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 را در قطعه‌های 4096 بایتی می‌خواند و از بررسی محدوده‌ها (bounds\-checking) همراه با لایه‌گذاری استفاده می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $INPUT \-o $OUTPUT const fs = require(\(aqfs\(aq) const BUFSIZE = 4096 const OK = 0 const EOF = 1 const LONG_LEXEME = 2 /*!max:re2c*/ function fill(st, need) { if (st.eof) return EOF // Error: lexeme too long. In real life could reallocate a larger buffer. if (st.token < need) return LONG_LEXEME // Shift buffer contents (discard everything up to the current token). st.yyinput.copy(st.yyinput, 0, st.token, st.yylimit) st.yycursor \-= st.token; st.yylimit \-= st.token; st.token = 0; // Read a new chunk of data from file and append it to \(gayyinput\(ga. let want = BUFSIZE \- st.yylimit \- 1 // \-1 for sentinel let nread = fs.readSync(st.file, st.yyinput, st.yylimit, want) st.yylimit += nread if (nread < want) { st.eof = true // end of file st.yyinput.write(\(dq\e0\(dq.repeat(YYMAXFILL), st.yylimit) st.yylimit += YYMAXFILL } return OK } function lex(yyrecord, count) { loop: while (true) { yyrecord.token = yyrecord.yycursor /*!re2c re2c:api = record; re2c:YYPEEK = \(dqreadUInt8\(dq; re2c:YYFILL = \(dqif (fill(yyrecord, @@) != OK) return \-1;\(dq; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; [\ex00] { // Check that it is the sentinel, not some unexpected null. return yyrecord.token == yyrecord.yylimit \- YYMAXFILL ? count : \-1 } str { count += 1; continue loop } [ ]+ { continue loop } * { return \-1 } */ } } function main() { let fname = \(dqinput\(dq // Create input file. let content = \(dq\(aqqu\e0tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \(dq.repeat(BUFSIZE) fs.writeFileSync(fname, content, function(err) { if (err) throw err; }) // Init lexer state. let limit = BUFSIZE \- 1 // exclude terminating null let st = { file: fs.openSync(fname, \(aqr\(aq), yyinput: Buffer.alloc(BUFSIZE), yylimit: limit, yycursor: limit, token: limit, eof: false } // Run lexer on the prepared file. if (lex(st, 0) != 3 * BUFSIZE) { throw \(dqerror :[\(dq } // Cleanup. fs.unlink(fname, function(err){ if (err) throw err; }) } main() .ft P .fi .UNINDENT .UNINDENT.SH "ویژگی‌ها (FEATURES)" .SS "بلوک‌های چندگانه (Multiple blocks)" .sp گاهی اوقات داشتن چندین تحلیل‌گر لغوی (lexer) مرتبط با یکدیگر ضروری است (برای نمونه، هنگامی که یک ماشین حالت سطح بالا وجود دارد که بین حالت‌های مختلف تحلیل‌گر جابه‌جا می‌شود). این قابلیت را می‌توان با استفاده از چندین بلوک متصل re2js پیاده‌سازی کرد. گزینه دیگر استفاده از \fI\%start conditions\fP\& است. .sp پیاده‌سازی اتصالات بین بلوک‌ها به زبان مقصد بستگی دارد. در زبان‌هایی که دارای دستور \fBgoto\fP هستند (مانند C/C++ و Go) می‌توان همه بلوک‌ها را در یک تابع قرار داد، به‌طوری که پیشوند هر یک یک برچسب (label) باشد. گذار از یک بلوک به بلوک دیگر یک \fBgoto\fP ساده است. در زبان‌هایی که فاقد دستور \fBgoto\fP هستند (مانند Rust)، لازم است از یک حلقه به همراه switch روی یک متغیر حالت استفاده شود، مشابه حلقه/switch مربوط به \fByystate\fP که توسط re2js تولید می‌شود؛ در غیر این صورت باید هر بلوک درون یک تابع محصور شده و از فراخوانی توابع استفاده گردد. .sp مثال زیر از چندین بلوک برای تجزیه اعداد دودویی (binary)، هشت‌هشتی (octal)، ده‌دهی (decimal) و شانزده‌شانزدهی (hexadecimal) استفاده می‌کند. هر مبنا بلوک مخصوص به خود را دارد. بلوک اولیه، مبنا را مشخص کرده و کنترل را به سایر بلوک‌ها منتقل می‌کند. پیکربندی‌های مشترک در بلوکی مجزا در ابتدای برنامه تعریف شده‌اند؛ این پیکربندی‌ها توسط سایر بلوک‌ها به ارث برده می‌شوند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $INPUT \-o $OUTPUT /*!re2c // Common re2c definitions shared between all functions. re2c:api = record; re2c:yyrecord = st; re2c:yyfill:enable = 0; */ function parse_u32(str) { let st = { yyinput: str, yycursor: 0, yymarker: 0 } /*!re2c \(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 null } */ } function parse_bin(st) { n = 0 loop: while (true) { /*!re2c [01] { n = n * 2 + (st.yyinput.charCodeAt(st.yycursor \- 1) \- 48); continue loop } * { return n } */ } } function parse_oct(st) { n = 0 loop: while (true) { /*!re2c [0\-7] { n = n * 8 + (st.yyinput.charCodeAt(st.yycursor \- 1) \- 48); continue loop } * { return n } */ } } function parse_dec(st) { n = 0 loop: while (true) { /*!re2c [0\-9] { n = n * 10 + (st.yyinput.charCodeAt(st.yycursor \- 1) \- 48); continue loop } * { return n } */ } } function parse_hex(st) { n = 0 loop: while (true) { /*!re2c [0\-9] { n = n * 16 + (st.yyinput.charCodeAt(st.yycursor \- 1) \- 48); continue loop } [a\-f] { n = n * 16 + (st.yyinput.charCodeAt(st.yycursor \- 1) \- 87); continue loop } [A\-F] { n = n * 16 + (st.yyinput.charCodeAt(st.yycursor \- 1) \- 55); continue loop } * { return n } */ } } function test(s, n) { if (parse_u32(s) != n) throw \(dqerror!\(dq } test(\(dq\e0\(dq, null) test(\(dq1234567890\e0\(dq, 1234567890) test(\(dq0b1101\e0\(dq, 13) test(\(dq0x7Fe\e0\(dq, 2046) test(\(dq0644\e0\(dq, 420) test(\(dq9999999999\e0\(dq, 9999999999) .ft P .fi .UNINDENT .UNINDENT .SS "شرایط شروع (Start conditions)" .sp شرایط شروع با گزینه \fB\-\-start\-conditions\fP فعال می‌شوند. آن‌ها روشی برای کدگذاری چندین خودکاره (automata) مرتبط با یکدیگر در یک بلوک یکسان re2js فراهم می‌کنند. .sp هر شرط متناظر با یک خودکاره منفرد است و دارای نامی یکتا است که توسط کاربر مشخص می‌شود، و همچنین شماره‌ای داخلی و یکتا که توسط re2js تعریف می‌گردد. این شماره‌ها برای جابه‌جایی میان شرایط استفاده می‌شوند: کد تولیدشده از توابع اولیه \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 کدی که re2js برای شرایط تولید می‌کند، بستگی به این دارد که آیا re2js از رویکرد goto/label استفاده می‌کند یا رویکرد loop/switch را برای کدگذاری خودکاره به کار می‌برد. .sp در زبان‌هایی که دارای دستور \fBgoto\fP هستند (مانند C/C++ و Go) شرایط به‌طور طبیعی به‌صورت بلوک‌هایی از کد با پیشوند برچسب‌هایی به شکل \fByyc_\fP پیاده‌سازی می‌شوند، که در آن \fBcond\fP نام شرط است (پیشوند برچسب را می‌توان با \fBre2c:cond:prefix\fP تغییر داد). گذار بین شرایط با استفاده از \fBgoto\fP و برچسب‌های شرایط پیاده‌سازی می‌شود. پیش از همه شرایط، re2js یک switch اولیه روی \fBYYGETSTATE\fP تولید می‌کند که به وضعیت شروع شرط فعلی پرش می‌کند. قواعد میان‌بر \fB:=>\fP از switch اولیه صرف‌نظر کرده و مستقیماً به شرط مشخص‌شده پرش می‌کنند (می‌توان از \fBre2c:cond:goto\fP برای تغییر رفتار پیش‌فرض استفاده کرد). قواعد دارای اعمال معنایی به‌طور خودکار به شرط بعدی پرش نمی‌کنند؛ این کار باید توسط کد عملیاتی تعریف‌شده توسط کاربر انجام شود. .sp در زبان‌هایی که فاقد \fBgoto\fP هستند (مانند Rust)، re2js از متغیر \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 // re2js $INPUT \-o $OUTPUT \-c /*!conditions:re2c*/ function parse_u32(yyinput) { let yycursor = 0 let yycond = YYC_INIT let n = 0 loop: while (true) { /*!re2c 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 null } [01] { n = n * 2 + (yyinput.charCodeAt(yycursor \- 1) \- 48); continue loop } [0\-7] { n = n * 8 + (yyinput.charCodeAt(yycursor \- 1) \- 48); continue loop } [0\-9] { n = n * 10 + (yyinput.charCodeAt(yycursor \- 1) \- 48); continue loop } [0\-9] { n = n * 16 + (yyinput.charCodeAt(yycursor \- 1) \- 48); continue loop } [a\-f] { n = n * 16 + (yyinput.charCodeAt(yycursor \- 1) \- 87); continue loop } [A\-F] { n = n * 16 + (yyinput.charCodeAt(yycursor \- 1) \- 55); continue loop } * { return n } */ } } function test(s, n) { if (parse_u32(s) != n) throw \(dqerror!\(dq } test(\(dq\e0\(dq, null) test(\(dq1234567890\e0\(dq, 1234567890) test(\(dq0b1101\e0\(dq, 13) test(\(dq0x7Fe\e0\(dq, 2046) test(\(dq0644\e0\(dq, 420) test(\(dq9999999999\e0\(dq, 9999999999) .ft P .fi .UNINDENT .UNINDENT.SS وضعیت قابل ذخیره‌سازی (Storable state) .sp با گزینهٔ \fB\-\-storable\-state\fP، ابزار re2js یک لکسر تولید می‌کند که می‌تواند وضعیت فعلی خود را ذخیره کرده، به فراخواننده بازگردد، و بعداً عملیات را دقیقاً از همان جایی که متوقف شده بود از سر بگیرد. حالت پیش‌فرض عملیات در re2js یک مدل \(dqpull\(dq است که در آن لکسر هر زمان نیاز داشته باشد، ورودی بیشتری را «می‌کشد» (دریافت می‌کند). این امر ممکن است در مواردی که ورودی به صورت تکه‌تکه در دسترس قرار می‌گیرد غیرقابل‌قبول باشد (برای مثال، اگر لکسر توسط یک تجزیه‌کننده (parser) فراخوانی شود، یا اگر برنامهٔ لکسر از طریق یک پروتکل سوکت با برنامهٔ دیگری ارتباط برقرار کند که باید پیش از ارسال پیام بعدی، منتظر پاسخ از سوی لکسر بماند). قابلیت وضعیت قابل ذخیره‌سازی دقیقاً برای چنین مواردی در نظر گرفته شده است: این ویژگی امکان تولید لکسرهایی را فراهم می‌کند که در یک مدل \(dqpush\(dq کار می‌کنند. هنگامی که لکسر به ورودی بیشتری نیاز دارد، وضعیت خود را ذخیره کرده و به فراخواننده بازمی‌گردد. بعداً، زمانی که ورودی بیشتری در دسترس قرار گیرد، فراخواننده لکسر را دقیقاً از همان‌جایی که متوقف شده بود از سر می‌گیرد. در مقایسه با مدل \(dqpull\(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 در اینجا نمونه‌ای از یک لکسر با مدل \(dqpush\(dq آورده شده است که خواندن بسته‌ها از یک سوکت را شبیه‌سازی می‌کند. لکسر تا رسیدن به پایان ورودی در یک حلقه اجرا می‌شود و به تابع فراخواننده بازمی‌گردد. تابع فراخواننده با «ارسال» بستهٔ بعدی، ورودی بیشتری فراهم کرده و تحلیل لغوی را از سر می‌گیرد. این فرایند زمانی که تمام بسته‌ها ارسال شوند یا خطایی رخ دهد، متوقف می‌شود. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $INPUT \-o $OUTPUT \-f const fs = require(\(aqfs\(aq) // Use a small buffer to cover the case when a lexeme doesn\(aqt fit. // In real world use a larger buffer. const BUFSIZE = 10 const DEBUG = false const END = 0 const READY = 1 const WAITING = 2 const BIG_PACKET = 3 const BAD_PACKET = 4 function log() { if (DEBUG) console.log.apply(console, arguments) } function fill(st) { // Error: lexeme too long. In real life could reallocate a larger buffer. if (st.token < 1) return BIG_PACKET // Shift buffer contents (discard everything up to the current token). st.yyinput.copy(st.yyinput, 0, st.token, st.yylimit) st.yycursor \-= st.token; st.yymarker \-= st.token; st.yylimit \-= st.token; st.token = 0; // Read a new chunk of data from file and append it to \(gayyinput\(ga. let want = BUFSIZE \- st.yylimit \- 1 // \-1 for sentinel let nread = fs.readSync(st.file, st.yyinput, st.yylimit, want) st.yylimit += nread st.yyinput.writeUInt8(0, st.yylimit) // sentinel return READY } function lex(yyrecord) { loop: while (true) { yyrecord.token = yyrecord.yycursor /*!re2c re2c:api = record; re2c:YYPEEK = \(dqreadUInt8\(dq; re2c:YYFILL = \(dqreturn WAITING\(dq; re2c:eof = 0; packet = [a\-z]+[;]; * { return BAD_PACKET } $ { return END } packet { yyrecord.received += 1; continue loop } */ } } function test(packets, expect) { // Emulate a \(dqpipe\(dq by opening the same file for reading and writing. let fname = \(dqinput\(dq let fw = fs.openSync(fname, \(aqw\(aq); let fr = fs.openSync(fname, \(aqr\(aq); // Init lexer state. let limit = BUFSIZE \- 1 // exclude terminating null let st = { file: fr, yyinput: Buffer.alloc(BUFSIZE), yylimit: limit, yycursor: limit, yymarker: limit, token: limit, yystate: \-1, received: 0 } // 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. let send = 0 let status loop: while (true) { status = lex(st) if (status == END) { log(\(dqdone: got\(dq, st.received, \(dqpackets\(dq) break loop } else if (status == WAITING) { log(\(dqwaiting...\(dq); if (send < packets.length) { log(\(dqsent packet\(dq, send, packets[send]) fs.writeFileSync(fw, packets[send]) send += 1 } status = fill(st) log(\(dqqueue:\(dq, st.yyinput.toString()) if (status == BIG_PACKET) { log(\(dqerror: packet too big\(dq) break loop } if (status != READY) throw \(dqexpected READY\(dq } else { if (status != BAD_PACKET) throw \(dqexpected BAD_PACKET\(dq log(\(dqerror: ill\-formed packet\(dq) break loop } } // Check results. if (status != expect) throw \(dqunexpected status\(dq if (status == END && st.received != send) \(dqunexpected packet count\(dq // Cleanup. fs.unlinkSync(fname, function(err){ if (err) throw err; }) } function main() { test([], END) test([\(dqzero;\(dq, \(dqone;\(dq, \(dqtwo;\(dq, \(dqthree;\(dq, \(dqfour;\(dq], END) test([\(dqzer0;\(dq], BAD_PACKET) test([\(dqgoooooooooogle;\(dq], BIG_PACKET) } main() .ft P .fi .UNINDENT .UNINDENT.SS بلوک‌های قابل استفادهٔ مجدد .sp بلوک‌های قابل استفادهٔ مجدد با قالب \fB/*!rules:re2c[:] ... */\fP یا \fB%{rules[:] ... %}\fP می‌توانند به هر تعداد بار دوباره استفاده شده و با دیگر بلوک‌های re2js ترکیب شوند. مقدار \fB\fP اختیاری است. یک بلوک rules می‌تواند در یک بلوک یا دستورالعمل \fBuse\fP به‌کار رود. کد مربوط به یک بلوک rules در هر نقطه از استفاده تولید می‌شود. .sp بلوک‌های use با \fB/*!use:re2c[:] ... */\fP یا \fB%{use[:] ... %}\fP\& تعریف می‌شوند. مقدار \fB\fP اختیاری است: اگر مشخص نشده باشد، بلوک rules مرتبط جدیدترین مورد خواهد بود (خواه نام‌دار باشد یا بی‌نام). یک بلوک use می‌تواند تعاریف نام‌دار، پیکربندی‌ها و قواعد ویژهٔ خودش را اضافه کند. یک مورد کاربرد مهم برای بلوک‌های use، تحلیل‌گر لغوی‌ای است که از چندین کدگذاری ورودی پشتیبانی می‌کند: یک بلوک rules یکسان چندین بار با پیکربندی‌های مختص هر کدگذاری استفاده می‌شود (مثال زیر را ببینید). .sp دستورالعمل درون‌بلوکیِ \fB!use:;\fP می‌تواند از داخل یک بلوک re2js استفاده شود. این دستور، بلوک ارجاع‌شدهٔ \fB\fP را در بلوک فعلی ادغام می‌کند. اگر برخی از قوانین و پیکربندی‌های ادغام‌شده با موارد تعریف‌شدهٔ پیشین تداخل داشته باشند، تعارض‌ها به روش معمول حل می‌شوند: نخستین قاعده اولویت دارد و آخرین پیکربندی بر موارد پیشین بازنویسی می‌شود. یک استثنا، قواعد ویژهٔ \fB*\fP، \fB$\fP و (در حالت شرطی) \fB\fP هستند که در آن‌ها تعریف محلی بلوک بر هر تعریف موروثی اولویت دارد. دستورالعمل use امکان ترکیب بلوک‌های مختلف re2js را با یکدیگر در یک بلوک واحد فراهم می‌سازد (مثال زیر را ببینید). .sp بلوک‌های نام‌دار و دستورالعمل use درون‌بلوکی در نگارش 2.2 از re2js اضافه شدند. از آن نسخه به بعد، بلوک‌های قابل استفادهٔ مجدد به‌طور پیش‌فرض مجاز هستند (نیازی به گزینهٔ خاصی نیست). پیش از نسخه 2.2، حالت استفادهٔ مجدد با گزینهٔ \fB\-r \-\-reusable\fP فعال می‌شد. پیش از نسخه 1.2، بلوک‌های قابل استفادهٔ مجدد نمی‌توانستند با بلوک‌های عادی ترکیب شوند. .SS مثالی از دستورالعمل \fB!use\fP .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $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. const COLOR = 1 const FISH = 2 const DUNNO = 3 /*!rules:re2c:colors * { throw \(dqah\(dq } \(dqred\(dq | \(dqsalmon\(dq | \(dqmagenta\(dq { return COLOR } */ /*!rules:re2c:fish * { throw \(dqoh\(dq } \(dqhaddock\(dq | \(dqsalmon\(dq | \(dqeel\(dq { return FISH } */ function lex(yyinput) { let yycursor = 0 /*!re2c re2c:yyfill:enable = 0; !use:fish; !use:colors; * { return DUNNO } // overrides inherited \(aq*\(aq rules */ } function test(s, n) { if (lex(s) != n) throw \(dqerror!\(dq; } test(\(dqsalmon\(dq, FISH) test(\(dqwhat?\(dq, DUNNO) .ft P .fi .UNINDENT .UNINDENT .SS مثالی از یک بلوک \fB/*!use:re2c ... */\fP .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $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 re2c:yyfill:enable = 0; re2c:YYPEEK = \(dqat\(dq; \(dq∀x ∃y\(dq { return yycursor } * { return null } */ function lex_utf8(yyinput) { let yycursor = 0 /*!use:re2c re2c:encoding:utf8 = 1; */ } function lex_utf32(yyinput) { let yycursor = 0 /*!use:re2c re2c:encoding:utf32 = 1; */ } function test(f, s) { if (f(s) != s.length) throw \(dqerror!\(dq } test(lex_utf8, [0xe2, 0x88, 0x80, 0x78, 0x20, 0xe2, 0x88, 0x83, 0x79]) test(lex_utf32, [0x2200, 0x78, 0x20, 0x2203, 0x79]) .ft P .fi .UNINDENT .UNINDENT.SS استخراج زیرتطبیق (Submatch extraction) .sp ابزار re2js دارای دو گزینه برای استخراج زیرتطبیق است. .INDENT 0.0 .TP .B \fBTags\fP گزینهٔ نخست، استفاده از \fItag\fPهای مستقل به فرم \fB@stag\fP یا \fB#mtag\fP است، که در آن \fBstag\fP و \fBmtag\fP نام‌های دلخواه تعریف‌شده توسط کاربر هستند. برچسب‌ها با گزینهٔ \fB\-T \-\-tags\fP یا پیکربندی \fBre2c:tags = 1\fP فعال می‌شوند. از نظر معنایی، برچسب‌ها نشانگرهای موقعیت هستند: آنها می‌توانند در هر کجای یک عبارت باقاعده درج شوند و به موقعیت مربوطه (یا چندین موقعیت) در رشتهٔ ورودی متصل گردند. \fIS\-tag\fPها به آخرین موقعیت منطبق متصل می‌شوند، و \fIm\-tag\fPها به فهرستی از موقعیت‌ها متصل می‌شوند (ممکن است در زیرعبارت‌های تکرار استفاده شوند، جایی که یک موقعیت منفرد در عبارت باقاعده متناظر با چندین موقعیت در رشتهٔ ورودی است). همهٔ برچسب‌ها باید توسط کاربر، یا به‌صورت دستی و یا به کمک بلوک‌های \fBsvars\fP و \fBmvars\fP تعریف شوند. اگر بیش از یک روش برای تطبیق برچسب‌ها با ورودی وجود داشته باشد، ابهام با استفاده از راهبرد ابهام‌زدایی چپ‌ترین حریصانه (leftmost greedy) حل می‌شود. .TP .B \fBCaptures\fP گزینهٔ دوم استفاده از \fIگروه‌های تصاحب\fP (capturing groups) است\&. آنها با گزینهٔ \fB\-\-captures\fP یا پیکربندی \fBre2c:captures = 1\fP فعال می‌شوند. دو نوع برای سیاست‌های مختلف ابهام‌زدایی وجود دارد؛ \fB\-\-leftmost\-captures\fP (پیش‌فرض) برای سیاست چپ‌ترین حریصانه است، و \fB\-\-posix\-captures\fP برای سیاست طولانی‌ترین تطابق POSIX است. در این حالت تمام زیرعبارت‌های درون پرانتز به عنوان گروه‌های تصاحب در نظر گرفته می‌شوند، و می‌توان از علامت تعجب برای مشخص کردن گروه‌های غیرتصاحبی استفاده کرد: \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، ابزار re2js متغیرهای \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) ترجمه می‌شوند\&. ایدهٔ اصلی TDFA به حداقل رساندن بار اضافی (overhead) در استخراج زیرتطبیق است. در حالت نهایی، اگر هیچ برچسب یا تصاحبی در یک عبارت باقاعده وجود نداشته باشد، TDFA صرفاً یک DFA معمولی است. اگر تعداد برچسب‌ها معقول باشد، بار اضافی به سختی قابل توجه است. TDFA تولیدشده از تعدادی \fIمتغیر برچسب\fP استفاده می‌کند که مستقیماً به برچسب‌ها نگاشت نمی‌شوند: یک متغیر منفرد ممکن است برای برچسب‌های مختلف استفاده شود، و یک برچسب ممکن است برای نگهداری همهٔ مقادیر ممکن خود به چندین متغیر نیاز داشته باشد. در نهایت ابهام برطرف می‌شود و تنها یک متغیر نهایی به ازای هر برچسب باقی می‌ماند. متغیرهای برچسب باید با استفاده از بلوک‌های \fBstags\fP یا \fBmtags\fP تعریف شوند. اگر وضعیت تحلیل‌گر لغوی (lexer state) ذخیره می‌شود، متغیرهای برچسب باید بخشی از آن باشند. آنها همچنین باید توسط \fBYYFILL\fP به‌روزرسانی شوند\&. .sp \fIS\-tag\fPها از عملیات‌های زیر پشتیبانی می‌کنند: .INDENT 0.0 .IP \(bu 2 ذخیره موقعیت ورودی در یک s\-tag: دستور \fBt = YYCURSOR\fP با API اشاره‌گر C یا عملیات تعریف‌شده توسط کاربر \fBYYSTAGP(t)\fP با API عمومی .IP \(bu 2 ذخیره مقدار پیش‌فرض در یک s\-tag: دستور \fBt = NULL\fP با API اشاره‌گر C یا عملیات تعریف‌شده توسط کاربر \fBYYSTAGN(t)\fP با API عمومی .IP \(bu 2 کپی کردن یک s\-tag در دیگری: \fBt1 = t2\fP .UNINDENT .sp \fIM\-tag\fPها از عملیات‌های زیر پشتیبانی می‌کنند: .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 \fIS\-tag\fPها می‌توانند به عنوان مقادیر اسکالر (اشاره‌گرها یا آفست‌ها) پیاده‌سازی شوند. \fIM\-tag\fPها به نمایش پیچیده‌تری نیاز دارند، زیرا باید دنباله‌ای از مقادیر برچسب را ذخیره کنند. ساده‌ترین و ناکارآمدترین نمایش یک 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 // re2js $INPUT \-o $OUTPUT const assert = require(\(aqassert\(aq); function parse(yyinput) { let yycursor = 0 // Final tag variables available in semantic action. /*!svars:re2c format = \(dqlet @@\en\(dq; */ // Intermediate tag variables used by the lexer (must be autogenerated). /*!stags:re2c format = \(dqlet @@\en\(dq; */ /*!re2c re2c:yyfill:enable = 0; re2c:tags = 1; num = [0\-9]+; @t1 num @t2 \(dq.\(dq @t3 num @t4 (\(dq.\(dq @t5 num)? [\ex00] { return { major: Number(yyinput.substring(t1, t2)), minor: Number(yyinput.substring(t3, t4)), patch: t5 == \-1 ? 0 : Number(yyinput.substring(t5, yycursor \- 1)) } } * { return null } */ } assert.deepEqual(parse(\(dq23.34\e0\(dq), {major: 23, minor: 34, patch: 0}) assert.deepEqual(parse(\(dq1.2.99999\e0\(dq), {major: 1, minor: 2, patch: 99999}) assert.deepEqual(parse(\(dq1.a\e0\(dq), null) .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 // re2js $INPUT \-o $OUTPUT const assert = require(\(aqassert\(aq); const fs = require(\(aqfs\(aq) const BUFSIZE = 4096 const OK = 0 const EOF = 1 const LONG_LEXEME = 2 function fill(st) { if (st.eof) return EOF // Error: lexeme too long. In real life could reallocate a larger buffer. if (st.token < 1) return LONG_LEXEME // Shift buffer contents (discard everything up to the current token). st.yyinput.copy(st.yyinput, 0, st.token, st.yylimit) st.yycursor \-= st.token; st.yymarker \-= st.token; st.yylimit \-= st.token; /*!stags:re2c format = \(dqif (st.@@ != \-1) st.@@ \-= st.token\en\(dq; */ st.token = 0; // Read a new chunk of data from file and append it to \(gayyinput\(ga. let want = BUFSIZE \- st.yylimit \- 1 // \-1 for sentinel let nread = fs.readSync(st.file, st.yyinput, st.yylimit, want) st.eof = nread < want // end of file? st.yylimit += nread st.yyinput.writeUInt8(0, st.yylimit) // sentinel return OK } function lex(st) { let vers = [] loop: while (true) { st.token = st.yycursor // Final tag variables available in semantic action. /*!svars:re2c format = \(dqlet @@\en\(dq; */ /*!re2c re2c:api = record; re2c:yyrecord = st; re2c:YYPEEK = \(dqreadUInt8\(dq; re2c:YYFILL = \(dqfill(st) == OK\(dq; re2c:eof = 0; re2c:tags = 1; num = [0\-9]+; num @t1 \(dq.\(dq @t2 num @t3 (\(dq.\(dq @t4 num)? [\en] { vers.push({ major: Number(st.yyinput.subarray(st.token, t1)), minor: Number(st.yyinput.subarray(t2, t3)), patch: t4 == \-1 ? 0 : Number(st.yyinput.subarray(t4, st.yycursor \- 1)) }) continue loop } $ { return vers } * { return null } */ } } function main() { let fname = \(dqinput\(dq // Create input file. let content = \(dq1.22.333\en\(dq.repeat(BUFSIZE) fs.writeFileSync(fname, content, function(err) { if (err) throw err; }) // Init lexer state. let limit = BUFSIZE \- 1 // exclude terminating null let st = { file: fs.openSync(fname, \(aqr\(aq), yyinput: Buffer.alloc(BUFSIZE), yylimit: limit, yycursor: limit, yymarker: limit, token: limit, // Intermediate tag variables used by the lexer (must be autogenerated). /*!stags:re2c format = \(dq@@: \-1,\en\(dq; */ eof: false } // Run lexer on the prepared file. assert.deepEqual(lex(st), Array(BUFSIZE).fill({major: 1, minor: 22, patch: 333})) // Cleanup. fs.unlink(fname, function(err){ if (err) throw err; }) } main() .ft P .fi .UNINDENT .UNINDENT .sp در اینجا مثالی از استفاده از گروه‌های تصاحب برای تجزیهٔ نگارش‌های معنایی آورده شده است. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $INPUT \-o $OUTPUT const assert = require(\(aqassert\(aq); function parse(yyinput) { let yycursor = 0 // Final tag variables available in semantic action. /*!svars:re2c format = \(dqlet @@\en\(dq; */ // Intermediate tag variables used by the lexer (must be autogenerated). /*!stags:re2c format = \(dqlet @@\en\(dq; */ /*!re2c re2c:yyfill:enable = 0; re2c:captvars = 1; num = [0\-9]+; (num) \(dq.\(dq (num) (\(dq.\(dq num)? [\ex00] { return { major: Number(yyinput.substring(yytl1, yytr1)), minor: Number(yyinput.substring(yytl2, yytr2)), patch: yytl3 == \-1 ? 0 : Number(yyinput.substring(yytl3 + 1, yytr3)) } } * { return null } */ } assert.deepEqual(parse(\(dq23.34\e0\(dq), {major: 23, minor: 34, patch: 0}) assert.deepEqual(parse(\(dq1.2.99999\e0\(dq), {major: 1, minor: 2, patch: 99999}) assert.deepEqual(parse(\(dq1.a\e0\(dq), null) .ft P .fi .UNINDENT .UNINDENT .sp در اینجا مثالی از استفاده از m\-tagها برای تجزیهٔ یک نگارش با تعداد متغیری از اجزاء آمده است. متغیرهای برچسب در یک ترای (trie) ذخیره می‌شوند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $INPUT \-o $OUTPUT const assert = require(\(aqassert\(aq) function parse(yyinput) { let yycursor = 0 // Final tag variables available in semantic action. /*!svars:re2c format = \(dqlet @@\en\(dq; */ /*!mvars:re2c format = \(dqlet @@\en\(dq; */ // Intermediate tag variables used by the lexer (must be autogenerated). /*!stags:re2c format = \(dqlet @@\en\(dq; */ /*!mtags:re2c format = \(dqlet @@ = []\en\(dq; */ /*!re2c re2c:YYMTAGP = \(dq@@.push(yycursor)\(dq; re2c:YYMTAGN = \(dq\(dq; // do nothing re2c:yyfill:enable = 0; re2c:tags = 1; num = [0\-9]+; @t1 num @t2 (\(dq.\(dq #t3 num #t4)* [\ex00] { let vers = [Number(yyinput.substring(t1, t2))] for (let i = 0; i < t3.length; ++i) { vers.push(Number(yyinput.substring(t3[i], t4[i]))) } return vers } * { return null } */ } assert.deepEqual(parse(\(dq1\e0\(dq), [1]) assert.deepEqual(parse(\(dq1.2.3.4.5.6.7\e0\(dq), [1, 2, 3, 4, 5, 6, 7]) assert.deepEqual(parse(\(dq1.2.\e0\(dq), null) .ft P .fi .UNINDENT .UNINDENT.SS پشتیبانی از کدگذاری (Encoding support) .sp درک تفاوت بین \fBcode point\fPها و \fBcode unit\fPها ضروری است\&. یک \fBcode point\fP شناسهٔ عددی یک نماد است. یک \fBcode unit\fP کوچک‌ترین واحد ذخیره‌سازی در متن کدگذاری‌شده است. یک \fBcode point\fP منفرد ممکن است با یک یا چند \fBcode unit\fP نمایش داده شود. در یک کدگذاری با طول ثابت، همهٔ \fBcode point\fPها با تعداد یکسانی از \fBcode unit\fPها نمایش می‌یابند. در یک کدگذاری با طول متغیر، \fBcode point\fPها ممکن است با تعداد متفاوتی از \fBcode unit\fPها نمایش داده شوند. توجه داشته باشید که قاعدهٔ «هر چیزی» (\(dqany\(dq) یعنی \fB[^]\fP با هر \fBcode point\fP مطابقت دارد، اما لزوماً با هر \fBcode unit\fP مطابقت ندارد (تنها راه برای تطبیق با هر \fBcode unit\fP بدون توجه به نوع کدگذاری، قاعدهٔ پیش‌فرض \fB*\fP است). تحلیل‌گر لغوی تولیدشده با جریانی از \fBcode unit\fPها کار می‌کند: \fByych\fP یک \fBcode unit\fP را ذخیره می‌کند و \fBYYCTYPE\fP نوع \fBcode unit\fP است. از سوی دیگر، عبارات باقاعده بر حسب \fBcode point\fPها مشخص می‌شوند. هنگامی که re2js عبارات باقاعده را به اتوماتا کامپایل می‌کند، \fBcode point\fPها را به \fBcode unit\fPها ترجمه می‌کند. این عموماً یک نگاشت ساده نیست: در کدگذاری‌های با طول متغیر، یک بازهٔ واحد از \fBcode point\fP ممکن است به گراف پیچیده‌ای از \fBcode unit\fPها ترجمه شود. کدگذاری‌های زیر پشتیبانی می‌شوند: .INDENT 0.0 .IP \(bu 2 \fBASCII\fP (به‌طور پیش‌فرض فعال است). یک کدگذاری با طول ثابت با فضای کد \fB[0\-255]\fP و \fBcode point\fPها و \fBcode unit\fPهای ۱ بایتی است. .IP \(bu 2 \fBEBCDIC\fP (فعال‌سازی با \fB\-\-ebcdic\fP یا \fBre2c:encoding:ebcdic\fP). یک کدگذاری با طول ثابت با فضای کد \fB[0\-255]\fP و \fBcode point\fPها و \fBcode unit\fPهای ۱ بایتی است. .IP \(bu 2 \fBUCS2\fP (فعال‌سازی با \fB\-\-ucs2\fP یا \fBre2c:encoding:ucs2\fP). یک کدگذاری با طول ثابت با فضای کد \fB[0\-0xFFFF]\fP و \fBcode point\fPها و \fBcode unit\fPهای ۲ بایتی است. .IP \(bu 2 \fBUTF8\fP (فعال‌سازی با \fB\-\-utf8\fP یا \fBre2c:encoding:utf8\fP). یک کدگذاری یونیکد با طول متغیر است. اندازهٔ هر \fBcode unit\fP برابر ۱ بایت است. \fBcode point\fPها با ۱ تا ۴ \fBcode unit\fP نمایش داده می‌شوند. .IP \(bu 2 \fBUTF16\fP (فعال‌سازی با \fB\-\-utf16\fP یا \fBre2c:encoding:utf16\fP). یک کدگذاری یونیکد با طول متغیر است. اندازهٔ هر \fBcode unit\fP برابر ۲ بایت است. \fBcode point\fPها با ۱ تا ۲ \fBcode unit\fP نمایش داده می‌شوند. .IP \(bu 2 \fBUTF32\fP (فعال‌سازی با \fB\-\-utf32\fP یا \fBre2c:encoding:utf32\fP). یک کدگذاری یونیکد با طول ثابت با فضای کد \fB[0\-0x10FFFF]\fP و \fBcode point\fPها و \fBcode unit\fPهای ۴ بایتی است. .UNINDENT .sp فایل‌های ضمیمهٔ \fBinclude/unicode_blocks.re\fP، \fBinclude/unicode_categories.re\fP و \fBinclude/unicode_properties.re\fP تعاریف re2js را برای بلوک‌ها، دسته‌بندی‌ها و ویژگی‌های توصیف‌شده در استاندارد یونیکد ارائه می‌دهند. .sp گزینهٔ \fB\-\-input\-encoding\fP کدگذاری فایل مبدأ را مشخص می‌کند که می‌تواند برای فعال‌سازی مقادیر لفظی (literal) یونیکد در عبارات باقاعده استفاده شود. برای مثال، \fB\-\-input\-encoding utf8\fP به re2js اعلام می‌کند که فایل مبدأ با UTF8 کدگذاری شده است (این گزینه با \fB\-\-utf8\fP که کدگذاری متن ورودی را تعیین می‌کند، تفاوت دارد). گزینهٔ \fB\-\-encoding\-policy\fP نحوهٔ مدیریت جانشین‌های یونیکد (\fBcode point\fPها در بازهٔ \fB[0xD800\-0xDFFF]\fP) را توسط re2js تعیین می‌کند. .sp در زیر مثالی از یک تحلیل‌گر لغوی برای شناسه‌های یونیکد کدگذاری‌شده با UTF8 آمده است. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $INPUT \-o $OUTPUT \-\-utf8 \-s /*!include:re2c \(dqunicode_categories.re\(dq */ function lex(yyinput) { let yycursor = 0 /*!re2c re2c:yyfill:enable = 0; // 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 } */ } if (!lex(\(dq_Ыдентификатор\e0\(dq)) throw \(dqerror!\(dq .ft P .fi .UNINDENT .UNINDENT .SS فایل‌های ضمیمه (Include files) .sp re2js امکان ضمیمه‌کردن فایل‌های دیگر را با استفاده از بلوکی با ساختار \fB/*!include:re2c FILE */\fP یا \fB%{include FILE %}\fP، یا یک دستور درون‌بلوکی \fB!include FILE ;\fP فراهم می‌کند که در آن \fBFILE\fP مسیری به فایل مورد نظر برای ضمیمه‌شدن است. re2js فایل‌های ضمیمه را در دایرکتوری فایلی که شامل دستور است و همچنین در مکان‌های ضمیمه‌ای که می‌توان با گزینهٔ \fB\-I\fP تعیین کرد، جستجو می‌کند. بلوک‌ها/دستورهای ضمیمه‌سازی در re2js به همان شیوهٔ \fB#include\fP در C/C++ عمل می‌کنند: محتویات \fBFILE\fP عیناً در جای بلوک/دستور جای‌گذاری می‌شوند. فایل‌های ضمیمه می‌توانند خود شامل فایل‌های ضمیمهٔ دیگری باشند. برای ردیابی وابستگی‌های ساخت فایل خروجی به فایل‌های ضمیمه، از گزینهٔ \fB\-\-depfile\fP استفاده کنید. re2js چند فایل ضمیمهٔ از پیش‌تعریف‌شده را فراهم می‌کند که در زیردایرکتوری \fBinclude/\fP از پروژه یافت می‌شوند. این فایل‌ها شامل تعاریفی هستند که ممکن است برای پروژه‌های دیگر مفید باشند (مانند دسته‌بندی‌های یونیکد) و ساختاری شبیه به یک کتابخانهٔ استاندارد برای re2js\& تشکیل می‌دهند. در ادامه مثالی از استفاده از فایل‌های ضمیمه آورده شده است. .SS فایل ضمیمهٔ ۱ (definitions.js) .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C const INT = 1 const FLOAT = 2 const NAN = 3 /*!re2c 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 FLOAT } .ft P .fi .UNINDENT .UNINDENT .SS فایل ورودی .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $INPUT \-o $OUTPUT /*!include:re2c \(dqdefinitions.js\(dq */ function lex(yyinput) { let yycursor = 0 /*!re2c re2c:yyfill:enable = 0; * { return NAN } number { return INT } !include \(dqextra_rules.re.inc\(dq; */ } function test(s, n) { if (lex(s) != n) throw \(dqerror!\(dq } test(\(dq123\e0\(dq, INT) test(\(dq123.4567\e0\(dq, FLOAT) .ft P .fi .UNINDENT .UNINDENT .SS فایل‌های هدر .sp ابزار re2js این امکان را فراهم می‌کند تا با استفاده از گزینهٔ \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 یک فایل هدر تولید کرد. نخستین بلوک آغاز فایل هدر و دومین بلوک پایان آن را مشخص می‌کند. تمام محتوای میان این بلوک‌ها توسط re2js پردازش شده و کد تولیدشده در فایلی که با گزینهٔ \fB\-\-header\fP یا پیکربندی \fBre2c:header\fP تعیین شده نوشته می‌شود (یا در صورت عدم استفاده از گزینه یا پیکربندی، در \fBstdout\fP نوشته خواهد شد). فایل هدر خودکار تولیدشده ممکن است در مواردی نیاز باشد که re2js برای تولید تعاریفی به کار می‌رود که باید از سایر واحدهای ترجمه (translation units) قابل مشاهده باشند. .sp در اینجا مثالی از تولید یک فایل هدر آورده شده است که شامل تعریف وضعیت لکسر به همراه متغیرهای برچسب (tag variables) است (تعداد متغیرها به گرامر منظم وابسته بوده و برای برنامه‌نویس نامشخص است). .SS فایل ورودی .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // re2js $INPUT \-o $OUTPUT \-\-header lexer/state.js let state = require(\(aq./lexer/state.js\(aq); /*!header:re2c:on*/ exports.mk_state = function(str) { return { yyinput: str, /*!stags:re2c format = \(dq@@: 0,\en\(dq; */ yycursor: 0 } } /*!header:re2c:off*/ function lex(yyrecord) { let t /*!re2c re2c:api = record; re2c:tags = 1; re2c:yyfill:enable = 0; re2c:header = \(dqlexer/state.js\(dq; [a]* @t [b]* { return t } */ } if (lex(state.mk_state(\(dqab\e0\(dq)) != 1) { throw \(dqerror!\(dq } .ft P .fi .UNINDENT .UNINDENT .SS فایل هدر .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C // Generated by re2c exports.mk_state = function(str) { return { yyinput: str, yyt1: 0, yycursor: 0 } } .ft P .fi .UNINDENT .UNINDENT.SS برنامه‌های اسکلتی (Skeleton programs) .sp با گزینه \fB\-S, \-\-skeleton\fP، ابزار re2js تمام کدهای غیر re2js را نادیده می‌گیرد و یک برنامه خودکفای C تولید می‌کند که می‌تواند در ادامه کامپایل و اجرا شود. این برنامه از کد تحلیل‌گر لغوی (lexer) و داده‌های ورودی تشکیل شده است. به ازای هر DFA ساخته‌شده (بلوک یا شرط)، re2js یک تحلیل‌گر لغوی مستقل و دو فایل تولید می‌کند: یک فایل \fB\&.input\fP حاوی رشته‌های مشتق‌شده از DFA و یک فایل \fB\&.keys\fP حاوی نتایج تطبیق مورد انتظار. برنامه هر تحلیل‌گر لغوی را روی فایل \fB\&.input\fP متناظر اجرا کرده و نتایج را با مقادیر مورد انتظار مقایسه می‌کند. برنامه‌های اسکلتی به چند دلیل بسیار مفید هستند: .INDENT 0.0 .IP \(bu 2 آن‌ها می‌توانند درستی بهینه‌سازی‌های مختلف re2js را بررسی کنند (داده‌ها در مراحل اولیه فرایند، پیش از اعمال هرگونه تبدیل روی DFA تولید می‌شوند). .IP \(bu 2 تولید مجموعه‌ای از داده‌های ورودی با پوشش مناسب می‌تواند هم برای آزمون و هم برای سنجش کارایی (benchmarking) مفید باشد. .IP \(bu 2 تولید برنامه‌های اجرایی خودکفا امکان دست‌یابی به موارد آزمون کمینه‌شده را فراهم می‌سازد (چرا که کد اصلی ممکن است بسیار بزرگ بوده یا وابستگی‌های زیادی داشته باشد). .UNINDENT .sp دشواریِ تولید داده‌های ورودی در این است که به جز در ساده‌ترین حالت‌ها، تعداد رشته‌های ورودیِ ممکن بسیار زیاد است (حتی اگر طول رشته محدود باشد). ابزار re2js این مشکل را با تولید تعداد کافی از رشته‌ها برای پوشش دادن تقریباً تمام گذارهای DFA برطرف می‌کند. این ابزار از الگوریتم زیر استفاده می‌کند: ابتدا اسکلتی از DFA می‌سازد. برای کدگذاری‌هایی با اندازه واحد کد ۱ بایتی (مانند ASCII، UTF\-8 و EBCDIC)، این اسکلت صرفاً یک کپی دقیق از DFA اصلی است. برای کدگذاری‌هایی با واحدهای کد چندبایتی، اسکلت کپی‌ای از DFA است که برخی از گذارهای آن حذف شده‌اند: به این صورت که re2js حداکثر ۲۵۶ واحد کد را برای هر بازه پیوسته مجزا که متناظر با یک گذار DFA است انتخاب می‌کند. مقادیر انتخاب‌شده به طور یکنواخت توزیع شده و شامل کران‌های بازه نیز هستند. ابزار re2js به جای تلاش برای پوشش تمام مسیرهای ممکن در اسکلت (که کاری ناممکن است)، مسیرهای کافی برای پوشش تمام گذارهای اسکلت را تولید می‌کند تا بدین ترتیب پرش‌های شرطی متناظر در تحلیل‌گر لغوی فراخوانی شوند. پیاده‌سازی این الگوریتم به حدود ۱ گیگابایت از گذارها محدود شده و مقدار ثابتی از حافظه را مصرف می‌کند (re2js به محض تولید داده‌ها، آن‌ها را در فایل می‌نویسد). .SS مصورسازی و اشکال‌زدایی (Visualization and debug) .sp با گزینه \fB\-D, \-\-emit\-dot\fP، ابزار re2js هیچ کدی تولید نمی‌کند؛ در عوض، DFA تولیدشده را در قالب DOT ذخیره (dump) می‌کند. می‌توان این خروجی را با استفاده از 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 ابزار re2js در ابتدا توسط 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. .