" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \ \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 \ . 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 "RE2OCAML" 1 "" "" "" .SH "نام (NAME)" re2ocaml \- تولید تحلیل‌گرهای واژگانی سریع برای OCaml .SH "خلاصه دستور (SYNOPSIS)" .sp re2ocaml \fB[ OPTIONS ]\fP \fB[ WARNINGS ]\fP \fBINPUT\fP .sp ورودی می‌تواند یک فایل یا \fB\-\fP برای stdin باشد. .SH "مقدمه (INTRODUCTION)" .sp ابزار re2ocaml به عنوان یک پیش‌پردازنده کار می‌کند. فایل ورودی را (که معمولاً برنامه‌ای در OCaml است، اما می‌تواند هر چیز دیگری باشد) خوانده و به دنبال بلوک‌هایی از کد می‌گردد که درون نشانگرهای شروع/پایان با قالب خاص قرار گرفته‌اند. متن خارج از این بلوک‌ها عیناً به فایل خروجی کپی می‌شود. محتوای این بلوک‌ها توسط re2ocaml پردازش می‌شود\&. این ابزار آن‌ها را به کد OCaml ترجمه کرده و کد تولیدشده را به جای بلوک مربوطه در خروجی قرار می‌دهد. .sp در اینجا نمونه‌ای از یک برنامه کوچک آورده شده است که بررسی می‌کند آیا رشته داده‌شده شامل یک عدد ده‌دهی است یا خیر: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml \-o \-i *) open String type state = { yyinput: string; mutable yycursor: int; } %{ re2c:YYFN = [\(dqlex;bool\(dq, \(dqyyrecord;state\(dq]; re2c:yyfill:enable = 0; [1\-9][0\-9]* { true } * { false } %} let main () = let st = {yyinput = \(dq1234\(dq; yycursor = 0} in if not (lex st) then raise (Failure \(dqerror\(dq) let _ = main () .ft P .fi .UNINDENT .UNINDENT .sp در خروجی، re2ocaml بلوک میانی را با کد تولیدشده جایگزین کرده است: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* Generated by re2ocaml *) (* re2ocaml \-o \-i *) open String type state = { yyinput: string; mutable yycursor: int; } let rec yy0 (yyrecord : state) : bool = let yych = unsafe_get yyrecord.yyinput yyrecord.yycursor in yyrecord.yycursor <\- yyrecord.yycursor + 1; match yych with | \(aq1\(aq..\(aq9\(aq \-> (yy2 [@tailcall]) yyrecord | _ \-> (yy1 [@tailcall]) yyrecord and yy1 (yyrecord : state) : bool = false and yy2 (yyrecord : state) : bool = let yych = unsafe_get yyrecord.yyinput yyrecord.yycursor in match yych with | \(aq0\(aq..\(aq9\(aq \-> yyrecord.yycursor <\- yyrecord.yycursor + 1; (yy2 [@tailcall]) yyrecord | _ \-> (yy3 [@tailcall]) yyrecord and yy3 (yyrecord : state) : bool = true and lex (yyrecord : state) : bool = (yy0 [@tailcall]) yyrecord let main () = let st = {yyinput = \(dq1234\(dq; yycursor = 0} in if not (lex st) then raise (Failure \(dqerror\(dq) let _ = main () .ft P .fi .UNINDENT .UNINDENT .SH "مفاهیم پایه (BASICS)" .sp یک برنامه re2ocaml شامل توالی‌ای از \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 مروری بر نحو re2ocaml برای عبارت‌های منظم ارائه می‌دهد. پس از تعریف، می‌توان از \fBname\fP در سایر عبارت‌های منظم و قواعد استفاده کرد. بازگشت در تعاریف نام‌گذاری‌شده مجاز نیست و هر نام باید پیش از استفاده تعریف شود. یک بلوک، تعاریف نام‌گذاری‌شده را از حوزه سراسری به ارث می‌برد. تعریف مجدد نامی که در حوزه جاری وجود دارد یک خطا است. .TP .B \fBconfiguration = value ;\fP یک \fIپیکربندی\fP امکان تغییر رفتار re2ocaml و سفارشی‌سازی کد تولیدشده را فراهم می‌کند. برای فهرست کامل پیکربندی‌های پشتیبانی‌شده توسط re2ocaml به بخش \fI%پیکربندی‌ها\fP مراجعه کنید. بسته به یک پیکربندی خاص، \fBvalue\fP می‌تواند یک کلمه کلیدی، یک عدد صحیح غیرمنفی یا یک رشته تک‌خطی باشد که باید در علامت نقل‌قول تکی یا دوتایی قرار گیرد، مگر اینکه از نویسه‌های الفبایی\-عددی تشکیل شده باشد. یک بلوک، پیکربندی‌ها را از حوزه سراسری به ارث می‌برد و می‌تواند آن‌ها را دوباره تعریف کند یا موارد جدیدی اضافه نماید. پیکربندی‌های تعریف‌شده درون یک بلوک بر کل بلوک تأثیر می‌گذارند، حتی اگر در انتهای آن ظاهر شوند. .TP .B \fBregular\-expression code\fP یک \fIقاعده\fP، \fBregular\-expression\fP را به کنش معنایی آن متصل می‌کند (یک بلوک کد درون آکولاد، یا یک بلوک کد که با \fB:=\fP شروع شده و به یک خط جدید ختم می‌شود که پس از آن هر نویسه غیرفاصله‌ای قرار می‌گیرد). اگر \fBregular\-expression\fP مطابقت پیدا کند، \fBcode\fP مرتبط اجرا می‌شود. اگر چندین قاعده مطابقت داشته باشند، طولانی‌ترین تطابق اولویت دارد. اگر چندین قاعده با همان رشته تطابق داشته باشند، اولین قاعده اولویت دارد. دو قاعده ویژه وجود دارد: قاعده پیش‌فرض \fB*\fP و قاعده پایان ورودی \fB$\fP\&. قاعده پیش‌فرض همیشه باید تعریف شود؛ این قاعده صرف‌نظر از جایگاهش در بلوک، کمترین اولویت را دارد و با هر واحد کد مطابقت پیدا می‌کند (لزوماً یک نویسه معتبر نیست، به بخش \fI%پشتیبانی از رمزگذاری\fP مراجعه کنید). قاعده پایان ورودی در صورتی باید تعریف شود که روش متناظر برای \fI%مدیریت پایان ورودی\fP استفاده شده باشد. با \fI%شرایط شروع\fP، قواعد نحو پیچیده‌تری خواهند داشت. .TP .B \fB!action code\fP یک \fIکنش\fP یک بلوک تعریف‌شده توسط کاربر از \fBcode\fP را به یک مکان خاص در ماشین حالت متناهی تولیدشده پیوند می‌دهد (به همان روشی که کنش‌های معنایی کد را به حالت‌های نهایی پیوند می‌دهند). برای فهرست کامل کنش‌های از پیش تعریف‌شده به بخش \fI%کنش‌ها\fP مراجعه کنید. .TP .B \fB!directive ;\fP یک \fIرهنمود\fP یکی از دستورات ویژه از پیش تعریف‌شده است. هر رهنمود هدف منحصربه‌فردی دارد. برای جزئیات به بخش \fI%رهنمودها\fP مراجعه کنید. .UNINDENT .SS "بلوک‌ها (Blocks)" .sp نشانگرهای شروع و پایان بلوک یا \fB/*!re2c\fP و \fB*/\fP، یا \fB%{\fP و \fB%}\fP هستند (از هر دو سبک پشتیبانی می‌شود). از نسخه 2.2، بلوک‌ها می‌توانند نام‌های اختیاری داشته باشند که امکان ارجاع به آن‌ها را در سایر بلوک‌ها فراهم می‌کند. انواع مختلفی از بلوک‌ها وجود دارد: .INDENT 0.0 .TP .B \fB/*!re2c[:] ... */\fP یا \fB%{[:] ... %}\fP یک \fIبلوک سراسری\fP شامل تعاریف، پیکربندی‌ها، قواعد و رهنمودها است. re2ocaml عبارت‌های منظم مرتبط با هر قاعده را به یک اتوماتون متناهی قطعی کامپایل می‌کند، آن را به شکل پرش‌های شرطی در زبان مقصد کدگذاری کرده و بلوک را با کد تولیدشده جایگزین می‌نماید. نام‌ها و پیکربندی‌های تعریف‌شده در یک بلوک سراسری به حوزه سراسری اضافه می‌شوند و برای بلوک‌های پس از آن قابل مشاهده خواهند بود. در آغاز برنامه، حوزه سراسری با \fI%گزینه‌های\fP خط فرمان مقداردهی اولیه می‌شود. .TP .B \fB/*!local:re2c[:] ... */\fP یا \fB%{local[:] ... %}\fP یک \fIبلوک محلی\fP مانند یک بلوک سراسری است، اما نام‌ها و پیکربندی‌های درون آن حوزه محلی دارند (بر سایر بلوک‌ها تأثیری نمی‌گذارند). .TP .B \fB/*!rules:re2c[:] ... */\fP یا \fB%{rules[:] ... %}\fP یک \fIبلوک قواعد\fP شبیه یک بلوک محلی است، اما خودش کدی تولید نمی‌کند و تعریفی را هم به حوزه سراسری اضافه نمی‌نماید \-\ - این بلوک برای استفاده مجدد در سایر بلوک‌ها در نظر گرفته شده است. این روشی برای اشتراک‌گذاری کد است (جزئیات بیشتر در بخش \fI%بلوک‌های قابل استفاده مجدد\fP). پیش از نسخه 2.2 re2ocaml، بلوک‌های قواعد به گزینه \fB\-r \-\-reusable\fP نیاز داشتند. .TP .B \fB/*!use:re2c[:] ... */\fP یا \fB%{use[:] ... %}\fP یک بلوک استفاده که به یک بلوک قواعد از پیش تعریف‌شده ارجاع می‌دهد. اگر نام مشخص شده باشد، re2ocaml به دنبال بلوک قواعدی با این نام می‌گردد. در غیر این صورت، از جدیدترین بلوک قواعد استفاده می‌شود (خواه نام‌گذاری‌شده باشد یا بدون نام). یک بلوک use می‌تواند تعاریف، پیکربندی‌ها و قواعد خاص خود را بیفزاید که به موارد بلوک قواعد ارجاع‌شده اضافه می‌شوند. پیش از نسخه 2.2 re2ocaml، بلوک‌های use به گزینه \fB\-r \-\-reusable\fP نیاز داشتند. .TP .B \fB/*!max:re2c[:[:...]] ... */\fP یا \fB%{max[:[:...]] ... %}\fP بلوکی که تعریف \fBYYMAXFILL\fP را تولید می‌کند. یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که هنگام محاسبه مقدار \fBYYMAXFILL\fP کدام بلوک‌ها باید لحاظ شوند (اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند). به طور پیش‌فرض، کد تولیدشده یک تعریف ماکرو برای C (\fB#define YYMAXFILL \fP) یا یک متغیر سراسری برای Go (\fBvar YYMAXFILL int = \fP) است. می‌توان آن را با پیکربندی اختیاری \fBformat\fP سفارشی کرد که یک رشته الگو را مشخص می‌کند که در آن \fB@@{max}\fP (یا به اختصار \fB@@\fP) با مقدار عددی \fBYYMAXFILL\fP جایگزین می‌شود. .TP .B \fB/*!maxnmatch:re2c[:[:...]] ... */\fP یا \fB%{maxnmatch[:[:...]] ... %}\fP بلوکی که تعریف \fBYYMAXNMATCH\fP را تولید می‌کند (به گزینه \fB\-P \-\-posix\-captures\fP نیاز دارد). یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که هنگام محاسبه مقدار \fBYYMAXNMATCH\fP کدام بلوک‌ها باید لحاظ شوند (اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند). به طور پیش‌فرض، کد تولیدشده یک تعریف ماکرو برای C (\fB#define YYMAXNMATCH \fP) یا یک متغیر سراسری برای Go (\fBvar YYMAXNMATCH int = \fP) است. می‌توان آن را با پیکربندی اختیاری \fBformat\fP سفارشی کرد که یک رشته الگو را مشخص می‌کند که در آن \fB@@{max}\fP (یا به اختصار \fB@@\fP) با مقدار عددی \fBYYMAXNMATCH\fP جایگزین می‌شود. .TP .B \fB/*!stags:re2c[:[:...]] ... */\fP، \fB/*!mtags:re2c[:[:...]] ... */\fP یا \fB%{stags[:[:...]] ... %}\fP، \fB%{mtags[:[:...]] ... %{\fP بلوک‌هایی که قطعه‌کد الگویی را مشخص می‌کنند که برای هر متغیر s\-tag/m\-tag تولیدشده توسط re2ocaml گسترش می‌یابد. یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که هنگام محاسبه مجموعه متغیرهای برچسب کدام بلوک‌ها باید لحاظ شوند (اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند). دو پیکربندی اختیاری وجود دارد: \fBformat\fP و \fBseparator\fP\&. پیکربندی \fBformat\fP یک رشته الگو را مشخص می‌کند که در آن \fB@@{tag}\fP (یا به اختصار \fB@@\fP) با نام هر متغیر برچسب جایگزین می‌شود. پیکربندی \fBseparator\fP قطعه‌کدی را مشخص می‌کند که برای پیوستن قطعات \fBformat\fP تولیدشده برای متغیرهای مختلف برچسب استفاده می‌شود. .TP .B \fB/*!svars:re2c[:[:...]] ... */\fP، \fB/*!mvars:re2c[:[:...]] ... */\fP یا \fB%{svars[:[:...]] ... %}\fP، \fB%{mvars[:[:...]] ... %{\fP بلوک‌هایی که قطعه‌کد الگویی را مشخص می‌کنند که برای هر s\-tag/m\-tag گسترش می‌یابد که یا صریحاً در قواعد ذکر شده است (با گزینه \fB\-\ -tags\fP) یا به طور ضمنی توسط re2ocaml تولید شده است (با گزینه‌های \fB\-\ -captvars\fP یا \fB\-\ -posix\-captvars\fP). یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که هنگام محاسبه مجموعه برچسب‌ها کدام بلوک‌ها باید لحاظ شوند (اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند). دو پیکربندی اختیاری وجود دارد: \fBformat\fP و \fBseparator\fP\&. پیکربندی \fBformat\fP یک رشته الگو را مشخص می‌کند که در آن \fB@@{tag}\fP (یا به اختصار \fB@@\fP) با نام هر برچسب جایگزین می‌شود. پیکربندی \fBseparator\fP قطعه‌کدی را مشخص می‌کند که برای پیوستن قطعات \fBformat\fP تولیدشده برای برچسب‌های مختلف استفاده می‌شود. .TP .B \fB/*!getstate:re2c[:[:...]] ... */\fP یا \fB%{getstate[:[:...]] ... %}\fP بلوکی که توزیع شرطی را بر اساس وضعیت تحلیل‌گر لغوی تولید می‌کند (به گزینه \fB\-\ -storable\-state\fP نیاز دارد). یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که کدام بلوک‌ها باید در توزیع وضعیت گنجانده شوند. انتقال پیش‌فرض به برچسب شروع اولین بلوک در فهرست می‌رود. اگر این فهرست خالی باشد، تمام بلوک‌ها لحاظ می‌شوند و انتقال پیش‌فرض به اولین بلوک در فایل که دارای برچسب شروع است می‌رود. این نوع بلوک با گزینه \fB\-\ -loop\-switch\fP ناسازگار است، زیرا به انتقال‌های بین‌بلوکی نیاز دارد که بدون \fBgoto\fP یا فراخوانی‌های تابع پشتیبانی نمی‌شوند. .TP .B \fB/*!conditions:re2c[:[:...]] ... */\fP، \fB/*!types:re2c... */\fP یا \fB%{conditions[:[:...]] ... %}\fP، \fB%{types... %}\fP بلوکی که شمارش شرایط را تولید می‌کند (به گزینه \fB\-\ -conditions\fP نیاز دارد). یک فهرست اختیاری از نام بلوک‌ها مشخص می‌کند که هنگام محاسبه مجموعه شرایط کدام بلوک‌ها باید لحاظ شوند (اگر فهرست خالی باشد، همه بلوک‌ها لحاظ می‌شوند). به طور پیش‌فرض، کد تولیدشده یک شمارش \fBYYCONDTYPE\fP است. می‌توان آن را با پیکربندی‌های اختیاری \fBformat\fP و \fBseparator\fP سفارشی‌سازی کرد. پیکربندی \fBformat\fP یک رشته الگو را مشخص می‌کند که در آن \fB@@{cond}\fP (یا به اختصار \fB@@\fP) با نام هر شرط و \fB@@{num}\fP با نمایه عددی آن شرط جایگزین می‌شود. پیکربندی \fBseparator\fP قطعه‌کدی را مشخص می‌کند که برای پیوستن قطعات \fBformat\fP تولیدشده برای شرایط مختلف استفاده می‌شود. .TP .B \fB/*!include:re2c */\fP یا \fB%{include %}\fP این بلوک اجازه می‌دهد \fB\fP را ضمیمه کنید که باید یک مسیر فایل درون علامت نقل‌قول دوتایی باشد. محتوای فایل عیناً به جای این بلوک جایگزین می‌شود، درست به همان شیوه‌ای که \fB#include\fP در C/C++ کار می‌کند. این بلوک می‌تواند همراه با گزینه \fB\-\ -depfile\fP برای تولید وابستگی‌های سیستم ساخت بر روی فایل‌های ضمیمه‌شده استفاده شود. .TP .B \fB/*!header:re2c:on*/\fP یا \fB%{header:on %}\fP این بلوک شروع فایل سرآیند را مشخص می‌کند. همه چیز پس از آن و تا بلوک \fBheader:off\fP بعدی توسط re2ocaml پردازش شده و در فایل سرآیند مشخص‌شده با گزینه \fB\-t \-\ -type\-header\fP نوشته می‌شود. .TP .B \fB/*!header:re2c:off*/\fP یا \fB%{header:off %}\fP این بلوک پایان فایل سرآیند شروع‌شده با بلوک \fBheader:on*/\fP را مشخص می‌کند. .TP .B \fB/*!ignore:re2c ... */\fP یا \fB%{ignore ... %}\fP بلوکی که محتوای آن نادیده گرفته شده و از فایل خروجی حذف می‌شود. .UNINDENT .SS "پیکربندی‌ها (Configurations)" .sp در اینجا فهرست کاملی از پیکربندی‌های پشتیبانی‌شده توسط re2ocaml آورده شده است: .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های تک‌آرگومانی می‌توانند از نشانه‌گذاری خلاصه‌شده بدون قرار دادن نام در آکولاد استفاده کنند. این گزینه می‌تواند توسط گزینه‌های مربوط به اولیه‌های تکی 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 اگر روی یک مقدار عدد صحیح مثبت تنظیم شود، حالت پیش‌فرض در توزیع شرط تولیدشده، اجرای برنامه را متوقف (abort) می‌کند. .TP .B \fBre2c:cond:goto\fP تکه‌کدی را مشخص می‌کند که برای قواعد میان‌بر تولیدشدهٔ خودکار \fB:=>\fP در شرط‌ها استفاده می‌شود. مقدار پیش‌فرض \fBgoto @@;\fP است. جای‌نگه‌دار \fB@@\fP با نام شرط جایگزین می‌شود (پیکربندی‌های \fBre2c:api:sigil\fP و \fBre2c:cond:goto@cond\fP را ببینید). .TP .B \fBre2c:cond:goto@cond\fP نشانگر مورد استفاده برای جایگزینی آرگومان را در تعریف \fBre2c:cond:goto\fP مشخص می‌کند. مقدار پیش‌فرض \fB@@\fP است. پیکربندی عمومی‌تر \fBre2c:api:sigil\fP را بازنویسی می‌کند. .TP .B \fBre2c:cond:divider\fP جداکنندهٔ بلوک‌های شرط را تعریف می‌کند. مقدار پیش‌فرض \fB/* *********************************** */\fP است. جای‌نگه‌دارها با نام شرط جایگزین می‌شوند (پیکربندی‌های \fBre2c:api;sigil\fP و \fBre2c:cond:divider@cond\fP را ببینید). .TP .B \fBre2c:cond:divider@cond\fP نشانگر مورد استفاده برای جایگزینی آرگومان در تعریف \fBre2c:cond:divider\fP را مشخص می‌کند. پیش‌فرض \fB@@\fP است. پیکربندی عمومی‌تر \fBre2c:api:sigil\fP را بازنویسی می‌کند. .TP .B \fBre2c:cond:prefix\fP, \fBre2c:condprefix\fP پیشوند مورد استفاده برای برچسب‌های شرط را مشخص می‌کند. پیش‌فرض \fByyc_\fP است. .TP .B \fBre2c:cond:enumprefix\fP, \fBre2c:condenumprefix\fP پیشوند مورد استفاده برای شناسه‌های شرط را مشخص می‌کند. پیش‌فرض \fByyc\fP است. .TP .B \fBre2c:debug\-output\fP, \fBre2c:flags:debug\-output\fP, \fBre2c:flags:d\fP مشابه گزینهٔ \fB\-\-debug\-output\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:empty\-class\fP, \fBre2c:flags:empty\-class\fP مشابه گزینهٔ \fB\-\-empty\-class\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:encoding:ebcdic\fP, \fBre2c:flags:ecb\fP, \fBre2c:flags:e\fP مشابه گزینهٔ \fB\-\-ebcdic\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:encoding:ucs2\fP, \fBre2c:flags:wide\-chars\fP, \fBre2c:flags:w\fP مشابه گزینهٔ \fB\-\-ucs2\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:encoding:utf8\fP, \fBre2c:flags:utf\-8\fP, \fBre2c:flags:8\fP مشابه گزینهٔ \fB\-\-utf8\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:encoding:utf16\fP, \fBre2c:flags:utf\-16\fP, \fBre2c:flags:x\fP مشابه گزینهٔ \fB\-\-utf16\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:encoding:utf32\fP, \fBre2c:flags:unicode\fP, \fBre2c:flags:u\fP مشابه گزینهٔ \fB\-\-utf32\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:encoding\-policy\fP, \fBre2c:flags:encoding\-policy\fP مشابه گزینهٔ \fB\-\-encoding\-policy\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:eof\fP نماد نگهبان مورد استفاده با قاعدهٔ پایان ورودی \fB$\fP را تعیین می‌کند. مقدار پیش‌فرض \fB\-1\fP است (قاعدهٔ \fB$\fP استفاده نمی‌شود). سایر مقادیر ممکن شامل تمام واحدهای کد معتبر است. تنها اعداد ده‌دهی شناسایی می‌شوند. .TP .B \fBre2c:header\fP, \fBre2c:flags:type\-header\fP, \fBre2c:flags:t\fP نام فایل سرآیند تولیدشده را به صورت نسبی به دایرکتوری فایل خروجی مشخص می‌کند. مشابه گزینهٔ \fB\-\-header\fP، با این تفاوت که مسیر فایل نسبی است. .TP .B \fBre2c:indent:string\fP رشتهٔ مورد استفاده برای تورفتگی را مشخص می‌کند. پیش‌فرض یک نویسهٔ تب منفرد \fB\(dq\et\(dq\fP است. رشتهٔ تورفتگی باید تنها شامل نویسه‌های فضای خالی باشد. برای غیرفعال کردن کامل تورفتگی، این پیکربندی را روی یک رشتهٔ خالی تنظیم کنید. .TP .B \fBre2c:indent:top\fP حداقل مقدار تورفتگی مورد استفاده را مشخص می‌کند. مقدار پیش‌فرض صفر است. مقدار باید یک عدد صحیح غیرمنفی باشد. .TP .B \fBre2c:invert\-captures\fP مشابه گزینهٔ \fB\-\-invert\-captures\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:label:prefix\fP, \fBre2c:labelprefix\fP پیشوند مورد استفاده برای برچسب‌های وضعیت DFA را مشخص می‌کند. مقدار پیش‌فرض \fByy\fP است. .TP .B \fBre2c:label:start\fP, \fBre2c:startlabel\fP تولید برچسب آغاز بلوک را کنترل می‌کند. مقدار پیش‌فرض صفر است، به این معنی که برچسب آغاز تنها در صورتی تولید می‌شود که استفاده شده باشد. یک مقدار عدد صحیح بزرگ‌تر از صفر، تولید برچسب آغاز را حتی در صورتی که توسط تحلیل‌گر واژگانی استفاده نشده باشد اجباری می‌کند. یک مقدار رشته‌ای نیز تولید برچسب آغاز را اجباری کرده و نام برچسب را روی رشتهٔ مشخص‌شده قرار می‌دهد. این پیکربندی تنها برای بلوک جاری اعمال می‌شود (برای بلوک بعدی به مقدار پیش‌فرض بازنشانی می‌شود). .TP .B \fBre2c:label:yyFillLabel\fP پیشوند برچسب‌های \fBYYFILL\fP مورد استفاده با \fBre2c:eof\fP و در حالت وضعیت قابل‌ذخیره را مشخص می‌کند. .TP .B \fBre2c:label:yyloop\fP نام برچسب مشخص‌کنندهٔ آغاز حلقهٔ تحلیل‌گر واژگانی همراه با گزینهٔ \fB\-\-loop\-switch\fP را تعیین می‌کند. مقدار پیش‌فرض \fByyloop\fP است. .TP .B \fBre2c:label:yyNext\fP نام برچسب اختیاری را که به دنبال گزینشگر \fBYYGETSTATE\fP در حالت وضعیت قابل‌ذخیره می‌آید (فعال‌شده با \fBre2c:state:nextlabel\fP) مشخص می‌کند. پیش‌فرض \fByyNext\fP است. .TP .B \fBre2c:lookahead\fP, \fBre2c:flags:lookahead\fP منسوخ‌شده (گزینهٔ منسوخ‌شدهٔ \fB\-\-no\-lookahead\fP را ببینید). .TP .B \fBre2c:monadic\fP اگر روی مقداری غیر از صفر تنظیم شود، تحلیل‌گر واژگانی تولیدشده از نشانه‌گذاری مونادیک استفاده خواهد کرد (این پیکربندی مختص به زبان Haskell است). .TP .B \fBre2c:nested\-ifs\fP, \fBre2c:flags:nested\-ifs\fP, \fBre2c:flags:s\fP مشابه گزینهٔ \fB\-\-nested\-ifs\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:posix\-captures\fP, \fBre2c:flags:posix\-captures\fP, \fBre2c:flags:P\fP مشابه گزینهٔ \fB\-\-posix\-captures\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:posix\-captvars\fP مشابه گزینهٔ \fB\-\-posix\-captvars\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:tags\fP, \fBre2c:flags:tags\fP, \fBre2c:flags:T\fP مشابه گزینهٔ \fB\-\-tags\fP، اما می‌تواند بر پایهٔ هر بلوک پیکربندی شود. .TP .B \fBre2c:tags:expression\fP عبارت مورد استفاده برای متغیرهای برچسب را مشخص می‌کند. به‌طور پیش‌فرض re2ocaml عبارت‌هایی به فرم \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 نماد سنتینل مورد استفاده برای بررسی‌های پایان ورودی را مشخص می‌کند (هنگامی که بررسی‌های مرز با \fBre2c:yyfill:enable = 0;\fP غیرفعال شده باشند و \fBre2c:eof\fP تنظیم نشده باشد). این پیکربندی بر تولید کد تأثیری ندارد: هدف آن اطمینان از این است که نماد سنتینل در میانه یک قاعده مجاز نباشد، و تضمین این‌که تحلیل‌گر لغوی فراتر از پایان بافر را نخواند. مقدار پیش‌فرض \fI\-1\(ga\fP است (در این حالت re2ocaml فرض می‌کند که سنتینل صفر است، که معمول‌ترین حالت است). تنها اعداد ده‌دهی شناسایی می‌شوند. .TP .B \fBre2c:state:abort\fP اگر روی یک مقدار عدد صحیح مثبت تنظیم شود، حالت پیش‌فرض در توزیع وضعیت تولیدشده اجرای برنامه را لغو (abort) می‌کند، و یک حالت صریح \fB\-1\fP حاوی انتقال به ابتدای بلوک خواهد بود. .TP .B \fBre2c:state:nextlabel\fP کنترل می‌کند که آیا به دنبال عبارت switch مربوط به \fBYYGETSTATE\fP برچسب \fByyNext\fP بیاید یا خیر (مقدار پیش‌فرض صفر است که نشان‌دهنده نبود برچسب است). به‌طور جایگزین می‌توان از \fBre2c:label:start\fP برای تولید یک برچسب شروع مشخص، یا از یک بلوک صریح \fBgetstate\fP برای تولید عبارت switch مربوط به \fBYYGETSTATE\fP به‌طور جداگانه از بلوک تحلیل‌گر لغوی استفاده کرد. .TP .B \fBre2c:unsafe\fP, \fBre2c:flags:unsafe\fP مشابه گزینه \fB\-\-no\-unsafe\fP است، اما می‌تواند بر مبنای هر بلوک پیکربندی شود. اگر روی صفر تنظیم شود، از تولید پوشش‌های \fBunsafe\fP پیرامون \fBYYPEEK\fP جلوگیری می‌کند. پیش‌فرض غیرصفر است (پوشش‌ها تولید می‌شوند). این پیکربندی مختص به Rust است. .TP .B \fBre2c:YYBACKUP\fP, \fBre2c:define:YYBACKUP\fP عنصر پایه عمومی API با نام \fBYYBACKUP\fP را تعریف می‌کند. .TP .B \fBre2c:YYBACKUPCTX\fP, \fBre2c:define:YYBACKUPCTX\fP عنصر پایه عمومی API با نام \fBYYBACKUPCTX\fP را تعریف می‌کند. .TP .B \fBre2c:YYCONDTYPE\fP, \fBre2c:define:YYCONDTYPE\fP عنصر پایه API با نام \fBYYCONDTYPE\fP را تعریف می‌کند. .TP .B \fBre2c:YYCTYPE\fP, \fBre2c:define:YYCTYPE\fP عنصر پایه API با نام \fBYYCTYPE\fP را تعریف می‌کند. .TP .B \fBre2c:YYCTXMARKER\fP, \fBre2c:define:YYCTXMARKER\fP عنصر پایه API با نام \fBYYCTXMARKER\fP را تعریف می‌کند. .TP .B \fBre2c:YYCURSOR\fP, \fBre2c:define:YYCURSOR\fP عنصر پایه API با نام \fBYYCURSOR\fP را تعریف می‌کند. .TP .B \fBre2c:YYDEBUG\fP, \fBre2c:define:YYDEBUG\fP عنصر پایه API با نام \fBYYDEBUG\fP را تعریف می‌کند. .TP .B \fBre2c:YYFILL\fP, \fBre2c:define:YYFILL\fP عنصر پایه API با نام \fBYYFILL\fP را تعریف می‌کند. .TP .B \fBre2c:YYFILL@len\fP, \fBre2c:define:YYFILL@len\fP نماد (sigil) مورد استفاده برای جایگزینی آرگومان در تعریف \fBYYFILL\fP را مشخص می‌کند. پیش‌فرض \fB@@\fP\& است. جایگزین پیکربندی عمومی‌تر \fBre2c:api:sigil\fP می‌شود. .TP .B \fBre2c:YYFILL:naked\fP, \fBre2c:define:YYFILL:naked\fP جایگزین پیکربندی عمومی‌تر \fBre2c:api:style\fP برای \fBYYFILL\fP می‌شود. مقدار صفر متناظر با سبک آزاد API (free\-form) است. .TP .B \fBre2c:YYFN\fP عنصر پایه API با نام \fBYYFN\fP را تعریف می‌کند. .TP .B \fBre2c:YYINPUT\fP عنصر پایه API با نام \fBYYINPUT\fP را تعریف می‌کند. .TP .B \fBre2c:YYGETCOND\fP, \fBre2c:define:YYGETCONDITION\fP عنصر پایه API با نام \fBYYGETCOND\fP را تعریف می‌کند. .TP .B \fBre2c:YYGETCOND:naked\fP, \fBre2c:define:YYGETCONDITION:naked\fP جایگزین پیکربندی عمومی‌تر \fBre2c:api:style\fP برای \fBYYGETCOND\fP می‌شود. مقدار صفر متناظر با سبک آزاد API است. .TP .B \fBre2c:YYGETSTATE\fP, \fBre2c:define:YYGETSTATE\fP عنصر پایه API با نام \fBYYGETSTATE\fP را تعریف می‌کند. .TP .B \fBre2c:YYGETSTATE:naked\fP, \fBre2c:define:YYGETSTATE:naked\fP جایگزین پیکربندی عمومی‌تر \fBre2c:api:style\fP برای \fBYYGETSTATE\fP می‌شود. مقدار صفر متناظر با سبک آزاد API است. .TP .B \fBre2c:YYGETACCEPT\fP, \fBre2c:define:YYGETACCEPT\fP عنصر پایه API با نام \fBYYGETACCEPT\fP را تعریف می‌کند. .TP .B \fBre2c:YYLESSTHAN\fP, \fBre2c:define:YYLESSTHAN\fP عنصر پایه عمومی API با نام \fBYYLESSTHAN\fP را تعریف می‌کند. .TP .B \fBre2c:YYLIMIT\fP, \fBre2c:define:YYLIMIT\fP عنصر پایه API با نام \fBYYLIMIT\fP را تعریف می‌کند. .TP .B \fBre2c:YYMARKER\fP, \fBre2c:define:YYMARKER\fP عنصر پایه API با نام \fBYYMARKER\fP را تعریف می‌کند. .TP .B \fBre2c:YYMTAGN\fP, \fBre2c:define:YYMTAGN\fP عنصر پایه عمومی API با نام \fBYYMTAGN\fP را تعریف می‌کند. .TP .B \fBre2c:YYMTAGP\fP, \fBre2c:define:YYMTAGP\fP عنصر پایه عمومی API با نام \fBYYMTAGP\fP را تعریف می‌کند. .TP .B \fBre2c:YYPEEK\fP, \fBre2c:define:YYPEEK\fP عنصر پایه عمومی API با نام \fBYYPEEK\fP را تعریف می‌کند. .TP .B \fBre2c:YYRESTORE\fP, \fBre2c:define:YYRESTORE\fP عنصر پایه عمومی API با نام \fBYYRESTORE\fP را تعریف می‌کند. .TP .B \fBre2c:YYRESTORECTX\fP, \fBre2c:define:YYRESTORECTX\fP عنصر پایه عمومی API با نام \fBYYRESTORECTX\fP را تعریف می‌کند. .TP .B \fBre2c:YYRESTORETAG\fP, \fBre2c:define:YYRESTORETAG\fP عنصر پایه عمومی API با نام \fBYYRESTORETAG\fP را تعریف می‌کند. .TP .B \fBre2c:YYSETCOND\fP, \fBre2c:define:YYSETCONDITION\fP عنصر پایه API با نام \fBYYSETCOND\fP را تعریف می‌کند. .TP .B \fBre2c:YYSETCOND@cond\fP, \fBre2c:define:YYSETCONDITION@cond\fP نماد (sigil) مورد استفاده برای جایگزینی آرگومان در تعریف \fBYYSETCOND\fP را مشخص می‌کند. مقدار پیش‌فرض \fB@@\fP\& است. جایگزین پیکربندی عمومی‌تر \fBre2c:api:sigil\fP می‌شود. .TP .B \fBre2c:YYSETCOND:naked\fP, \fBre2c:define:YYSETCONDITION:naked\fP جایگزین پیکربندی عمومی‌تر \fBre2c:api:style\fP برای \fBYYSETCOND\fP می‌شود. مقدار صفر متناظر با سبک آزاد API است. .TP .B \fBre2c:YYSETSTATE\fP, \fBre2c:define:YYSETSTATE\fP عنصر پایه API با نام \fBYYSETSTATE\fP را تعریف می‌کند. .TP .B \fBre2c:YYSETSTATE@state\fP, \fBre2c:define:YYSETSTATE@state\fP نماد (sigil) مورد استفاده برای جایگزینی آرگومان در تعریف \fBYYSETSTATE\fP را مشخص می‌کند. مقدار پیش‌فرض \fB@@\fP\& است. جایگزین پیکربندی عمومی‌تر \fBre2c:api:sigil\fP می‌شود. .TP .B \fBre2c:YYSETSTATE:naked\fP, \fBre2c:define:YYSETSTATE:naked\fP جایگزین پیکربندی عمومی‌تر \fBre2c:api:style\fP برای \fBYYSETSTATE\fP می‌شود. مقدار صفر متناظر با سبک آزاد API است. .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 اگر روی غیرصفر تنظیم شود، نقشه‌های بیتی (bitmaps) برای گزینه \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 اگر روی غیرصفر تنظیم شود، re2ocaml در هر بار خوانده شدن \fByych\fP، به‌طور خودکار یک تبدیل به \fBYYCTYPE\fP تولید می‌کند. مقدار پیش‌فرض صفر است (بدون تبدیل). .TP .B \fBre2c:yych:literals\fP, \fBre2c:variable:yych:literals\fP شکل لیترال‌هایی که \fByych\fP در برابر آن‌ها تطبیق داده می‌شود را مشخص می‌کند. مقادیر ممکن عبارتند از: \fBchar\fP (لیترال‌های نویسه‌ای درون گیومه تکی؛ نویسه‌های غیرقابل‌چاپ از توالی‌های گریز که با بک‌اسلش آغاز می‌شوند استفاده می‌کنند)، \fBhex\fP (اعداد صحیح هگزادسیمال) و \fBchar_or_hex\fP (ترکیبی از هر دو، لیترال‌های نویسه‌ای برای نویسه‌های قابل‌چاپ و اعداد صحیح هگزادسیمال برای بقیه). .TP .B \fBre2c:yyctable\fP, \fBre2c:variable:yyctable\fP عنصر پایه API با نام \fByyctable\fP را تعریف می‌کند..TP .B \fBre2c:yynmatch\fP, \fBre2c:variable:yynmatch\fP پریمیتیو API با نام \fByynmatch\fP را تعریف می‌کند\&. .TP .B \fBre2c:yypmatch\fP, \fBre2c:variable:yypmatch\fP پریمیتیو API با نام \fByypmatch\fP را تعریف می‌کند\&. .TP .B \fBre2c:yytarget\fP, \fBre2c:variable:yytarget\fP پریمیتیو API با نام \fByytarget\fP را تعریف می‌کند\&. .TP .B \fBre2c:yystable\fP, \fBre2c:variable:yystable\fP منسوخ شده است\&. .TP .B \fBre2c:yystate\fP, \fBre2c:variable:yystate\fP پریمیتیو API با نام \fByystate\fP را تعریف می‌کند\&. .TP .B \fBre2c:yyfill\fP, \fBre2c:variable:yyfill\fP پریمیتیو API با نام \fByyfill\fP را تعریف می‌کند\&. .TP .B \fBre2c:yyfill:check\fP در صورت تنظیم روی صفر، از تولید بررسی پیش از \fBYYFILL\fP برای تعداد نویسه‌های ورودی (تعریف \fBYYLESSTHAN\fP در API عمومی و مقایسه مبتنی بر \fBYYLIMIT\fP در API اشاره‌گر C) جلوگیری می‌کند. مقدار پیش‌فرض غیرصفر است (بررسی تولید می‌شود). .TP .B \fBre2c:yyfill:enable\fP در صورت تنظیم روی صفر، از تولید \fBYYFILL\fP (همراه با بررسی آن) جلوگیری می‌کند. این مورد باید زمانی استفاده شود که کل ورودی در یک قطعه از حافظه قرار می‌گیرد (نیازی به بافرسازی نیست) و بررسی‌های پایان ورودی به بررسی‌های \fBYYFILL\fP وابسته نیستند (برای مثال در صورتی که از یک نویسه نگهبان (sentinel) استفاده شده باشد). از هشدارها (گزینه \fB\-W\fP) و پیکربندی \fBre2c:sentinel\fP استفاده کنید تا مطمئن شوید تحلیل‌گر واژگانی (lexer) تولیدشده نمی‌تواند فراتر از پایان ورودی را بخواند. مقدار پیش‌فرض غیرصفر است (\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 re2ocaml از نحو زیر برای عبارات باقاعده استفاده می‌کند: .INDENT 0.0 .TP .B \fB\(dqfoo\(dq\fP لیترال رشته‌ای حساس به حروف بزرگ و کوچک. .TP .B \fB\(aqfoo\(aq\fP لیترال رشته‌ای غیرحساس به حروف بزرگ و کوچک. .TP .B \fB[a\-xyz]\fP, \fB[^a\-xyz]\fP کلاس نویسه (احتمالاً نفی‌شده). .TP .B \fB\&.\fP هر نویسه‌ای به جز خط جدید (newline). .TP .B \fBR \e S\fP تفاضل کلاس‌های نویسه \fBR\fP و \fBS\fP\&. .TP .B \fBR*\fP صفر یا چند بار تکرار \fBR\fP\&. .TP .B \fBR+\fP یک یا چند بار تکرار \fBR\fP\&. .TP .B \fBR?\fP \fBR\fP اختیاری\&. .TP .B \fBR{n}\fP تکرار \fBR\fP دقیقاً \fBn\fP بار. .TP .B \fBR{n,}\fP تکرار \fBR\fP حداقل \fBn\fP بار. .TP .B \fBR{n,m}\fP تکرار \fBR\fP از \fBn\fP تا \fBm\fP بار. .TP .B \fB(R)\fP تنها \fBR\fP؛ از پرانتز برای تغییر اولویت تقدم استفاده می‌شود. اگر استخراج زیرتطابق (submatch) فعال باشد، بسته به گزینه \fB\-\-invert\-captures\fP، \fB(R)\fP یک گروه ضبط‌کننده یا غیرضبط‌کننده خواهد بود. .TP .B \fB(!R)\fP اگر استخراج زیرتطابق فعال باشد، بسته به گزینه \fB\-\-invert\-captures\fP، \fB(!R)\fP یک گروه غیرضبط‌کننده یا ضبط‌کننده خواهد بود. .TP .B \fBR S\fP الحاق: \fBR\fP و به دنبال آن \fBS\fP\&. .TP .B \fBR | S\fP جایگزین: \fBR یا S\fP\&. .TP .B \fBR / S\fP پیش‌نگری (Lookahead): \fBR\fP و به دنبال آن \fBS\fP، اما \fBS\fP مصرف نمی‌شود. .TP .B \fBname\fP عبارت باقاعده تعریف‌شده به عنوان \fBname\fP (یا لیترال رشته‌ای \fB\(dqname\(dq\fP در حالت سازگاری با Flex). .TP .B \fB{name}\fP عبارت باقاعده تعریف‌شده به عنوان \fBname\fP در حالت سازگاری با Flex. .TP .B \fB@stag\fP یک \fIs\-tag\fP: آخرین موقعیت ورودی را که \fB@stag\fP با آن مطابقت دارد، در متغیری به نام \fBstag\fP ذخیره می‌کند\&. .TP .B \fB#mtag\fP یک \fIm\-tag\fP: تمام موقعیت‌های ورودی را که \fB#mtag\fP با آن‌ها مطابقت دارد، در متغیری به نام \fBmtag\fP ذخیره می‌کند\&. .TP .B \fB$\fP پایان ورودی. .UNINDENT .sp کلاس‌های نویسه و لیترال‌های رشته‌ای ممکن است شامل توالی‌های گریز زیر باشند: \fB\ea\fP، \fB\eb\fP، \fB\ef\fP، \fB\en\fP، \fB\er\fP، \fB\et\fP، \fB\ev\fP، \fB\e\e\fP، گریزهای اکتال \fB\eooo\fP و گریزهای هگزادسیمال \fB\exhh\fP، \fB\euhhhh\fP و \fB\eUhhhhhhhh\fP\&..SS "کنش‌ها (Actions)" .sp در اینجا فهرستی از کنش‌های از پیش تعریف‌شده که توسط re2ocaml پشتیبانی می‌شوند آمده است: .INDENT 0.0 .TP .B \fB!entry code\fP کنش ورودی (Entry action) یک بلوک از \fBcode\fP تعریف‌شده توسط کاربر را به وضعیت آغازین ماشین حالت متناهی فعلی مقید می‌کند. اگر از \fI\%start conditions\fP استفاده شود، کنش ورودی می‌تواند به‌طور جداگانه برای هر وضعیت تنظیم گردد. این کنش ممکن است برای انجام مقداردهی اولیه استفاده شود، مثلاً برای ذخیره مکان آغازین یک واژه (lexeme). .TP .B \fB!pre_rule code\fP کنش پیش‌قاعده (Pre\-rule action) یک بلوک از \fBcode\fP تعریف‌شده توسط کاربر را به ابتدای کنش‌های معنایی تمامی قواعد در بلوک فعلی (یا وضعیت، در صورت استفاده از \fI\%start conditions\fP) می‌افزاید. این کنش ممکن است برای جداسازی بخش مشترک همه کنش‌های معنایی (مانند ذخیره موقعیت پایان یک واژه) به کار رود. .TP .B \fB!post_rule code\fP کنش پس‌قاعده (Post\-rule action) یک بلوک از \fBcode\fP تعریف‌شده توسط کاربر را به انتهای کنش‌های معنایی تمامی قواعد در بلوک فعلی (یا وضعیت، در صورت استفاده از \fI\%start conditions\fP) الحاق می‌کند. این کنش می‌تواند برای درج دستورهای تله (trap statements) جهت جلوگیری از جریان کنترل ناخواسته استفاده شود. .UNINDENT .SS "دستورالعمل‌ها (Directives)" .sp در اینجا فهرست کاملی از دستورالعمل‌های پشتیبانی‌شده توسط re2ocaml آورده شده است: .INDENT 0.0 .TP .B \fB!use:name ;\fP یک دستورالعمل use درون‌بلوکی که یک بلوک قواعد از پیش تعریف‌شده با \fBname\fP مشخص‌شده را در بلوک فعلی ادغام می‌کند. تعاریف نام‌دار، پیکربندی‌ها و قواعد بلوک ارجاع‌شده به موارد فعلی افزوده می‌شوند. تداخل‌ها میان قواعد و پیکربندی‌های هم‌پوشان به روش معمول برطرف می‌شوند: نخستین قاعده اولویت دارد و آخرین پیکربندی بر پیکربندی‌های قبلی بازنویسی می‌شود. یک استثنا، قواعد ویژه \fB*\fP، \fB$\fP و \fB\fP هستند که برای آن‌ها تعریف محلی بلوک همواره اولویت دارد. یک دستورالعمل use می‌تواند در هر کجای درون یک بلوک قرار گیرد و استفاده از چندین دستورالعمل use مجاز است. .TP .B \fB!include file ;\fP این دستورالعمل همانند بلوک \fBinclude\fP است: محتویات \fBfile\fP را دقیقاً در محل دستورالعمل درج می‌کند. .UNINDENT .SS "رابط برنامه (Program interface)" .sp کد تولیدشده به کمک \fIبنیادینه‌ها (primitives)\fP، که در مجموع با نام \fIAPI\fP\& شناخته می‌شوند، با برنامه بیرونی ارتباط برقرار می‌کند. اینکه چه بنیادینه‌هایی باید برای یک برنامه خاص تعریف شوند به عوامل متعددی از جمله پیچیدگی عبارت‌های منظم، شیوه نمایش ورودی، بافرینگ و استفاده از ویژگی‌های گوناگون بستگی دارد. تمام بنیادینه‌های لازم باید توسط کاربر در قالب ماکروها، توابع، متغیرها یا هر شکل مناسب دیگری که کد تولیدشده را از نظر نحوی و معنایی صحیح سازد، تعریف شوند. ابزار re2ocaml تعاریف را بررسی نمی‌کند (و نمی‌تواند بررسی کند)، بنابراین اگر چیزی جا افتاده باشد یا به نادرستی تعریف شده باشد، برنامه تولیدشده ممکن است در زمان کامپایل یا زمان اجرا دچار خطا شود. این راهنما مثال‌هایی از تعاریف API را در رایج‌ترین موارد ارائه می‌دهد. .sp ابزار re2ocaml دارای دو سبک API است که مجموعه اصلی بنیادینه‌های مورد استفاده یک برنامه را مشخص می‌کنند: .INDENT 0.0 .TP .B \fBRecord API\fP رابط Record API پیش‌فرض برای بک‌اند OCaml است. این رابط شامل یک متغیر \fByyrecord\fP است (نام آن می‌تواند با \fBre2c:yyrecord\fP بازنویسی شود) که باید به عنوان یک record با فیلدهای \fB_yyinput\fP، \fB_yycursor\fP، \fB_yymarker\fP، \fB_yyctxmarker\fP و \fB_yylimit\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 در صورتی که تطابق طولانی‌تر با شکست مواجه شود و تحلیل‌گر لغوی نیاز به عقب‌گرد داشته باشد، استفاده می‌شود. مقداردهی اولیه لازم نیست. .TP .B \fBYYCTXMARKER\fP یک l\-value که موقعیت بافت پسین (trailing context) را ذخیره می‌کند (یک اشاره‌گر یا یک آفست عددی صحیح در \fBYYINPUT\fP). مقداردهی اولیه لازم نیست. \fBYYCTXMARKER\fP تنها در صورتی مورد نیاز است که از عملگر پیش‌نگری \fB/\fP استفاده شود. .TP .B \fBYYFILL\fP یک اولیه 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 (معمولاً یک نقطه‌ویرگول) از هم جدا می‌شوند. اولین عنصر آرایه، نام تابع و نوع بازگشتی را تعریف می‌کند (برای یک تابع بدون مقدار بازگشتی، خالی است). عناصر بعدی، آرگومان‌های تابع را تعریف می‌کنند: نخست، عبارتی برای آرگومان مورد استفاده در بدنه تابع (معمولاً فقط یک نام)؛ دوم، نوع آرگومان؛ سوم، پارامتر رسمی اختیاری (به طور پیش‌فرض به مؤلفه نخست در نظر گرفته می‌شود \- معمولاً هر دو آرگومان و پارامتر شناسه یکسانی هستند). .TP .B \fBYYINPUT\fP یک r\-value که دنباله نویسه‌های ورودی جاری را ذخیره می‌کند (رشته، بافر و غیره). .TP .B \fBYYMAXFILL\fP یک ثبات عددی صحیح برابر با حداکثر مقدار آرگومان ورودی به \fBYYFILL\fP\&. این مقدار می‌تواند با یک بلوک \fBmax\fP تولید شود. .TP .B \fBYYLESSTHAN\fP یک اولیه API عمومی با یک متغیر \fBlen\fP\&. این اولیه باید به عنوان یک r\-value از نوع بولی تعریف شود که اگر و تنها اگر کمتر از \fBlen\fP نویسه ورودی باقی مانده باشد، برابر با \fBtrue\fP شود. .TP .B \fBYYEND\fP یک اولیه API عمومی بدون متغیر. این اولیه باید به عنوان یک r\-value از نوع بولی تعریف شود که اگر و تنها اگر پایان \fIمنطقی\fP ورودی فرا رسیده باشد (بدون در نظر گرفتن نمادهای پدینگ یا نگهبان)، برابر با \fBtrue\fP شود. \fBYYEND\fP برای پیاده‌سازی نماد \fB$\fP در عبارت‌های منظم استفاده می‌شود. این با \fBYYLESSTHAN\fP متفاوت است، که برای اطمینان از اینکه تحلیل‌گر لغوی از پایان بافر فراتر نمی‌خواند استفاده می‌شود. .TP .B \fBYYPEEK\fP یک اولیه API عمومی بدون متغیر. این اولیه باید به عنوان یک r\-value از نوع \fBYYCTYPE\fP تعریف شود که برابر با نویسه موجود در موقعیت ورودی جاری است. .TP .B \fBYYSKIP\fP یک اولیه API عمومی که باید موقعیت ورودی جاری را به اندازه یک واحد کد پیش ببرد. .TP .B \fBYYBACKUP\fP یک اولیه API عمومی که باید موقعیت ورودی جاری را ذخیره کند (تا بعداً با \fBYYRESTORE\fP بازیابی شود). .TP .B \fBYYRESTORE\fP یک اولیه API عمومی که باید موقعیت ورودی جاری را به مقدار ذخیره‌شده توسط \fBYYBACKUP\fP بازگرداند. .TP .B \fBYYBACKUPCTX\fP یک اولیه API عمومی که باید موقعیت ورودی جاری را به عنوان موقعیت بافت پسین ذخیره کند (تا بعداً با \fBYYRESTORECTX\fP بازیابی شود). .TP .B \fBYYRESTORECTX\fP یک اولیه API عمومی که باید موقعیت بافت پسین ذخیره‌شده با \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 واحد کد تغییر دهد (مقدار تغییر ممکن است منفی باشد). .TP .B \fBYYSHIFTMTAG\fP یک اولیه API عمومی با دو متغیر \fBtag\fP و \fBshift\fP که باید آخرین مقدار در تاریخچه \fBtag\fP را به اندازه \fBshift\fP واحد کد تغییر دهد (مقدار تغییر ممکن است منفی باشد). .TP .B \fBYYMAXNMATCH\fP یک ثبات عددی صحیح برابر با حداکثر تعداد گروه‌های گیرانداز POSIX در یک قاعده. این مقدار با یک بلوک \fBmaxnmatch\fP تولید می‌شود. .TP .B \fBYYCONDTYPE\fP نوع شمارش شرایط. می‌تواند با بلوک \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\-ام درست است اگر و تنها اگر واحد کد 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 متناظر هستند، برخی دیگر سراسری بوده و پس از شروع خواندن فایل ورودی توسط re2ocaml قابل تغییر نیستند. گزینه‌های اشکال‌زدایی معمولاً نیازمند ساختن re2ocaml در پیکربندی اشکال‌زدایی هستند. گزینه‌های داخلی برای آزمایش الگوریتم‌های به‌کاررفته در re2ocaml مفید می‌باشند. .INDENT 0.0 .TP .B \fB\-? \-\-help \-h\fP نمایش پیام راهنما. .TP .B \fB\-\-api \fP مشخص کردن API استفاده‌شده توسط کد تولیدی برای برقراری ارتباط با کد تعریف‌شده توسط کاربر. گزینه \fBsimple\fP باید در حالت‌های ساده استفاده شود که نیازی به پر کردن مجدد بافر و ذخیره وضعیت تحلیل‌گر واژگانی وجود ندارد. گزینه \fBrecord\fP باید زمانی استفاده شود که وضعیت تحلیل‌گر واژگانی باید در یک رکورد (struct، class و غیره) ذخیره شود. گزینه \fBgeneric\fP باید در حالت‌های پیچیده‌ای که دو API دیگر به اندازه کافی منعطف نیستند، استفاده شود. .TP .B \fB\-\-bit\-vectors \-b\fP بهینه‌سازی پرش‌های شرطی با استفاده از ماسک‌های بیتی. این گزینه مستلزم \fB\-\-nested\-ifs\fP است\&. .TP .B \fB\-\-captures\fP, \fB\-\-leftmost\-captures\fP فعال‌سازی استخراج تطبیق فرعی با چپ‌ترین گروه‌های گیرانداز حریصانه. نتیجه در یک آرایه \fByybmatch\fP با گنجایش \fB2 * YYMAXNMATCH\fP جمع‌آوری شده، و \fByynmatch\fP روی تعداد گروه‌های قاعده منطبق‌شده تنظیم می‌شود. .TP .B \fB\-\-captvars\fP, \fB\-\-leftmost\-captvars\fP فعال‌سازی استخراج تطبیق فرعی با چپ‌ترین گروه‌های گیرانداز حریصانه. نتیجه در متغیرهای \fByytl\fP و \fByytr\fP برای \fBk\fP\-امین گروه گیرانداز جمع‌آوری می‌شود. .TP .B \fB\-\-case\-insensitive\fP در نظر گرفتن رشته‌های درون گیومه تکی و دوتایی بدون حساسیت به حروف کوچک و بزرگ. .TP .B \fB\-\-case\-inverted\fP معکوس کردن معنای رشته‌های درون گیومه تکی و دوتایی: در نظر گرفتن رشته‌های درون گیومه تکی به عنوان حساس به حروف کوچک و بزرگ و رشته‌های درون گیومه دوتایی به عنوان غیرحساس به حروف کوچک و بزرگ. .TP .B \fB\-\-case\-ranges\fP ادغام حالت‌های متوالی در یک دستور switch در قالب یک بازه به شکل \fBlow ... high\fP\&. این نحو، یک افزونه زبان C/C++ است که توسط کامپایلرهایی مانند GCC، Clang و Tcc پشتیبانی می‌شود. مزیت اصلی نسبت به استفاده از حالت‌های تکی، تولید کد کوچک‌تر و زمان تولید سریع‌تر است، هرچند برای برخی از کامپایلرها مانند Tcc به اندازه باینری کوچک‌تر نیز منجر می‌شود. .TP .B \fB\-\-computed\-gotos \-g\fP بهینه‌سازی پرش‌های شرطی با استفاده از افزونه غیراستاندارد \(dqcomputed goto\(dq (که باید توسط کامپایلر پشتیبانی شود). re2ocaml تنها در موارد پیچیده با انشعاب‌های شرطی فراوان جدول‌های پرش را تولید می‌کند. آستانه پیچیدگی را می‌توان با پیکربندی \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 فعال‌سازی پشتیبانی از \(dqconditions\(dq مشابه Flex: چندین تحلیل‌گر واژگانی به‌هم‌پیوسته در یک بلوک. این یک جایگزین برای مشخص کردن دستی بلوک‌های مختلف re2ocaml متصل‌شده با \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 می‌خواند. re2ocaml فرض می‌کند که محدوده نویسه‌ها 0 \-\- 0xFF و اندازه هر نویسه ۱ بایت است. .TP .B \fB\-\-empty\-class \fP تعریف شیوه برخورد re2ocaml با کلاس‌های نویسه خالی. با \fBmatch\-empty\fP (پیش‌فرض)، کلاس خالی با ورودی خالی تطبیق می‌یابد (که غیرمنطقی است اما سازگار با گذشته است). با \fBmatch\-none\fP کلاس خالی همیشه در تطبیق شکست می‌خورد. با \fBerror\fP کلاس خالی یک خطای کامپایل ایجاد می‌کند. .TP .B \fB\-\-encoding\-policy \fP تعریف شیوه برخورد re2ocaml با جانشین‌های یونیکد. با \fBfail\fP برنامه re2ocaml در صورت مواجهه با یک جانشین با خطا متوقف می‌شود. با \fBsubstitute\fP برنامه re2ocaml بی‌صدا جانشین‌ها را با نقطه کد خطای 0xFFFD جایگزین می‌کند. با \fBignore\fP (پیش‌فرض) re2ocaml با جانشین‌ها مانند نقاط کد عادی رفتار می‌کند. استاندارد یونیکد می‌گوید که جانشین‌های تنها نامعتبرند، اما کتابخانه‌ها و برنامه‌های دنیای واقعی رفتارهای متفاوتی دارند. .TP .B \fB\-\-flex\-syntax \-F\fP پشتیبانی جزئی از نحو Flex: در این حالت، تعاریف نام‌گذاری‌شده نیازی به علامت مساوی و نقطه\-ویرگول پایانی ندارند، و هنگام استفاده باید درون آکولاد قرار گیرند. نام‌های بدون آکولاد به عنوان رشته‌های درون گیومه دوتایی تلقی می‌شوند. .TP .B \fB\-\-goto\-label\fP استفاده از مدل کد \(dqgoto/label\(dq: کدگذاری DFA در قالب بلوک‌های کد برچسب‌دار متصل‌شده با گذارهای \fBgoto\fP میان بلوک‌ها. این تنها برای زبان‌هایی پشتیبانی می‌شود که دارای دستور \fBgoto\fP هستند. .TP .B \fB\-\-header \-\-type\-header \-t HEADER\fP تولید یک فایل \fBHEADER\fP. محتوای این فایل را می‌توان با استفاده از بلوک‌های ویژه \fBheader:on\fP و \fBheader:off\fP تعیین کرد\&. اگر از شرایط استفاده شود، سربرگ تولیدشده به‌طور خودکار یک enum شرطی به آن الصاق خواهد داشت (مگر اینکه یک بلوک صریح \fBconditions\fP وجود داشته باشد). .TP .B \fB\-I PATH\fP افزودن \fBPATH\fP به فهرست مکان‌هایی که هنگام جستجوی فایل‌های include استفاده می‌شوند. این گزینه در ترکیب با بلوک یا دستورالعمل \fBinclude\fP مفید است. re2ocaml به دنبال \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 تعیین شیوه تجزیه عبارت‌های منظم توسط re2ocaml. با \fBascii\fP (پیش‌فرض) re2ocaml ورودی را با کدگذاری ASCII مدیریت می‌کند: هر دنباله‌ای از واحدهای کد، دنباله‌ای از نویسه‌های مستقل ۱ بایتی است. با \fButf8\fP re2ocaml ورودی را با کدگذاری 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، جایی که وضعیت‌های منفرد همان حالت‌های دستور 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 دستورالعمل‌های خط (line directives) را در خروجی قرار نده. این گزینه ممکن است هنگامی که کد تولیدشده در یک سیستم کنترل نسخه نگهداری می‌شود مفید باشد (برای جلوگیری از تفاوت‌ها یا 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) خودداری کند، زیرا تحلیل‌گر لغوی (lexer) از قبل بررسی‌های انتهای ورودی را به شیوه‌ای کارآمدتر انجام می‌دهد. کاربر می‌تواند تعریف امنی از \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 استخراج زیرتطابق (submatch) را با گروه‌های ضبط به سبک 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 مشخص‌شده بارگذاری کرده و آن‌ها را بر روی فایل نحو (syntax) پیش‌فرض اعمال می‌کند. توجه داشته باشید که \fBFILE\fP می‌تواند تنها چند پیکربندی را تعریف کند (اگر برای اصلاح فایل نحو پیش‌فرض استفاده شود)، یا می‌تواند یک بک‌اند زبانی کاملاً جدید را تعریف نماید (در مورد اخیر توصیه می‌شود از گزینه \fB\-\-lang none\fP استفاده کنید). .TP .B \fB\-\-tags \-T\fP استخراج زیرتطابق را با برچسب‌ها (tags) فعال می‌کند. .TP .B \fB\-\-ucs2 \-\-wide\-chars \-w\fP تولید لکسری که ورودی کدگذاری‌شده با UCS2 را می‌خواند. re2ocaml فرض می‌کند که محدوده نویسه‌ها 0 \-\- 0xFFFF و اندازه نویسه ۲ بایت است. این گزینه مستلزم \fB\-\-nested\-ifs\fP\& است. .TP .B \fB\-\-utf8 \-\-utf\-8 \-8\fP تولید لکسری که ورودی با کدگذاری UTF\-8 را می‌خواند. re2ocaml فرض می‌کند که محدوده نویسه‌ها 0 \-\- 0x10FFFF و اندازه نویسه ۱ بایت است. .TP .B \fB\-\-utf16 \-\-utf\-16 \-x\fP تولید لکسری که ورودی کدگذاری‌شده با UTF16 را می‌خواند. re2ocaml فرض می‌کند که محدوده نویسه‌ها 0 \-\- 0x10FFFF و اندازه نویسه ۲ بایت است. این گزینه مستلزم \fB\-\-nested\-ifs\fP\& است. .TP .B \fB\-\-utf32 \-\-unicode \-u\fP تولید لکسری که ورودی کدگذاری‌شده با UTF32 را می‌خواند. re2ocaml فرض می‌کند که محدوده نویسه‌ها 0 \-\- 0x10FFFF و اندازه نویسه ۴ بایت است. این گزینه مستلزم \fB\-\-nested\-ifs\fP\& است. .TP .B \fB\-\-verbose\fP نمایش یک پیام کوتاه در صورت موفقیت. .TP .B \fB\-\-vernum \-V\fP نمایش اطلاعات نسخه در قالب \fBMMmmpp\fP (اصلی، فرعی، وصله). .TP .B \fB\-\-version \-v\fP نمایش اطلاعات نسخه. .TP .B \fB\-\-single\-pass \-1\fP منسوخ شده است. کاری انجام نمی‌دهد (تک‌گذر بودن اکنون رفتار پیش‌فرض است). .UNINDENT .INDENT 0.0 .TP .B \fB\-\-debug\-output \-d\fP درج فراخوانی‌های \fBYYDEBUG\fP در کد تولیدشده. این مورد برای ردیابی اجرای لکسر مفید است. .TP .B \fB\-\-dump\-adfa\fP گزینه اشکال‌زدایی: خروجی دادن DFA پس از تونل‌زنی (tunneling) (در قالب .dot). .TP .B \fB\-\-dump\-cfg\fP گزینه اشکال‌زدایی: خروجی دادن گراف جریان کنترل متغیرهای برچسب (در قالب .dot). .TP .B \fB\-\-dump\-closure\-stats\fP گزینه اشکال‌زدایی: خروجی دادن آمار مربوط به تعداد حالت‌ها در بستار (closure). .TP .B \fB\-\-dump\-dfa\-det\fP گزینه اشکال‌زدایی: خروجی دادن DFA بلافاصله پس از قطعی‌سازی (determinization) (در قالب .dot). .TP .B \fB\-\-dump\-dfa\-min\fP گزینه اشکال‌زدایی: خروجی دادن DFA پس از کمینه‌سازی (minimization) (در قالب .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 مورد استفاده توسط re2ocaml\&. گزینه \fBmoore\fP نشان‌دهنده الگوریتم مور (Moore) است (که پیش‌فرض می‌باشد). گزینه \fBtable\fP نشان‌دهنده الگوریتم \(dqپر کردن جدول\(dq (table filling) است. هر دو الگوریتم باید صرف‌نظر از برچسب‌گذاری مجدد حالت‌ها، DFA یکسانی تولید کنند؛ الگوریتم پر کردن جدول ساده‌تر و بسیار کندتر است و به عنوان پیاده‌سازی مرجع عمل می‌کند. .TP .B \fB\-\-eager\-skip\fP گزینه داخلی: باعث می‌شود لکسر تولیدشده موقعیت ورودی را به‌صورت مشتاقانه (eagerly) پیش ببرد \-\- بلافاصله پس از خواندن نماد ورودی. این گزینه رفتار پیش‌فرض را که در آن موقعیت ورودی به‌صورت تنبل (lazily) \-\- پس از گذار به حالت بعدی \-\- پیش می‌رود، تغییر می‌دهد. .TP .B \fB\-\-no\-lookahead\fP گزینه داخلی، منسوخ‌شده. قبلاً برای فعال کردن الگوریتم TDFA(0) استفاده می‌شد. بر خلاف TDFA(1)، الگوریتم TDFA(0) از پیش‌نگری یک‌نمادی (one\-symbol lookahead) استفاده نمی‌کند. این الگوریتم عملیات‌های ثبات را به جای گذارهای خروجی، روی گذارهای ورودی اعمال می‌کند. ارزیابی‌ها نشان دادند که الگوریتم TDFA(0) نسبت به TDFA(1) کارایی کمتری دارد. .TP .B \fB\-\-no\-optimize\-tags\fP گزینه داخلی: جلوگیری از بهینه‌سازی متغیرهای برچسب (مفید برای اشکال‌زدایی). .TP .B \fB\-\-posix\-closure \fP گزینه داخلی: تعیین الگوریتم کوتاه‌ترین مسیر مورد استفاده برای ساخت بستار اپسیلون (epsilon\-closure) با معناشناسی رفع ابهام POSIX: گزینه \fBgor1\fP (پیش‌فرض) نشان‌دهنده الگوریتم گلدبرگ\-رادزیک (Goldberg\-Radzik) است، و \fBgtop\fP نشان‌دهنده الگوریتم \(dqترتیب توپولوژیکی سراسری\(dq (global topological order) است. .TP .B \fB\-\-posix\-prectable \fP گزینه داخلی: مشخص کردن الگوریتم مورد استفاده برای محاسبه جدول اولویت POSIX. الگوریتم \fBcomplex\fP جدول اولویت را در یک پیمایش از درخت تاریخچه برچسب محاسبه می‌کند و دارای پیچیدگی مرتبه دوم در تعداد حالت‌های TNFA است؛ این گزینه پیش‌فرض است. الگوریتم \fBnaive\fP در بدترین حالت دارای پیچیدگی مرتبه سوم در تعداد حالت‌های TNFA است، اما بسیار ساده‌تر از \fBcomplex\fP بوده و در موارد عادی ممکن است کمی سریع‌تر باشد..TP .B \fB\-\-stadfa\fP گزینهٔ داخلی، منسوخ‌شده. در گذشته برای فعال‌سازی الگوریتم staDFA به کار می‌رفت، که تفاوت آن با TDFA در این است که عملیات ثبات‌ها به جای انتقال‌ها درون وضعیت‌ها قرار می‌گیرد. بنچمارک‌ها نشان دادند که الگوریتم staDFA کارایی کمتری نسبت به TDFA دارد. .TP .B \fB\-\-fixed\-tags \fP گزینهٔ داخلی: مشخص می‌کند که آیا بهینه‌سازی برچسب ثابت (fixed\-tag) باید روی همهٔ برچسب‌ها اعمال شود (\fBall\fP)، هیچ‌یک از آن‌ها (\fBnone\fP)، یا فقط روی برچسب‌های موجود در الحاق بالاترین سطح (\fBtoplevel\fP). مقدار پیش‌فرض \fBall\fP است\&. برچسب‌های \(dqثابت\(dq برچسب‌هایی هستند که در فاصلهٔ ثابتی از برچسبی دیگر (موسوم به \(dqپایه\(dq) قرار دارند. در چنین مواردی تنها نیاز به ردیابی برچسب پایه است، و مقدار برچسب ثابت می‌تواند از مقدار برچسب پایه به علاوهٔ یک آفست ایستا محاسبه شود. برای برچسب‌هایی که تحت جایگزینی یا تکرار هستند، بررسی اینکه آیا برچسب پایه مقدار عدم‌تطابق (no\-match) دارد نیز ضروری است (در این صورت برچسب ثابت نیز صرف‌نظر از آفست، باید روی no\-match تنظیم شود). برای برچسب‌های موجود در الحاق بالاترین سطح، این بررسی لازم نیست، زیرا آن‌ها همیشه تطبیق می‌یابند. .UNINDENT .SS "هشدارها (Warnings)" .sp هشدارها را می‌توان به‌صورت جداگانه فعال یا غیرفعال کرد و یا به یک خطا تبدیل نمود. .INDENT 0.0 .TP .B \fB\-W\fP فعال کردن تمام هشدارها. .TP .B \fB\-Werror\fP تبدیل هشدارها به خطا. توجه داشته باشید که این گزینه به تنهایی هیچ هشداری را فعال نمی‌کند؛ بلکه تنها بر هشدارهایی اثر می‌گذارد که تا کنون فعال شده‌اند یا بعداً فعال خواهند شد. .TP .B \fB\-W\fP فعال کردن \fBwarning\fP\&. .TP .B \fB\-Wno\-\fP غیرفعال کردن \fBwarning\fP\&. .TP .B \fB\-Werror\-\fP فعال کردن \fBwarning\fP و در نظر گرفتن آن به عنوان خطا (این گزینه متضمن \fB\-W\fP است). .TP .B \fB\-Wno\-error\-\fP با این \fBwarning\fP خاص به عنوان خطا برخورد نکن. این گزینه خودِ هشدار را غیرفعال نمی‌کند. .UNINDENT .INDENT 0.0 .TP .B \fB\-Wcondition\-order\fP هشدار در صورتی که برنامهٔ تولیدشده فرضیات ضمنی دربارهٔ شماره‌گذاری شرط‌ها داشته باشد. باید از گزینهٔ \fB\-\-header\fP یا بلوک \fBconditions\fP برای تولید نگاشتی از نام شرط‌ها به شماره‌ها استفاده شود و سپس نام‌های شرطِ تولیدشده به‌صورت خودکار به کار روند. .TP .B \fB\-Wempty\-character\-class\fP هشدار در صورتی که یک عبارت منظم حاوی یک کلاس نویسهٔ خالی باشد. تلاش برای تطبیق یک کلاس نویسهٔ خالی بی‌معنی است: همیشه باید ناموفق باشد. با این حال، به دلایل سازگاری عقبرو، re2ocaml کلاس‌های نویسهٔ خالی را مجاز دانسته و با آن‌ها مانند رشته‌های خالی رفتار می‌کند. از گزینهٔ \fB\-\-empty\-class\fP برای تغییر رفتار پیش‌فرض استفاده کنید. .TP .B \fB\-Wmatch\-empty\-string\fP هشدار در صورتی که یک قاعده پوچ‌پذیر باشد (با یک رشتهٔ خالی تطبیق یابد). اگر تحلیل‌گر لغوی درون یک حلقه اجرا شود و تطبیق رشتهٔ خالی غیرعمدی باشد، تحلیل‌گر لغوی ممکن است به‌طور غیرمنتظره در یک حلقهٔ بی‌پایان متوقف شود. .TP .B \fB\-Wswapped\-range\fP هشدار در صورتی که کران پایین یک بازه بزرگ‌تر از کران بالای آن باشد. رفتار پیش‌فرض این است که بدون هشدار، جای کران‌های بازه جابه‌جا می‌شود. .TP .B \fB\-Wundefined\-control\-flow\fP هشدار در صورتی که برخی از رشته‌های ورودی باعث جریان کنترل تعریف‌نشده در تحلیل‌گر لغوی شوند (الگوهای دارای اشکال گزارش می‌شوند). این یک اشتباه خطرناک و رایج است. این مشکل را می‌توان به سادگی با افزودن قاعدهٔ پیش‌فرض \fB*\fP که کمترین اولویت را دارد، با هر واحد کد مطابقت دارد و همیشه یک واحد کد را مصرف می‌کند، برطرف ساخت. .TP .B \fB\-Wunreachable\-rules\fP هشدار دربارهٔ قواعدی که توسط قواعد دیگر پوشانده شده‌اند (shadowed) و هرگز تطبیق نخواهند یافت. .TP .B \fB\-Wdeprecated\-eof_rule\fP هشدار دربارهٔ قواعد مستقل پایان ورودی \fB$\fP که بر اثر تغییرات آینده از کار خواهند افتاد و نیاز به اصلاح دارند. در حال حاضر این قواعد هنگام تداخل با قواعد دیگر دارای اولویت هستند، اما پس از معرفی نماد عمومی پایان ورودی \fB$\fP، ترتیب اولویت تغییر خواهد کرد و این قواعد توسط قواعد دیگر پوشانده خواهند شد. .TP .B \fB\-Wuseless\-escape\fP هشدار در صورتی که یک نماد به اشتباه گریزدهی شده باشد (دارای escape باشد). به‌طور پیش‌فرض، re2ocaml چنین گریزهایی را بی‌صدا نادیده می‌گیرد، اما این حالت می‌تواند نشان‌دهندهٔ یک اشتباه تایپی یا خطا در توالی گریز (escape sequence) باشد. .TP .B \fB\-Wnondeterministic\-tags\fP هشدار در صورتی که یک برچسب دارای درجهٔ \fBn\fPام از غیرقطعی بودن باشد، که در آن \fBn\fP بزرگ‌تر از ۱ است. .TP .B \fB\-Wsentinel\-in\-midrule\fP هشدار در صورتی که نماد نگهبان در میانهٔ یک قاعده رخ دهد \-\-\- این حالت ممکن است باعث خواندن داده‌ها فراتر از انتهای بافر، کرش کردن یا آسیب دیدن حافظه در تحلیل‌گر لغوی تولیدشده شود. این هشدار تنها زمانی اعمال می‌شود که روش نگهبان برای بررسی پایان ورودی استفاده شده باشد. در صورتی که از پیکربندی \fBre2ocaml:sentinel\fP استفاده شود، این مورد به یک خطا تبدیل می‌گردد. .TP .B \fB\-Wundefined\-syntax\-config\fP هشدار در صورتی که فایل نحو مشخص‌شده با گزینهٔ \fB\-\-syntax\fP فاقد تعاریف برخی از پیکربندی‌ها باشد. این ویژگی به نگهداری فایل‌های نحو تعریف‌شده توسط کاربر کمک می‌کند: اگر انتشار جدیدی پیکربندی‌های جدیدی اضافه کند، فایل نحو قدیمی یک هشدار صادر خواهد کرد و کاربر مطلع می‌شود. اگر برخی پیکربندی‌ها استفاده نمی‌شوند و نیازی به تعریف ندارند، باید به صراحت روی \fB\fP تنظیم شوند\&. .UNINDENT.SS "فایل‌های نحو (Syntax files)" .sp پشتیبانی از زبان‌های گوناگون در re2ocaml بر پایه ایده \fIsyntax files\fP (فایل‌های نحو) استوار است\&. یک فایل نحو، یک فایل پیکربندی است که نحو زبان مقصد را تعریف می‌کند \-\- نه تمام زبان، بلکه بخش کوچکی از آن را که توسط کد تولیدشده استفاده می‌شود. فایل‌های نحو re2ocaml را بسیار انعطاف‌پذیر می‌سازند، اما نباید به عنوان جایگزینی برای .SS "فایل‌های نحو (Syntax files)" .sp پشتیبانی از زبان‌های مختلف در re2c بر پایهٔ ایدهٔ \fIفایل‌های نحو\fP استوار است. یک فایل نحو، فایلی پیکربندی است که نحو زبان مقصد را تعریف می‌کند \-\- نه کل زبان، بلکه بخش کوچکی از آن که توسط کد تولیدشده استفاده می‌شود. فایل‌های نحو انعطاف‌پذیری بالایی به re2c می‌بخشند، اما نباید به عنوان جایگزینی برای پیکربندی‌های \fBre2c:\fP استفاده شوند: هدف آن‌ها تعریف نحو زبان مقصد است، نه سفارشی‌سازی یک تحلیل‌گر لغوی خاص. تمام زبان‌های پشتیبانی‌شده دارای فایل‌های نحو پیش‌فرضی هستند که بخشی از توزیع به شمار می‌روند (زیردایرکتوری \fBinclude/syntax\fP را ببینید)؛ آن‌ها همچنین در فایل باینری re2ocaml تعبیه شده‌اند. کاربران می‌توانند یک فایل نحو سفارشی ارائه دهند که چند پیکربندی را برای یکی از زبان‌های پشتیبانی‌شده بازنویسی می‌کند، یا می‌توانند همهٔ پیکربندی‌ها را مجدداً تعریف کنند (در این حالت باید از گزینهٔ \fB\-\-lang none\fP استفاده شود). فایل‌های نحو شامل پیکربندی‌هایی در چهار نوع مختلف هستند: فهرست ویژگی‌ها، پیکربندی‌های زبان، پیکربندی‌های درون‌جایی و الگوهای کد. .sp \fBفهرست‌های ویژگی (Feature lists)\fP .INDENT 0.0 .INDENT 3.5 چندین پیکربندی فهرستی، ویژگی‌های گوناگونِ پشتیبانی‌شده توسط یک后端 مشخص را تعریف می‌کنند، تا در صورتی که کاربر تلاش کند ویژگی پشتیبانی‌نشده‌ای را فعال سازد، re2ocaml خطای روشنی صادر کند: .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 چندین پیکربندی بولی ویژگی‌هایی از زبان مقصد را توصیف می‌کنند که بر تجزیه‌کننده و تولیدکنندهٔ کد re2ocaml تأثیر می‌گذارند: .INDENT 0.0 .TP .B \fBsemicolons\fP غیرصفر در صورتی که زبان پس از دستورها از نقطه‌ویرگول (semicolon) استفاده کند. .TP .B \fBbacktick_quoted_strings\fP غیرصفر در صورتی که زبان دارای رشته‌های محصور در بک‌تیک (backtick) باشد. .TP .B \fBsingle_quoted_strings\fP غیرصفر در صورتی که زبان دارای رشته‌های محصور در نقل‌قول تکی (single-quote) باشد. .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 است. متغیرها جانگهدارنده‌هایی هستند که در مرحلهٔ تولید کد جایگزین می‌شوند. متغیرهای فهرست خاص هستند: هنگام بسط الگوهای فهرست، re2ocaml عبارت‌های سمت راست دونقطه را چند بار تکرار می‌کند، و هر بار رخدادهای متغیر فهرست را با مقداری مخصوص به همان تکرار جایگزین می‌سازد. فهرست‌ها دارای کران‌های اختیاری هستند (مقادیر منفی از انتها شمرده می‌شوند، برای نمونه \fB\-1\fP به معنای آخرین مؤلفه است). نام‌های شرطی با یک نقطه شروع می‌شوند. هم شرط‌ها و هم متغیرها می‌توانند محلی (مخصوص همان الگوی کد) یا سراسری (مجاز در تمام الگوهای کد) باشند. هنگامی که re2ocaml فایل نحو را می‌خواند، بررسی می‌کند که هر الگوی کد تنها از متغیرها و شرط‌هایی استفاده کند که در آن مجاز شناخته شده‌اند. .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 در ادامه فهرستی از تمام الگوهای کد پشتیبانی‌شده در re2ocaml به همراه متغیرها و شرط‌های محلی آن‌ها آورده شده است. توجه داشته باشید که یک تعریف مشخص می‌تواند از متغیرها و شرط‌های محلی استفاده کند، اما الزامی به این کار ندارد. تمام الگوهای کد بدون استفاده باید روی \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 تعریف یک شمارشگر یا enum (ممکن است با ساختار زبانی ویژه‌ای برای شمارش‌ها تعریف شود، یا صرفاً به صورت چند مقدار ثابت مستقل). متغیرهای پشتیبانی‌شده عبارتند از: \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 عملگر \(dqبرابر با\(dq (equals). .TP .B \fBcode:cmp_ne\fP عملگر \(dqنابرابر با\(dq (not equals). .TP .B \fBcode:cmp_lt\fP عملگر \(dqکوچک‌تر از\(dq (less than). .TP .B \fBcode:cmp_gt\fP عملگر \(dqبزرگ‌تر از\(dq (greater than). .TP .B \fBcode:cmp_le\fP عملگر \(dqکوچک‌تر یا مساوی\(dq (less or equal). .TP .B \fBcode:cmp_ge\fP عملگر \(dqبزرگ‌تر یا مساوی\(dq (greater or equal). .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 گروهی از حالت‌های switch که به یک بلوک کد واحد نگاشت می‌شوند. متغیرهای پشتیبانی‌شده عبارتند از: \fBcase\fP (متغیری از نوع فهرست که به تمام حالت‌ها در این گروه بسط می‌یابد) و \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 یک حالت 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 \fBgoto\fP). متغیرهای پشتیبانی‌شده: \fBarray\fP (جدول حاوی اطلاعات \fBgoto\fP محاسباتی)، \fBindex\fP (اندیس عنصر در جدول) و \fBbase\fP (برچسب پایه، فقط در صورتی استفاده می‌شود که \fB\&.cgoto.relative\fP درست باشد). .TP .B \fBcode:cgoto:data\fP عبارت مقداردهی اولیه برای یک عنصر واحد در جدول \fBgoto\fP محاسباتی. متغیرهای پشتیبانی‌شده: \fBlabel\fP (برچسبی که برای مقداردهی اولیهٔ عنصر جاری استفاده می‌شود)، \fBtype\fP (نوع بنیادین عناصر در جدول) و \fBbase\fP (برچسب پایه \- فقط در صورتی استفاده می‌شود که \fB\&.cgoto.relative\fP درست باشد). .TP .B \fBcode:fndecl\fP اعلان تابع. متغیرهای پشتیبانی‌شده: \fBname\fP (نام تابع)، \fBtype\fP (نوع بازگشتی)، \fBthrow\fP (استثناهای پرتاب‌شده توسط این تابع، که به پیکربندی \fBre2c:yyfn:throw\fP نگاشت می‌شود)، \fBarg\fP (متغیری از نوع فهرست که خودش کدی تولید نمی‌کند، اما عبارت فهرست را به تعداد آرگومان‌های تابع بسط می‌دهد)، \fBargname\fP (نام آرگومان جاری)، \fBargtype\fP (نوع آرگومان جاری). شرط: \fB\&.type\fP (درست، اگر تابع از نوع غیرِ void باشد). .TP .B \fBcode:fndef\fP مشابه \fBcode:fndecl\fP، اما برای تعریف تابع به کار می‌رود؛ بنابراین دارای یک متغیر فهرستی اضافی \fBstmt\fP است که به تمام دستورات موجود در بدنهٔ تابع بسط می‌یابد. .TP .B \fBcode:fncall\fP دستور فراخوانی تابع. متغیرهای پشتیبانی‌شده: \fBname\fP (نام تابع)، \fBretval\fP (مقدار چپ یا l\-value که مقدار بازگشتی در آن ذخیره می‌شود، در صورت وجود) و \fBarg\fP (متغیری از نوع فهرست که به تمام آرگومان‌های تابع بسط می‌یابد). شرط‌ها: \fB\&.args\fP (درست، اگر تابع دارای آرگومان باشد) و \fB\&.retval\fP (درست، اگر ذخیره‌سازی مقدار بازگشتی لازم باشد). .TP .B \fBcode:tailcall\fP دستور فراخوانی انتهایی (tail call). متغیرهای پشتیبانی‌شده: \fBname\fP (نام تابع) و \fBarg\fP (متغیری از نوع فهرست که به تمام آرگومان‌های تابع بسط می‌یابد). شرط‌ها: \fB\&.args\fP (درست، اگر تابع دارای آرگومان باشد) و \fB\&.retval\fP (درست، اگر تابع از نوع غیرِ void باشد). .TP .B \fBcode:recursive_functions\fP بدنهٔ برنامه با مدل کد \fB\-\-recursive\-functions\fP. متغیرهای پشتیبانی‌شده: \fBfn\fP (متغیری از نوع فهرست که خودش کدی تولید نمی‌کند، اما عبارت فهرست را به تعداد توابع بسط می‌دهد)، \fBfndecl\fP (اعلان تابع جاری) و \fBfndef\fP (تعریف تابع جاری). .TP .B \fBcode:fingerprint\fP اثر انگشت (fingerprint) در بالای فایل خروجی تولیدشده. متغیرهای پشتیبانی‌شده: \fBver\fP (نسخهٔ re2ocaml مورد استفاده برای تولید این مورد) و \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 یک خط جدید (newline). .TP .B \fBindent\fP متغیری که هیچ کدی تولید نمی‌کند، اما اثر جانبی افزایش سطح تورفتگی را دارد..TP .B \fBdedent\fP متغیری که هیچ کدی تولید نمی‌کند، اما دارای اثر جانبیِ کاهش سطح دندانه‌گذاری است. .TP .B \fBtopindent\fP رشته دندانه‌گذاری برای دستور فعلی. سطح دندانه‌گذاری توسط تولیدکننده کد ردیابی شده و به‌طور خودکار به‌روزرسانی می‌شود. .UNINDENT .sp در اینجا فهرستی از تمام شرط‌های سراسریِ مجاز در فایل‌های نحو (syntax) آورده شده است: .INDENT 0.0 .TP .B \fB\&.api.simple\fP درست است اگر از API ساده استفاده شود (\fB\-\-api simple\fP یا \fBre2c:api = simple\fP). .TP .B \fB\&.api.generic\fP درست است اگر از API عمومی استفاده شود (\fB\-\-api generic\fP یا \fBre2c:api = generic\fP). .TP .B \fB\&.api.record\fP درست است اگر از API رکوردی استفاده شود (\fB\-\-api record\fP یا \fBre2c:api = record\fP). .TP .B \fB\&.api_style.functions\fP درست است اگر سبک API تابع‌گونه استفاده شود (\fBre2c:api\-style = functions\fP). .TP .B \fB\&.api_style.freeform\fP درست است اگر سبک API آزاد (free\-form) استفاده شود (\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 درست است اگر حلقه‌های تولیدشده توسط re2ocaml باید دارای برچسب باشند (\fBre2c:label:yyloop\fP روی یک رشته غیرخالی تنظیم شده باشد). .TP .B \fB\&.monadic\fP درست است اگر کد تولیدشده باید به‌صورت مونادیک باشد (\fBre2c:monadic = 1\fP). این مورد تنها برای زبان‌های تابعی محض مرتبط است. .TP .B \fB\&.start_conditions\fP درست است اگر شرایط شروع (start conditions) فعال باشند (\fB\-\-start\-conditions\fP). .TP .B \fB\&.storable_state\fP درست است اگر وضعیت قابل ذخیره‌سازی فعال باشد (\fB\-\-storable\-state\fP). .TP .B \fB\&.unsafe\fP درست است اگر re2ocaml برای تولید کد سریع‌تر باید از بلوک‌های \(dqunsafe\(dq استفاده کند (\fB\-\-unsafe\fP، \fBre2c:unsafe = 1\fP). این مورد تنها برای زبان‌هایی کاربرد دارد که دارای ویژگی \(dqunsafe\(dq هستند. .TP .B \fB\&.version\fP درست است اگر اثرانگشت (fingerprint) تولیدشده باید حاوی نسخه re2ocaml باشد. .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 یکی از چالش‌های اصلی برای تحلیل‌گر لغوی، دانستن زمان توقف است. چندین شرط برای پایان کار وجود دارد: .INDENT 0.0 .IP \(bu 2 تحلیل‌گر لغوی ممکن است با یک قاعده (شامل قاعده پیش‌فرض \fB*\fP) تطبیق یابد و به یک وضعیت نهایی برسد .IP \(bu 2 تحلیل‌گر لغوی ممکن است در تطبیق با هر قاعده‌ای شکست بخورد و به وضعیت پیش‌فرض برسد .IP \(bu 2 تحلیل‌گر لغوی ممکن است به پایان ورودی برسد .UNINDENT .sp دو شرط اول کار تحلیل‌گر لغوی را به‌طور طبیعی خاتمه می‌دهند: تحلیل‌گر به وضعیتی بدون گذارهای خروجی می‌رسد و تطبیق به‌طور خودکار متوقف می‌شود. اما شرط سوم، یعنی پایان ورودی، متفاوت است: این وضعیت ممکن است در هر حالتی رخ دهد و تحلیل‌گر باید بتواند آن را مدیریت کند. بررسی پایان ورودی، جریان عادی کار تحلیل‌گر لغوی را قطع کرده و شاخه‌های شرطی به برنامه تولیدشده اضافه می‌کند؛ از این رو لازم است تعداد این بررسی‌ها به حداقل برسد. re2ocaml از چند روش مختلف برای مدیریت پایان ورودی پشتیبانی می‌کند. انتخاب روش به پیچیدگی عبارت‌های منظم، نیاز به بافرسازی، ملاحظات کارایی و عوامل دیگر بستگی دارد. در ادامه فهرستی از این روش‌ها آورده شده است: .INDENT 0.0 .IP \(bu 2 \fBنگهبان (Sentinel).\fP این روش نیاز به بررسی‌های پایان ورودی را به‌کلی برطرف می‌کند. این روش ساده و کارآمد است، اما به مواردی محدود می‌شود که یک نویسه «نگهبان» طبیعی وجود داشته باشد که هرگز در ورودی معتبر ظاهر نشود. این نویسه ممکن است همچنان در ورودی نامعتبر رخ دهد، اما نباید توسط عبارت‌های منظم مجاز شمرده شود، مگر شاید به عنوان آخرین نویسه یک قاعده. نویسه نگهبان به انتهای ورودی افزوده می‌شود و نقش سیگنال توقف را ایفا می‌کند: هنگامی که تحلیل‌گر لغوی این نویسه را می‌خواند، یا خطای نحوی رخ داده است یا به پایان ورودی رسیده است. در هر دو حالت، تحلیل‌گر باید متوقف شود. این روش زمانی استفاده می‌شود که \fBYYFILL\fP با دستور \fBre2c:yyfill:enable = 0;\fP غیرفعال شده باشد و \fBre2c:eof\fP مقدار پیش‌فرض \fB\-1\fP داشته باشد. .nf .fi .sp .IP \(bu 2 \fBنگهبان همراه با بررسی مرزها (Sentinel with bounds checks).\fP این یک روش عمومی است: امکان مدیریت هرگونه ورودی را بدون محدودیت بر روی عبارت‌های منظم فراهم می‌کند. ایده کار این است که تعداد بررسی‌های پایان ورودی با انجام آن‌ها تنها روی نویسه‌های خاصی کاهش یابد. مشابه روش «نگهبان»، یکی از نویسه‌ها به عنوان «نگهبان» انتخاب شده و به انتهای ورودی متصل می‌شود. با این حال، هیچ محدودیتی در محل وقوع نگهبان وجود ندارد (در واقع، هر نویسه‌ای را می‌توان به عنوان نگهبان انتخاب کرد). هنگامی که تحلیل‌گر این نویسه را می‌خواند، علاوه بر آن بررسی مرز را نیز انجام می‌دهد. اگر موقعیت فعلی در محدوده مجاز باشد، تحلیل‌گر تطبیق را از سر گرفته و با نگهبان مانند یک نویسه عادی رفتار می‌کند. در غیر این صورت \fBYYFILL\fP را فراخوانی می‌کند (مگر اینکه غیرفعال شده باشد). اگر ورودی بیشتری فراهم شود، تحلیل‌گر لغوی نویسه آخر را دوباره بررسی کرده و طوری ادامه می‌دهد که گویی نگهبان وجود نداشته است. در غیر این صورت، این نقطه پایان واقعی ورودی است و تحلیل‌گر متوقف می‌شود. این روش زمانی استفاده می‌شود که \fBre2c:eof\fP مقداری غیرمنفی داشته باشد (باید روی مقدار عددی نویسه نگهبان تنظیم شود). استفاده از \fBYYFILL\fP اختیاری است. .nf .fi .sp .IP \(bu 2 \fBبررسی مرزها با پدینگ (Bounds checks with padding).\fP این یک روش عمومی است و ممکن است از روش «نگهبان همراه با بررسی مرزها» سریع‌تر باشد، اما پیچیده‌تر نیز هست. ایده این است که وضعیت‌های DFA به مؤلفه‌های قویاً همبند (SCCها) افراز شوند و به ازای هر SCC، یک بررسی منفرد برای نویسه‌های کافی تولید شود تا طولانی‌ترین مسیر بدون حلقه در آن SCC پوشش داده شود. این کار تعداد بررسی‌ها را کاهش می‌دهد، اما مشکلی در مورد لکسم‌های کوتاه در پایان ورودی به وجود می‌آید، زیرا این بررسی به نویسه‌های کافی برای پوشش طولانی‌ترین لکسم نیاز دارد. این مشکل را می‌توان با لایه‌گذاری (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) اجازه می‌دهد تا عملیات پایه‌ای مانند خواندن یک نویسه بازنویسی شوند، که این امر امکان گنجاندن بررسی‌های پایان ورودی را به عنوان بخشی از آن‌ها فراهم می‌سازد. این رویکرد مستعد خطا است و باید با احتیاط استفاده شود. برای استفاده از یک روش سفارشی، API عمومی را با \fB\-\-api custom\fP یا \fBre2c:api = custom;\fP فعال کرده و بررسی‌های مرز پیش‌فرض را با \fBre2c:yyfill:enable = 0;\fP یا \fBre2c:yyfill:check = 0;\fP غیرفعال نمایید. .UNINDENT .sp زیربخش‌های زیر شامل مثالی از هر روش هستند. .SS "نگهبان (Sentinel)" .sp این مثال از یک نویسه نگهبان برای مدیریت پایان ورودی استفاده می‌کند. برنامه کلمات جداشده با فاصله را در یک رشته خاتمه‌یافته با null شمارش می‌کند. نگهبان null است: این آخرین نویسه هر رشته ورودی است و در میانه یک لکسم توسط هیچ‌یک از قواعد مجاز نیست (به‌ویژه، در بازه‌های نویسه‌ای که ممکن است نادیده گرفته شوند، گنجانده نشده است). اگر یک 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 (* re2ocaml \-o *) open String type state = { yyinput: string; mutable yycursor: int; } (* expect a null\-terminated string *) %{ re2c:YYFN = [\(dqlex;int\(dq, \(dqyyrecord;state\(dq, \(dqcount;int\(dq]; re2c:yyfill:enable = 0; * { \-1 } [\ex00] { count } [a\-z]+ { lex yyrecord (count + 1) } [ ]+ { lex yyrecord count } %} let test(yyinput, count) = let st = {yyinput = yyinput; yycursor = 0} in if not (lex st 0 = count) then raise (Failure \(dqerror\(dq) let main () = test(\(dq\(dq, 0); test(\(dqone two three\(dq, 3); test(\(dqf0ur\(dq, \-1) let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "نگهبان با بررسی‌های مرزی (Sentinel with bounds checks)" .sp این مثال از نگهبان همراه با بررسی مرزها برای مدیریت پایان ورودی استفاده می‌کند (این روش در نسخه 1.2 افزوده شد). برنامه رشته‌های درون گیومه تکی جداشده با فاصله را شمارش می‌کند. نویسه نگهبان null است که با پیکربندی \fBre2c:eof = 0;\fP مشخص می‌شود. همانند روش \fI%نگهبان\fP، null آخرین نویسه هر رشته ورودی است، اما در میانه یک قاعده مجاز است (برای مثال، \fB\(aqaaa\e0aa\(aq\e0\fP ورودی معتبر است، اما \fB\(aqaaa\e0\fP یک خطای نحوی است). بررسی‌های مرزی در هر وضعیتی که با یک نویسه ورودی مطابقت دارد تولید می‌شوند، اما به شاخه‌ای که null را پردازش می‌کند محدود هستند. بررسی‌های مرزی در API عمومی به شکل \fBYYLIMIT <= YYCURSOR\fP یا \fBYYLESSTHAN(1)\fP هستند. اگر شرط بررسی درست باشد، تحلیل‌گر به پایان ورودی رسیده است و باید متوقف شود (\fBYYFILL\fP با \fBre2c:yyfill:enable = 0;\fP غیرفعال شده است چرا که ورودی در یک بافر جا می‌شود، برای مثالی که از \fBYYFILL\fP استفاده می‌کند بخش \fI%YYFILL با نگهبان\fP را ببینید). رسیدن به پایان ورودی سه احتمال را ایجاد می‌کند: اگر تحلیل‌گر در وضعیت اولیه باشد، با قاعده پایان ورودی \fB$\fP مطابقت پیدا می‌کند؛ در غیر این صورت ممکن است به یک قاعده منطبق‌شده قبلی (از جمله قاعده پیش‌فرض \fB*\fP) عقب‌گرد کند یا به یک وضعیت پیش‌فرض برود، که موجب هشدار \fI%\-Wundefined\-control\-flow\fP می‌شود. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml \-o *) open String type state = { yyinput: string; mutable yycursor: int; mutable yymarker: int; yylimit: int; } (* expect a null\-terminated string *) %{ re2c:YYFN = [\(dqlex;int\(dq, \(dqyyrecord;state\(dq, \(dqcount;int\(dq]; re2c:yyfill:enable = 0; re2c:eof = 0; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; * { \-1 } $ { count } str { lex yyrecord (count + 1) } [ ]+ { lex yyrecord count } %} let test(str, count) = let st = { yyinput = str; yycursor = 0; yymarker = 0; yylimit = length str \- 1; (* terminating null not included *) } in if not (lex st 0 = count) then raise (Failure \(dqerror\(dq) let main () = test(\(dq\(dq, 0); test(\(dq\(aqqu\ex00tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \(dq, 3); test(\(dq\(aqunterminated\e\e\(aq\(dq, \-1) let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "بررسی‌های مرزی با پدینگ (Bounds checks with padding)" .sp این مثال از بررسی مرزها با پدینگ (لایه‌گذاری) برای مدیریت پایان ورودی استفاده می‌کند (این روش به طور پیش‌فرض فعال است). برنامه رشته‌های درون گیومه تکی جداشده با فاصله را شمارش می‌کند. یک پدینگ از نویسه‌های null به تعداد \fBYYMAXFILL\fP در انتهای ورودی الحاق می‌شود، که در آن مقدار \fBYYMAXFILL\fP به طور خودکار با یک بلوک \fBmax\fP تولید می‌شود. استفاده از null برای پدینگ الزامی نیست \-\- هر نویسه‌ای تا زمانی که پسوند لکسم معتبری را تشکیل ندهد می‌تواند استفاده شود (در این مثال پدینگ نباید شامل گیومه تکی باشد، زیرا ممکن است با پسوند یک رشته درون گیومه تکی اشتباه گرفته شود). یک قاعده «توقف» وجود دارد که با اولین نویسه پدینگ (null) تطابق می‌یابد و تحلیل‌گر لغوی را متوقف می‌کند (توجه داشته باشید که بررسی می‌کند آیا null در آغاز پدینگ است یا خیر، در غیر این صورت یک خطای نحوی است). بررسی‌های مرزی تنها در وضعیت‌های خاصی که توسط مؤلفه‌های قویاً همبند اتوماتون مشخص می‌شوند تولید می‌گردند. بررسی‌ها در API عمومی به شکل \fB(YYLIMIT \- YYCURSOR) < n\fP یا \fBYYLESSTHAN(n)\fP هستند، که در آن \fBn\fP حداقل تعداد نویسه‌های مورد نیاز برای پیشروی تحلیل‌گر است (همچنین به این معناست که بررسی مرز بعدی حداکثر در \fBn\fP نویسه آینده رخ خواهد داد). اگر شرط بررسی درست باشد، تحلیل‌گر به پایان ورودی رسیده است و \fBYYFILL(n)\fP را فراخوانی می‌کند که باید یا حداقل \fBn\fP نویسه ورودی فراهم کند یا بازنگردد. در این مثال \fBYYFILL\fP همیشه با شکست مواجه می‌شود و تحلیل‌گر را با خطا خاتمه می‌دهد (که اشکالی ندارد چرا که ورودی در یک بافر جا می‌شود). برای مثالی که بافر ورودی را با \fBYYFILL\fP مجدداً پر می‌کند بخش \fI%YYFILL با پدینگ\fP را ببینید. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml \-o *) open String exception Fill type state = { yyinput: string; mutable yycursor: int; yylimit: int; } %{max %} %{ re2c:YYFN = [\(dqlex;int\(dq, \(dqyyrecord;state\(dq, \(dqcount;int\(dq]; re2c:YYFILL = \(dqraise Fill;\(dq; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; [\ex00] { (* check that it is the sentinel, not some unexpected null *) if yyrecord.yycursor = length yyrecord.yyinput \- yymaxfill + 1 then count else \-1 } str { lex yyrecord (count + 1) } [ ]+ { lex yyrecord count } * { \-1 } %} let test(str, count) = let buf = cat str (make yymaxfill \(aq\ex00\(aq) in let st = {yyinput = buf; yycursor = 0; yylimit = length buf} in let result = try lex st 0 with Fill \-> \-1 in if not (result = count) then raise (Failure \(dqerror\(dq) let main () = test(\(dq\(dq, 0); test(\(dq\(aqunterminated\e\e\(aq\(dq, \-1); test(\(dq\(aqqu\ex00tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \(dq, 3); test(\(dq\(aqunexpected \ex00 null\(dq, \-1) let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "بررسی‌های سفارشی (Custom checks)" .sp این مثال از یک روش سفارشی مدیریت پایان ورودی مبتنی بر API عمومی استفاده می‌کند. برنامه رشته‌های درون گیومه تکی جداشده با فاصله را شمارش می‌کند. این مثال همانند مثال \fI%نگهبان\fP است، با این تفاوت که ورودی با null خاتمه نیافته است. برای جبران عدم وجود نویسه نگهبان در انتهای ورودی، \fBYYPEEK\fP بازتعریف شده است تا پیش از خواندن نویسه ورودی بعدی یک بررسی مرز انجام دهد. این روش به دلیل انجام بررسی‌های مکرر ناکارآمد است. اگر شرط بررسی ناموفق باشد، \fBYYPEEK\fP نویسه واقعی را برمی‌گرداند؛ در غیر این صورت یک نویسه نگهبان ساختگی بازمی‌گرداند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml \-o *) type state = { str: string; mutable cur: int; lim: int; } (* expect a string without terminating null *) %{ re2c:api = generic; re2c:YYFN = [\(dqlex;int\(dq, \(dqst;state\(dq, \(dqcount;int\(dq]; re2c:YYPEEK = \(dqif st.cur < st.lim then st.str.[st.cur] else \(aq\e\ex00\(aq\(dq; re2c:YYSKIP = \(dqst.cur <\- st.cur + 1;\(dq; re2c:yyfill:enable = 0; * { \-1 } [\ex00] { count } [a\-z]+ { lex st (count + 1) } [ ]+ { lex st count } %} let test(str, count) = let st = {str = str; cur = 0; lim = String.length str} in if not (lex st 0 = count) then raise (Failure \(dqerror\(dq) let main () = test(\(dq\(dq, 0); test(\(dqone two three\(dq, 3); test(\(dqf0ur\(dq, \-1) let _ = main () .ft P .fi .UNINDENT .UNINDENT .SH "پر کردن مجدد بافر (BUFFER REFILLING)" .sp نیاز به بافرسازی زمانی پیش می‌آید که ورودی نتواند به‌یکباره در حافظه نگاشت شود: یا بیش از حد بزرگ است، یا به صورت جریانی (مانند خواندن از یک سوکت) دریافت می‌شود. روش معمول در این موارد، تخصیص یک بافر حافظه با اندازه ثابت و پردازش ورودی در تکه‌هایی است که در این بافر جا می‌شوند. هنگامی که تکه فعلی پردازش شد، به بیرون منتقل شده و داده‌های جدید وارد می‌شوند. در عمل این موضوع تا حدی پیچیده‌تر است، زیرا وضعیت تحلیل‌گر لغوی تنها از یک موقعیت ورودی تشکیل نشده، بلکه مجموعه‌ای از موقعیت‌های مرتبط با یکدیگر است: .INDENT 0.0 .IP \(bu 2 مکان‌نما (cursor): نویسه بعدی ورودی که باید خوانده شود (\fBYYCURSOR\fP در API اشاره‌گر C یا \fBYYSKIP\fP/\fBYYPEEK\fP در API عمومی) .IP \(bu 2 حد (limit): موقعیت بعد از آخرین نویسه موجود ورودی (\fBYYLIMIT\fP در API اشاره‌گر C، که به‌طور ضمنی توسط \fBYYLESSTHAN\fP در API عمومی مدیریت می‌شود) .IP \(bu 2 نشانگر (marker): موقعیت جدیدترین تطابق، در صورت وجود (\fBYYMARKER\fP در API پیش‌فرض یا \fBYYBACKUP\fP/\fBYYRESTORE\fP در API عمومی) .IP \(bu 2 توکن (token): آغاز لکسم جاری (در API مربوط به re2ocaml ضمنی است، زیرا برای عملکرد عادی تحلیل‌گر نیازی به آن نیست و می‌تواند توسط کاربر تعریف و به‌روزرسانی شود) .IP \(bu 2 نشانگر بافتار (context marker): موقعیت بافتار پسین (\fBYYCTXMARKER\fP در API اشاره‌گر C یا \fBYYBACKUPCTX\fP/\fBYYRESTORECTX\fP در API عمومی) .IP \(bu 2 متغیرهای برچسب (tag variables): موقعیت‌های زیرتطابق (تعریف‌شده با بلوک‌های \fBstags\fP و \fBmtags\fP و اولیه‌های API عمومی شامل \fBYYSTAGP\fP/\fBYYSTAGN\fP/\fBYYMTAGP\fP/\fBYYMTAGN\fP) .UNINDENT .sp همه این‌ها در هر حالتی استفاده نمی‌شوند، اما در صورت استفاده، باید توسط \fBYYFILL\fP به‌روزرسانی شوند. تمام موقعیت‌های فعال در بخش بین token و cursor قرار دارند، بنابراین هر چیزی بین شروع بافر و token می‌تواند دور ریخته شود، بخش از token تا limit باید به ابتدای بافر منتقل شود، و فضای خالی در انتهای بافر باید با داده‌های جدید پر شود. برای جلوگیری از فراخوانی‌های مکرر \fBYYFILL\fP، بهتر است تا جای ممکن نویسه‌های ورودی بیشتری پر شوند (حتی اگر نویسه‌های کمتری برای ازسرگیری کار تحلیل‌گر کافی باشد). جزئیات پیاده‌سازی \fBYYFILL\fP بسته به اینکه از کدام روش مدیریت EOF استفاده می‌شود اندکی متفاوت است: حالت قاعده EOF تا حدودی ساده‌تر از حالت بررسی مرز همراه با پدینگ است. همچنین توجه داشته باشید که اگر گزینه \fB\-f \-\-storable\-state\fP استفاده شود، \fBYYFILL\fP معنای متفاوتی خواهد داشت (که در بخش مربوط به وضعیت قابل ذخیره‌سازی شرح داده شده است). .SS "YYFILL با نگهبان (YYFILL with sentinel)" .sp اگر از قاعده EOF استفاده شود، \fBYYFILL\fP یک اولیه شبه‌تابع است که هیچ آرگومانی نمی‌پذیرد و مقداری را بازمی‌گرداند که با صفر مقایسه می‌شود. فراخوانی \fBYYFILL\fP با شرط \fBYYLIMIT <= YYCURSOR\fP در API اشاره‌گر C و \fBYYLESSTHAN()\fP در API عمومی برانگیخته می‌شود. یک مقدار بازگشتی غیرصفر به این معنی است که \fBYYFILL\fP ناموفق بوده است. یک فراخوانی موفق \fBYYFILL\fP باید حداقل یک نویسه را فراهم کرده و موقعیت‌های ورودی را بر این اساس تنظیم کند. Limit همیشه باید روی یک موقعیت بعد از آخرین موقعیت ورودی در بافر تنظیم شود، و نویسه موجود در موقعیت limit باید نماد نگهبان مشخص‌شده توسط پیکربندی \fBre2c:eof\fP باشد. تصاویر زیر مکان‌های نسبی موقعیت‌های ورودی را در بافر قبل و بعد از فراخوانی \fBYYFILL\fP نشان می‌دهند (نماد نگهبان با \fB#\fP مشخص شده است، و تصویر دوم حالتی را نشان می‌دهد که ورودی کافی برای پر کردن کل بافر وجود ندارد). .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C <\-\- shift \-\-> >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-\-\-\-\-\-\-\-\-D#\-\-\-\-\-\-\-\-\-\-\-E\-> buffer token marker limit, cursor >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-\-\-\-\-\-\-\-\-D\-\-\-\-\-\-\-\-\-\-\-\-E#\-> buffer, marker cursor limit token <\-\- shift \-\-> >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-\-\-\-\-\-\-\-\-D#\-\-E (EOF) buffer token marker limit, cursor >\-A\-\-\-\-\-\-\-\-\-\-\-\-B\-\-\-\-\-\-\-\-\-C\-\-\-\-\-\-\-\-\-\-\-\-\-D\-\-\-E#........ buffer, marker cursor limit token .ft P .fi .UNINDENT .UNINDENT .sp Here is an example of a program that reads input file \fBinput.txt\fP in chunks of 4096 bytes and uses EOF rule. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT *) open Bytes let bufsize = 4096 type state = { file: in_channel; yyinput: bytes; mutable yycursor: int; mutable yymarker: int; mutable yylimit: int; mutable token: int; mutable eof: bool; } type status = Ok | Eof | LongLexeme let fill(st: state) : status = if st.eof then Eof else (* Error: lexeme too long. In real life could reallocate a larger buffer. *) if st.token < 1 then LongLexeme else ( (* Shift buffer contents (discard everything up to the current token). *) blit st.yyinput st.token st.yyinput 0 (st.yylimit \- st.token); st.yycursor <\- st.yycursor \- st.token; st.yymarker <\- st.yymarker \- st.token; st.yylimit <\- st.yylimit \- st.token; st.token <\- 0; (* Fill free space at the end of buffer with new data from file. *) let n = input st.file st.yyinput st.yylimit (bufsize \- st.yylimit \- 1) in (* \-1 for sentinel *) st.yylimit <\- st.yylimit + n; if n = 0 then st.eof <\- true; (* end of file *) set st.yyinput st.yylimit \(aq\ex00\(aq; (* append sentinel *) Ok) %{ re2c:YYFN = [\(dqlex;int\(dq, \(dqyyrecord;state\(dq, \(dqcount;int\(dq]; re2c:YYFILL = \(dqfill yyrecord = Ok\(dq; re2c:eof = 0; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; * { \-1 } $ { count } str { lex_loop yyrecord (count + 1) } [ ]+ { lex_loop yyrecord count } %} and lex_loop st count = st.token <\- st.yycursor; lex st count let main () = let fname = \(dqinput\(dq in (* Prepare input file. *) Out_channel.with_open_bin fname (fun oc \-> for i = 1 to bufsize do output_string oc \(dq\(aqqu\ex00tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \(dq done); (* Run lexer on the prepared file. *) In_channel.with_open_bin fname (fun ic \-> let yylimit = bufsize \- 1 in let st = { file = ic; yyinput = create bufsize; yycursor = yylimit; yymarker = yylimit; yylimit = yylimit; token = yylimit; eof = false; } in if not (lex_loop st 0 = 3 * bufsize) then raise (Failure \(dqerror\(dq)); (* Cleanup. *) Sys.remove fname let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS YYFILL with padding .sp In the default case (when EOF rule is not used) \fBYYFILL\fP is a function\-like primitive that accepts a single argument and does not return any value. \fBYYFILL\fP invocation is triggered by condition \fB(YYLIMIT \- YYCURSOR) < n\fP in C pointer API and \fBYYLESSTHAN(n)\fP in generic API. The argument passed to \fBYYFILL\fP is the minimal number of characters that must be supplied. If it fails to do so, \fBYYFILL\fP must not return to the lexer (for that reason it is best implemented as a macro that returns from the calling function on failure). In case of a successful \fBYYFILL\fP invocation the limit position must be set either to one after the last input position in buffer, or to the end of \fBYYMAXFILL\fP padding (in case \fBYYFILL\fP has successfully read at least \fBn\fP characters, but not enough to fill the entire buffer). The pictures below show the relative locations of input positions in buffer before and after \fBYYFILL\fP invocation (\fBYYMAXFILL\fP padding on the second picture is marked with \fB#\fP symbols). .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 Here is an example of a program that reads input file \fBinput.txt\fP in chunks of 4096 bytes and uses bounds\-checking with padding. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT *) open Bytes %{max %} let bufsize = 4096 exception Fill type state = { file: in_channel; yyinput: bytes; mutable yycursor: int; mutable yymarker: int; mutable yylimit: int; mutable token: int; mutable eof: bool; } type status = Ok | Eof | LongLexeme let fill (st: state) (need: int) : status = if st.eof then Eof else (* Error: lexeme too long. In real life could reallocate a larger buffer. *) if st.token < need then LongLexeme else ( (* Shift buffer contents (discard everything up to the current token). *) blit st.yyinput st.token st.yyinput 0 (st.yylimit \- st.token); st.yycursor <\- st.yycursor \- st.token; st.yymarker <\- st.yymarker \- st.token; st.yylimit <\- st.yylimit \- st.token; st.token <\- 0; (* Fill free space at the end of buffer with new data from file. *) let n = input st.file st.yyinput st.yylimit (bufsize \- st.yylimit \- 1) in (* \-1 for sentinel *) st.yylimit <\- st.yylimit + n; (* If read zero characters, this is end of input => add zero padding so that the lexer can access characters at the end of buffer. *) if n = 0 then st.eof <\- true; (* end of file *) for i = 0 to (yymaxfill \- 1) do set st.yyinput (st.yylimit + i) \(aq\ex00\(aq; st.yylimit <\- st.yylimit + yymaxfill done; Ok) %{ re2c:YYFN = [\(dqlex;int\(dq, \(dqyyrecord;state\(dq, \(dqcount;int\(dq]; re2c:YYFILL = \(dqif not (fill yyrecord @@ = Ok) then raise Fill;\(dq; str = [\(aq] ([^\(aq\e\e] | [\e\e][^])* [\(aq]; [\ex00] { (* check that it is the sentinel, not some unexpected null *) if yyrecord.token = yyrecord.yylimit \- yymaxfill then count else \-1 } str { lex_loop yyrecord (count + 1) } [ ]+ { lex_loop yyrecord count } * { \-1 } %} and lex_loop st count = st.token <\- st.yycursor; try lex st count with Fill \-> \-1 let main () = let fname = \(dqinput\(dq in (* Prepare input file. *) Out_channel.with_open_bin fname (fun oc \-> for i = 1 to bufsize do output_string oc \(dq\(aqqu\ex00tes\(aq \(aqare\(aq \(aqfine: \e\e\(aq\(aq \(dq done); (* Run lexer on the prepared file. *) In_channel.with_open_bin fname (fun ic \-> let yylimit = bufsize \- yymaxfill in let st = { file = ic; yyinput = create bufsize; yycursor = yylimit; yymarker = yylimit; yylimit = yylimit; token = yylimit; eof = false; } in if not (lex_loop st 0 = 3 * bufsize) then raise (Failure \(dqerror\(dq)); (* Cleanup. *) Sys.remove fname let _ = main () .ft P .fi .UNINDENT .UNINDENT.UNINDENT .UNINDENT .sp در ادامه مثالی از برنامه‌ای آمده است که فایل ورودی \fBinput.txt\fP را در تکه‌های ۴۰۹۶ بایتی می‌خواند و از قاعده EOF استفاده می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C .SS "YYFILL با پدینگ (YYFILL with padding)" .sp در حالت پیش‌فرض (زمانی که از قاعده EOF استفاده نمی‌شود)، \fBYYFILL\fP یک اولیه شبه‌تابع است که یک آرگومان منفرد می‌پذیرد و هیچ مقداری بازنمی‌گرداند. فراخوانی \fBYYFILL\fP با شرط \fB(YYLIMIT \- YYCURSOR) < n\fP در API اشاره‌گر C و \fBYYLESSTHAN(n)\fP در API عمومی برانگیخته می‌شود. آرگومان ارسالی به \fBYYFILL\fP حداقل تعداد نویسه‌هایی است که باید تأمین شوند. اگر در انجام این کار ناموفق باشد، \fBYYFILL\fP نباید به تحلیل‌گر لغوی بازگردد (به همین دلیل بهتر است با بالا انداختن یک استثنا پیاده‌سازی شود). در صورت فراخوانی موفق \fBYYFILL\fP، موقعیت limit باید یا روی یک موقعیت پس از آخرین موقعیت ورودی در بافر تنظیم شود، یا در انتهای پدینگ \fBYYMAXFILL\fP قرار گیرد (در صورتی که \fBYYFILL\fP حداقل \fBn\fP نویسه را با موفقیت خوانده باشد، اما برای پر کردن کل بافر کافی نباشد). تصاویر زیر مکان‌های نسبی موقعیت‌های ورودی در بافر را قبل و بعد از فراخوانی \fBYYFILL\fP نشان می‌دهند (پدینگ \fBYYMAXFILL\fP در تصویر دوم با نمادهای \fB#\fP مشخص شده است). .UNINDENT .UNINDENT .sp در ادامه مثالی از برنامه‌ای آمده است که فایل ورودی \fBinput.txt\fP را در تکه‌های ۴۰۹۶ بایتی می‌خواند و از بررسی مرز همراه با پدینگ استفاده می‌کند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C .SH "ویژگی‌ها (FEATURES)" .SS "بلوک‌های چندگانه (Multiple blocks)" .sp گاهی لازم است چندین تحلیل‌گر لغوی مرتبط با یکدیگر داشته باشیم (برای مثال، اگر یک ماشین حالت سطح‌بالا وجود داشته باشد که بین حالت‌های تحلیل‌گر لغوی جابه‌جا شود). این ساختار را می‌توان با استفاده از چندین بلوک متصل re2ocaml پیاده‌سازی کرد. گزینه دیگر استفاده از \fI%شرایط شروع (start conditions)\fP\& است. .sp پیاده‌سازی اتصالات بین بلوک‌ها به زبان مقصد بستگی دارد. در زبان‌هایی که دارای دستور \fBgoto\fP هستند (مانند C/C++ و Go) می‌توان تمام بلوک‌ها را درون یک تابع قرار داد، به‌طوری که پیش از هر یک از آن‌ها یک برچسب (label) قرار گیرد. انتقال از یک بلوک به بلوک دیگر یک \fBgoto\fP ساده است. در زبان‌هایی که فاقد دستور \fBgoto\fP هستند، استفاده از یک حلقه همراه با switch روی یک متغیر وضعیت ضروری است، یا اینکه می‌توان هر بلوک را در یک تابع کپسوله‌سازی کرد و از فراخوانی توابع بهره برد. .sp مثال زیر از چندین بلوک برای تجزیه اعداد باینری (مبنای ۲)، اکتال (مبنای ۸)، ده‌دهی (مبنای ۱۰) و هگزادسیمال (مبنای ۱۶) استفاده می‌کند. هر مبنا بلوک مخصوص به خود را دارد. بلوک اولیه، مبنا را مشخص کرده و کار را به بلوک‌های دیگر ارجاع می‌دهد. پیکربندی‌های مشترک در یک بلوک مجزا در ابتدای برنامه تعریف شده‌اند؛ این پیکربندی‌ها توسط سایر بلوک‌ها به ارث برده می‌شوند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT \-i *) open Int64 open Option open String type state = { yyinput: string; mutable yycursor: int; mutable yymarker: int; } let add (num: int option) (dgt: int) (base: int) : int option = match num with | None \-> None | Some n \-> let n\(aq = add (mul (of_int n) (of_int base)) (of_int dgt) in if n\(aq > (of_int32 Int32.max_int) then None else Some (to_int n\(aq) %{ re2c:yyrecord = \(dqst\(dq; re2c:yyfill:enable = 0; %} %{local re2c:YYFN = [\(dqparse_bin;int option\(dq, \(dqst;state\(dq, \(dqnum;int option\(dq]; [01] { parse_bin st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 48) 2) } * { num } %} %{local re2c:YYFN = [\(dqparse_oct;int option\(dq, \(dqst;state\(dq, \(dqnum;int option\(dq]; [0\-7] { parse_oct st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 48) 8) } * { num } %} %{local re2c:YYFN = [\(dqparse_dec;int option\(dq, \(dqst;state\(dq, \(dqnum;int option\(dq]; [0\-9] { parse_dec st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 48) 10) } * { num } %} %{local re2c:YYFN = [\(dqparse_hex;int option\(dq, \(dqst;state\(dq, \(dqnum;int option\(dq]; [0\-9] { parse_hex st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 48) 16) } [a\-f] { parse_hex st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 87) 16) } [A\-F] { parse_hex st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 55) 16) } * { num } %} %{local re2c:YYFN = [\(dqparse;int option\(dq, \(dqst;state\(dq]; \(aq0b\(aq / [01] { parse_bin st (Some 0) } \(dq0\(dq { parse_oct st (Some 0) } \(dq\(dq / [1\-9] { parse_dec st (Some 0) } \(aq0x\(aq / [0\-9a\-fA\-F] { parse_hex st (Some 0) } * { None } %} let test (yyinput: string) (result: int option) = let st = {yyinput = yyinput; yycursor = 0; yymarker = 0} in if not (parse st = result) then raise (Failure \(dqerror\(dq) let main () = test \(dq\ex00\(dq None; test \(dq1234567890\ex00\(dq (Some 1234567890); test \(dq0b1101\ex00\(dq (Some 13); test \(dq0x7Fe\ex00\(dq (Some 2046); test \(dq0644\ex00\(dq (Some 420); test \(dq9999999999\ex00\(dq None let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "شرایط شروع (Start conditions)" .sp شرایط شروع با گزینه \fB\-\-start\-conditions\fP فعال می‌شوند. آن‌ها روشی برای کدگذاری چندین اتوماتای مرتبط با یکدیگر در یک بلوک re2ocaml یکسان ارائه می‌دهند. .sp هر شرط متناظر با یک اتوماتای منفرد است و یک نام یکتا دارد که توسط کاربر مشخص می‌شود و یک شماره داخلی یکتا که توسط re2ocaml تعریف می‌گردد. این شماره‌ها برای جابه‌جایی میان شرایط استفاده می‌شوند: کد تولیدشده از سازوکارهای اولیه \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 کدی که re2ocaml برای شرایط تولید می‌کند بستگی به این دارد که re2ocaml از رویکرد goto/label استفاده می‌کند یا رویکرد loop/switch برای کدگذاری اتوماتا. .sp در زبان‌هایی که دارای دستور \fBgoto\fP هستند (مانند C/C++ و Go)، شرایط به‌طور طبیعی به صورت بلوک‌هایی از کد با پیشوند برچسب‌هایی به شکل \fByyc_\fP پیاده‌سازی می‌شوند، که در آن \fBcond\fP نام شرط است (پیشوند برچسب را می‌توان با \fBre2c:cond:prefix\fP تغییر داد). جابه‌جایی‌ها میان شرایط با استفاده از \fBgoto\fP و برچسب‌های شرط پیاده‌سازی می‌شوند. پیش از تمام شرایط، re2ocaml یک switch اولیه روی \fBYYGETSTATE\fP تولید می‌کند که به وضعیت شروع شرط کنونی پرش می‌کند. قواعد میان‌بر \fB:=>\fP از switch اولیه عبور کرده و مستقیماً به شرط مشخص‌شده پرش می‌کنند (می‌توان از \fBre2c:cond:goto\fP برای تغییر رفتار پیش‌فرض استفاده کرد). قواعد دارای کنش‌های معنایی به‌طور خودکار به شرط بعدی پرش نمی‌کنند؛ این کار باید توسط کد کنش تعریف‌شده توسط کاربر انجام شود. .sp در زبان‌هایی که دستور \fBgoto\fP را ندارند (مانند Rust)، ابزار re2ocaml از متغیر \fByystate\fP برای ذخیره شماره‌های شرایط استفاده مجدد می‌کند. هر شرط یک شناسه عددی برابر با شماره وضعیت شروع خود دریافت می‌کند، و جابه‌جایی بین شرایط هیچ تفاوتی با switch میان وضعیت‌های DFA در یک شرط واحد ندارد. نیازی به یک switch اولیه جداگانه برای شرایط وجود ندارد. (از آنجا که رویکرد یکسانی برای پیاده‌سازی وضعیت‌های قابل ذخیره استفاده می‌شود، در صورتی که هر دو قابلیت وضعیت‌های قابل ذخیره و شرایط استفاده شوند، \fBYYGETCOND\fP/\fBYYSETCOND\fP زائد خواهند بود). .sp برنامه زیر از شرایط شروع برای تجزیه اعداد دودویی، هشت‌هشتی، ده‌دهی و شانزده‌شانزدهی استفاده می‌کند. یک بلوک منفرد وجود دارد که در آن هر مبنا شرط مخصوص به خود را دارد و شرط اولیه به همه آن‌ها متصل است. متغیر تعریف‌شده توسط کاربر با نام \fBcond\fP شماره شرط کنونی را ذخیره می‌کند؛ این متغیر با شماره شرط اولیه که توسط بلوک \fBconditions\fP تولید شده است، مقداردهی اولیه می‌شود. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT \-ci *) open Int64 open Option open String %{conditions %} type state = { yyinput: string; mutable yycursor: int; mutable yymarker: int; mutable yycond: yycondtype; } let add (num: int option) (dgt: int) (base: int) : int option = match num with | None \-> None | Some n \-> let n\(aq = add (mul (of_int n) (of_int base)) (of_int dgt) in if n\(aq > (of_int32 Int32.max_int) then None else Some (to_int n\(aq) %{ re2c:YYFN = [\(dqparse;int option\(dq, \(dqst;state\(dq, \(dqnum;int option\(dq]; re2c:yyrecord = \(dqst\(dq; re2c:yyfill:enable = 0; \(aq0b\(aq / [01] :=> bin \(dq0\(dq :=> oct \(dq\(dq / [1\-9] :=> dec \(aq0x\(aq / [0\-9a\-fA\-F] :=> hex * { None } [01] { yyfnbin st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 48) 2) } [0\-7] { yyfnoct st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 48) 8) } [0\-9] { yyfndec st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 48) 10) } [0\-9] { yyfnhex st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 48) 16) } [a\-f] { yyfnhex st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 87) 16) } [A\-F] { yyfnhex st (add num (Char.code st.yyinput.[st.yycursor \- 1] \- 55) 16) } * { num } %} let test (yyinput: string) (result: int option) = let st = {yyinput = yyinput; yycursor = 0; yymarker = 0; yycond = YYC_init} in if not (parse st (Some 0) = result) then raise (Failure \(dqerror\(dq) let main () = test \(dq\ex00\(dq None; test \(dq1234567890\ex00\(dq (Some 1234567890); test \(dq0b1101\ex00\(dq (Some 13); test \(dq0x7Fe\ex00\(dq (Some 2046); test \(dq0644\ex00\(dq (Some 420); test \(dq9999999999\ex00\(dq None let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "وضعیت قابل ذخیره‌سازی (Storable state)" .sp با گزینه \fB\-\-storable\-state\fP، ابزار re2ocaml تحلیل‌گر لغوی‌ای تولید می‌کند که می‌تواند وضعیت فعلی خود را ذخیره کند، به فراخواننده بازگردد، و بعداً عملیات را دقیقاً از همان‌جایی که متوقف شده بود از سر بگیرد. حالت پیش‌فرض عملکرد در re2ocaml یک مدل «کششی» (\(dqpull\(dq) است که در آن تحلیل‌گر لغوی هر زمان که نیاز داشته باشد، ورودی بیشتری را «می‌کشد» (دریافت می‌کند). این امر ممکن است در مواردی که ورودی به‌صورت تکه‌تکه در دسترس قرار می‌گیرد غیرقابل قبول باشد (برای مثال، اگر تحلیل‌گر لغوی توسط تجزیه‌کننده (parser) فراخوانی شود، یا اگر برنامه تحلیل‌گر لغوی از طریق پروتکل سوکت با برنامه دیگری ارتباط برقرار کند که باید پیش از ارسال پیام بعدی، منتظر پاسخ از سوی تحلیل‌گر لغوی بماند). ویژگی وضعیت ذخیره‌پذیر دقیقاً برای چنین مواردی در نظر گرفته شده است: این ویژگی امکان تولید تحلیل‌گرهای لغوی را فراهم می‌کند که در یک مدل «رانشی» (\(dqpush\(dq) کار می‌کنند. هنگامی که تحلیل‌گر لغوی به ورودی بیشتری نیاز دارد، وضعیت خود را ذخیره کرده و به فراخواننده بازمی‌گردد. بعداً، زمانی که ورودی بیشتری در دسترس قرار گرفت، فراخواننده تحلیل‌گر لغوی را دقیقاً از جایی که متوقف شده بود از سر می‌گیرد. در مقایسه با مدل «کششی»، چند تغییر ضروری است: .INDENT 0.0 .IP \(bu 2 اولیه‌های \fBYYSETSTATE()\fP و \fBYYGETSTATE(state)\fP را تعریف کنید. .IP \(bu 2 متغیرهای \fByych\fP، \fByyaccept\fP (در صورت استفاده) و \fBstate\fP را به‌عنوان بخشی از وضعیت ماندگار (persistent) تحلیل‌گر لغوی تعریف کنید. متغیر \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) ممکن است کار نکند زیرا مشخص نیست چه زمانی باید فاصله‌گذاری را اضافه کرد: انتهای فعلی ورودی ممکن است انتهای نهایی ورودی نباشد، و اضافه کردن زودهنگام فاصله‌گذاری ممکن است یک لکسم (lexeme) حریصانه نیمه‌خوانده‌شده را قطع کند. علاوه بر این، به دلیل منطق سطح بالای برنامه، دریافت ورودی بیشتر ممکن است به پردازش لکسم انتهای بافر وابسته باشد (که از پیش به دلیل شرط پایان ورودی مسدود شده است). .UNINDENT .sp در اینجا مثالی از یک تحلیل‌گر لغوی مدل «رانشی» آورده شده است که خواندن بسته‌ها از یک سوکت را شبیه‌سازی می‌کند. تحلیل‌گر لغوی تا زمانی که با پایان ورودی مواجه شود حلقه می‌زند و به تابع فراخواننده بازمی‌گردد. تابع فراخواننده با «ارسال» بسته بعدی، ورودی بیشتری فراهم کرده و تحلیل لغوی را از سر می‌گیرد. این فرایند زمانی که تمام بسته‌ها ارسال شوند، یا خطایی رخ دهد، متوقف می‌شود. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT \-fi *) open Bytes (* Use a small buffer to cover the case when a lexeme doesn\(aqt fit. In real world use a larger buffer. *) let bufsize = 10 let debug = false let log format = (if debug then Printf.eprintf else Printf.ifprintf stderr) format type state = { file: in_channel; yyinput: bytes; mutable yycursor: int; mutable yymarker: int; mutable yylimit: int; mutable token: int; mutable yystate: int; mutable recv: int; } type status = End | Ready | Waiting | BadPacket | BigPacket let fill(st: state) : status = (* Error: lexeme too long. In real life could reallocate a larger buffer. *) if st.token < 1 then BigPacket else ( (* Shift buffer contents (discard everything up to the current token). *) blit st.yyinput st.token st.yyinput 0 (st.yylimit \- st.token); st.yycursor <\- st.yycursor \- st.token; st.yymarker <\- st.yymarker \- st.token; st.yylimit <\- st.yylimit \- st.token; st.token <\- 0; (* Fill free space at the end of buffer with new data from file. *) let n = In_channel.input st.file st.yyinput st.yylimit (bufsize \- st.yylimit \- 1) in st.yylimit <\- st.yylimit + n; set st.yyinput st.yylimit \(aq\ex00\(aq; (* append sentinel *) Ready) %{ re2c:YYFN = [\(dqlex;status\(dq, \(dqyyrecord;state\(dq]; re2c:YYFILL = \(dqWaiting\(dq; re2c:eof = 0; packet = [a\-z]+[;]; * { BadPacket } $ { End } packet { yyrecord.recv <\- yyrecord.recv + 1; lex_loop yyrecord } %} and lex_loop st = st.token <\- st.yycursor; lex st let test (packets: string list) (sts: status) = let fname = \(dqpipe\(dq in let oc = Out_channel.open_bin fname in let ic = In_channel.open_bin fname in let yylimit = bufsize \- 1 in let st = { file = ic; (* Sentinel (at \(gayylimit\(ga offset) is set to null, which triggers YYFILL. *) yyinput = create bufsize; yycursor = yylimit; yymarker = yylimit; yylimit = yylimit; token = yylimit; yystate = \-1; recv = 0; } in let rec loop packets = match lex_loop st with | End \-> log \(dqdone: got %d packets\en\(dq st.recv; End | Waiting \-> log \(dqwaiting...\en\(dq; let packets\(aq = match packets with | [] \-> [] | p :: ps \-> log \(dqsent packet \(aq%s\(aq\en\(dq p; Out_channel.output_string oc p; Out_channel.flush oc; (* without \(gaflush\(ga write happens too late *) ps in (match fill st with | BigPacket \-> log \(dqerror: packet too big\en\(dq; BigPacket | Ready \-> loop packets\(aq | _ \-> raise (Failure \(dqunexpected status after fill\(dq)) | BadPacket \-> log \(dqerror: ill\-formed packet\en\(dq; BadPacket | _ \-> raise (Failure \(dqunexpected status\(dq) in if not (loop packets = sts) then raise (Failure \(dqerror\(dq); In_channel.close ic; Out_channel.close oc; Sys.remove fname let main () = test [] End; test [\(dqzero;\(dq; \(dqone;\(dq; \(dqtwo;\(dq; \(dqthree;\(dq; \(dqfour;\(dq] End; test [\(dqzer0;\(dq] BadPacket; test [\(dqgoooooooooogle;\(dq] BigPacket let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "بلوک‌های قابل استفاده مجدد (Reusable blocks)" .sp بلوک‌های قابل استفاده مجدد با ساختار \fB/*!rules:re2c[:] ... */\fP یا \fB%{rules[:] ... %}\fP می‌توانند به هر تعداد بار مجدداً استفاده شوند و با سایر بلوک‌های re2ocaml ترکیب گردند. بخش \fB\fP اختیاری است. یک بلوک قوانین (rules block) می‌تواند در یک بلوک یا دستور \fBuse\fP به کار گرفته شود. کد مربوط به یک بلوک قوانین، در هر نقطه استفاده تولید می‌شود. .sp بلوک‌های use با \fB/*!use:re2c[:] ... */\fP یا \fB%{use[:] ... %}\fP\& تعریف می‌شوند. شناسه \fB\fP اختیاری است: اگر مشخص نشده باشد، بلوک قوانین مرتبط، نزدیک‌ترین بلوک قبلی خواهد بود (خواه نام‌گذاری‌شده یا بدون نام). یک بلوک use می‌تواند تعاریف نام‌گذاری‌شده، پیکربندی‌ها و قوانین اختصاصی خود را اضافه کند. یک کاربرد مهم برای بلوک‌های use، تحلیل‌گر لغوی (lexer) با پشتیبانی از چندین کدگذاری ورودی است: همان بلوک قوانین چندین بار با پیکربندی‌های مختص هر کدگذاری مجدداً استفاده می‌شود (مثال زیر را ببینید). .sp دستور درون‌بلوکی \fB!use:;\fP می‌تواند از داخل یک بلوک re2ocaml استفاده شود. این دستور، بلوک ارجاع‌داده‌شده \fB\fP را با بلوک فعلی ادغام می‌کند. اگر برخی از قوانین و پیکربندی‌های ادغام‌شده با موارد تعریف‌شده قبلی هم‌پوشانی داشته باشند، تداخل‌ها به روش معمول حل می‌شوند: نخستین قاعده اولویت دارد، و آخرین پیکربندی بر موارد پیشین ارجحیت می‌یابد (آن‌ها را رونویسی می‌کند). یک استثنا قوانین ویژه \fB*\fP، \fB$\fP و (در حالت شرطی) \fB\fP هستند که برای آن‌ها تعریف محلی بلوک بر هرگونه تعریف به ارث‌رسیده برتری دارد. دستور use امکان ترکیب بلوک‌های مختلف re2ocaml را با یکدیگر در یک بلوک واحد فراهم می‌سازد (مثال زیر را ببینید). .sp بلوک‌های نام‌گذاری‌شده و دستور درون‌بلوکی use در نگارش 2.2 از re2ocaml اضافه شدند. از آن نگارش به بعد، استفاده از بلوک‌های قابل استفاده مجدد به‌طور پیش‌فرض مجاز است (نیازی به گزینه خاصی نیست). پیش از نگارش 2.2، حالت استفاده مجدد با گزینه \fB\-r \-\-reusable\fP فعال می‌شد. پیش از نگارش 1.2، بلوک‌های قابل استفاده مجدد نمی‌توانستند با بلوک‌های معمولی ترکیب شوند. .SS "مثالی از دستورالعمل \fB!use\fP" .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $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. *) open String type answer = Color | Fish | Dunno type state = { yyinput: string; mutable yycursor: int; mutable yymarker: int; } %{rules:colors * { raise (Failure \(dqah\(dq); } \(dqred\(dq | \(dqsalmon\(dq | \(dqmagenta\(dq { Color } %} %{rules:fish * { raise (Failure \(dqoh\(dq); } \(dqhaddock\(dq | \(dqsalmon\(dq | \(dqeel\(dq { Fish } %} %{ re2c:YYFN = [\(dqlex;answer\(dq, \(dqyyrecord;state\(dq]; re2c:yyfill:enable = 0; !use:fish; !use:colors; * { Dunno } // overrides inherited \(aq*\(aq rules %} let test(str, ans) = let st = {yyinput = str; yycursor = 0; yymarker = 0} in if not (lex st = ans) then raise (Failure \(dqerror\(dq) let main () = test(\(dqsalmon\(dq, Fish); test(\(dqwhat?\(dq, Dunno) let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "مثالی از یک بلوک \fB/*!use:re2c ... */\fP" .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $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. *) open Array type \(aqa state = { yyinput: \(aqa array; mutable yycursor: int; mutable yymarker: int; } %{rules re2c:yyfill:enable = 0; \(dq∀x ∃y\(dq { Some yyrecord.yycursor } * { None } %} %{use re2c:YYFN = [\(dqlex8;int option\(dq, \(dqyyrecord;char state\(dq]; re2c:encoding:utf8 = 1; %} %{use re2c:YYFN = [\(dqlex32;int option\(dq, \(dqyyrecord;int state\(dq]; re2c:encoding:utf32 = 1; %} let main() = let st8 = { yyinput = [|\(aq\exe2\(aq; \(aq\ex08\(aq; \(aq\ex80\(aq; \(aq\ex78\(aq; \(aq\ex20\(aq; \(aq\exe2\(aq; \(aq\ex88\(aq; \(aq\ex83\(aq; \(aq\ex79\(aq|]; yycursor = 0; yymarker = 0; } in if not (lex8 st8 = Some (Array.length st8.yyinput)) then raise (Failure \(dqerror\(dq); let st32 = { yycursor = 0; yymarker = 0; yyinput = [|0x2200; 0x78; 0x20; 0x2203; 0x79|]; } in if not (lex32 st32 = Some (Array.length st32.yyinput)) then raise (Failure \(dqerror\(dq); .ft P .fi .UNINDENT .UNINDENT .SS "استخراج زیرتطابق (Submatch extraction)" .sp ابزار re2ocaml دو گزینه برای استخراج زیرتطابق دارد. .INDENT 0.0 .TP .B \fBTags\fP نخستین گزینه، استفاده از \fItags\fP (برچسب‌های) مستقل به شکل \fB@stag\fP یا \fB#mtag\fP است، که در آن \fBstag\fP و \fBmtag\fP نام‌های دلخواه تعریف‌شده توسط کاربر هستند. برچسب‌ها با گزینهٔ \fB\-T \-\-tags\fP یا پیکربندی \fBre2c:tags = 1\fP فعال می‌شوند. از نظر معنایی، برچسب‌ها نشانگرهای موقعیت هستند: آن‌ها می‌توانند در هر کجای یک عبارت منظم درج شوند و به موقعیت متناظر (یا چندین موقعیت) در رشتهٔ ورودی پیوند می‌خورند. \fIS\-tags\fP به آخرین موقعیت تطبیق‌یافته متصل می‌شوند و \fIm\-tags\fP به فهرستی از موقعیت‌ها پیوند می‌خورند (آن‌ها ممکن است در زیرعبارت‌های تکرار استفاده شوند، جایی که یک موقعیت واحد در یک عبارت منظم با چندین موقعیت در رشتهٔ ورودی متناظر است). تمام برچسب‌ها باید توسط کاربر تعریف شوند؛ خواه به صورت دستی یا با کمک بلوک‌های \fBsvars\fP و \fBmvars\fP. اگر بیش از یک روش برای تطبیق برچسب‌ها با ورودی وجود داشته باشد، ابهام با استفاده از راهبرد رفع ابهام حریصانهٔ چپ‌ترین (leftmost greedy) برطرف می‌شود. .TP .B \fBCaptures\fP گزینهٔ دوم استفاده از \fIcapturing groups\fP (گروه‌های ضبط) است\&. آن‌ها با گزینهٔ \fB\-\-captures\fP یا پیکربندی \fBre2c:captures = 1\fP فعال می‌شوند. دو گونه برای سیاست‌های مختلف رفع ابهام وجود دارد؛ \fB\-\-leftmost\-captures\fP (پیش‌فرض) برای سیاست حریصانهٔ چپ‌ترین، و \fB\-\-posix\-captures\fP برای سیاست طولانی‌ترین تطابق POSIX است. در این حالت تمام زیرعبارت‌های درون پرانتز گروه‌های ضبط در نظر گرفته می‌شوند و می‌توان از علامت تعجب (bang) برای علامت‌گذاری گروه‌های غیرقابل‌ضبط استفاده کرد: \fB(! ... )\fP\&. با گزینهٔ \fB\-\-invert\-captures\fP یا پیکربندی \fBre2c:invert\-captures = 1\fP معنای علامت تعجب معکوس می‌شود. تعداد گروه‌ها برای قاعدهٔ تطبیق‌یافته در متغیری به نام \fByynmatch\fP ذخیره می‌شود (کل عبارت منظم گروه شمارهٔ صفر است)، و نتایج زیرتطابق در آرایهٔ \fByypmatch\fP ذخیره می‌شوند. هر دو متغیر \fByynmatch\fP و \fByypmatch\fP باید توسط کاربر تعریف شوند، و اندازهٔ \fByypmatch\fP باید حداقل \fB[yynmatch * 2]\fP باشد\&. از بلوک \fBmaxnmatch\fP برای تعریف \fBYYMAXNMATCH\fP استفاده کنید، ثابتی که برابر با بیشترین مقدار \fByynmatch\fP در میان تمام قواعد است. .TP .B \fBCaptvars\fP روش دیگر برای استفاده از گروه‌های ضبط، گزینهٔ \fB\-\-captvars\fP یا پیکربندی \fBre2c:captvars = 1\fP است. تنها تفاوت با \fB\-\-captures\fP در نحوهٔ ذخیره‌سازی نتایج زیرتطابق در کد تولیدشده است: به‌جای \fByynmatch\fP و \fByypmatch\fP، ابزار re2ocaml متغیرهای \fByytl\fP و \fByytr\fP را برای \fIk\fP\-امین گروه ضبط تولید می‌کند (کاربر باید این متغیرها را با استفاده از یک بلوک \fBsvars\fP اعلان کند). گروه‌های ضبط با متغیر از دو سیاست رفع ابهام پشتیبانی می‌کنند: \fB\-\-leftmost\-captvars\fP یا \fBre2c:leftmost\-captvars = 1\fP برای سیاست حریصانهٔ چپ‌ترین (حالت پیش‌فرض) و \fB\-\-posix\-captvars\fP یا \fBre2c:posix\-captvars\fP برای سیاست طولانی‌ترین تطابق POSIX. .UNINDENT .sp در پشت صحنه، تمام این گزینه‌ها به برچسب‌ها و \fI\%Tagged Deterministic Finite Automata with Lookahead\fP ترجمه می‌شوند\&. ایدهٔ اصلی TDFA به حداقل رساندن بار اضافی (overhead) در استخراج زیرتطابق است. در حالت فرین (حد نهایی)، اگر هیچ برچسب یا گروه ضبطی در عبارت منظم نباشد، TDFA صرفاً یک DFA معمولی است. اگر تعداد برچسب‌ها در حد معتدل باشد، بار اضافی به سختی محسوس خواهد بود. اتوماتای TDFA تولیدشده از تعدادی \fItag variables\fP (متغیرهای برچسب) استفاده می‌کند که مستقیماً به برچسب‌ها نگاشت نمی‌شوند: یک متغیر واحد ممکن است برای برچسب‌های متفاوتی استفاده شود، و یک برچسب ممکن است برای نگه‌داشتن تمام مقادیر ممکن خود به چندین متغیر نیاز داشته باشد. در نهایت، ابهام برطرف می‌شود و برای هر برچسب تنها یک متغیر نهایی باقی می‌ماند. متغیرهای برچسب باید با استفاده از بلوک‌های \fBstags\fP یا \fBmtags\fP تعریف شوند. اگر وضعیت تحلیل‌گر لغوی ذخیره شود، متغیرهای برچسب نیز باید بخشی از آن باشند. آن‌ها همچنین باید توسط \fBYYFILL\fP به‌روزرسانی شوند\&. .sp برچسب‌های S\-tags از عملیات زیر پشتیبانی می‌کنند: .INDENT 0.0 .IP \(bu 2 ذخیرهٔ موقعیت ورودی در یک s\-tag: دستور \fBt = YYCURSOR\fP با API اشاره‌گر C یا یک عملیات تعریف‌شده توسط کاربر \fBYYSTAGP(t)\fP با API عمومی (generic) .IP \(bu 2 ذخیرهٔ مقدار پیش‌فرض در یک s\-tag: دستور \fBt = NULL\fP با API اشاره‌گر C یا یک عملیات تعریف‌شده توسط کاربر \fBYYSTAGN(t)\fP با API عمومی .IP \(bu 2 رونوشت از یک s\-tag به دیگری: \fBt1 = t2\fP .UNINDENT .sp برچسب‌های M\-tags از عملیات زیر پشتیبانی می‌کنند: .INDENT 0.0 .IP \(bu 2 الحاق موقعیت ورودی به یک m\-tag: عملیات تعریف‌شده توسط کاربر \fBYYMTAGP(t)\fP با هر دو API پیش‌فرض و عمومی .IP \(bu 2 الحاق مقدار پیش‌فرض به یک m\-tag: عملیات تعریف‌شده توسط کاربر \fBYYMTAGN(t)\fP با هر دو API پیش‌فرض و عمومی .IP \(bu 2 رونوشت از یک m\-tag به دیگری: \fBt1 = t2\fP .UNINDENT .sp برچسب‌های S\-tag را می‌توان به صورت مقادیر اسکالر (اشاره‌گرها یا آفست‌ها) پیاده‌سازی کرد. برچسب‌های M\-tag به نمایش پیچیده‌تری نیاز دارند، زیرا باید دنباله‌ای از مقادیر برچسب را ذخیره کنند. ابتدایی‌ترین و ناکارآمدترین نمایش برای یک m\-tag، یک لیست (آرایه، بردار) از مقادیر برچسب است؛ نمایشی کارآمدتر، ذخیرهٔ تمام m\-tagها در یک درخت پیشوندی (prefix\-tree) است که به صورت آرایه‌ای از گره‌های \fB(v, p)\fP نشان داده می‌شود، که در آن \fBv\fP مقدار برچسب و \fBp\fP اشاره‌گری به گره والد است. .sp در اینجا یک مثال ساده از به‌کارگیری s\-tagها برای تجزیهٔ نگارش‌های معنایی (semantic versions) متشکل از سه جزء عددی آورده شده است: major، minor، patch (مورد آخر اختیاری است). برای یک مثال پیچیده‌تر که از \fBYYFILL\fP استفاده می‌کند، بخش زیر را ببینید\&. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT *) open String type state = { yyinput: string; mutable yycursor: int; mutable yymarker: int; (* Final tag variables available in semantic action. *) %{svars format = \(dq\en\etmutable @@{tag}: int;\(dq; %} (* Intermediate tag variables used by the lexer (must be autogenerated). *) %{stags format = \(dq\en\etmutable @@{tag}: int;\(dq; %} } type semver = { major: int; minor: int; patch: int; } let s2n (str: string) (i1: int) (i2: int) : int = let rec f s i j n = if i >= j then n else f s (i + 1) j (n * 10 + Char.code s.[i] \- 48) in f str i1 i2 0 %{local re2c:YYFN = [\(dqparse;semver option\(dq, \(dqst;state\(dq]; re2c:yyrecord = \(dqst\(dq; re2c:tags = 1; re2c:yyfill:enable = 0; num = [0\-9]+; @t1 num @t2 \(dq.\(dq @t3 num @t4 (\(dq.\(dq @t5 num)? [\ex00] { Some { major = s2n st.yyinput st.t1 st.t2; minor = s2n st.yyinput st.t3 st.t4; patch = if st.t5 = \-1 then 0 else s2n st.yyinput st.t5 (st.yycursor \- 1) } } * { None } %} let test (str: string) (result: semver option) = let st = { yyinput = str; yycursor = 0; yymarker = 0; %{svars format = \(dq\en\et\et@@{tag} = \-1;\(dq; %} %{stags format = \(dq\en\et\et@@{tag} = \-1;\(dq; %} } in if not (parse st = result) then raise (Failure \(dqerror\(dq) let main () = test \(dq23.34\(dq (Some {major = 23; minor = 34; patch = 0}); test \(dq1.2.99999\(dq (Some {major = 1; minor = 2; patch = 99999}); test \(dq1.a\(dq None let _ = main () .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 (* re2ocaml $INPUT \-o $OUTPUT *) open Bytes let bufsize = 4096 type state = { file: in_channel; yyinput: bytes; mutable yycursor: int; mutable yymarker: int; mutable yylimit: int; mutable token: int; mutable eof: bool; (* Final tag variables available in semantic action. *) %{svars format = \(dq\en\etmutable @@{tag}: int;\(dq; %} (* Intermediate tag variables used by the lexer (must be autogenerated). *) %{stags format = \(dq\en\etmutable @@{tag}: int;\(dq; %} } type status = Ok | Eof | LongLexeme type semver = { major: int; minor: int; patch: int; } let s2n (str: bytes) (i1: int) (i2: int) : int = let rec f s i j n = if i >= j then n else f s (i + 1) j (n * 10 + Char.code (get s i) \- 48) in f str i1 i2 0 let fill(st: state) : status = if st.eof then Eof else (* Error: lexeme too long. In real life could reallocate a larger buffer. *) if st.token < 1 then LongLexeme else ( (* Shift buffer contents (discard everything up to the current token). *) blit st.yyinput st.token st.yyinput 0 (st.yylimit \- st.token); st.yycursor <\- st.yycursor \- st.token; st.yymarker <\- st.yymarker \- st.token; st.yylimit <\- st.yylimit \- st.token; %{stags format = \(dq\en\etst.@@ <\- if st.@@ = \-1 then \-1 else st.@@ \- st.token;\(dq; %} st.token <\- 0; (* Fill free space at the end of buffer with new data from file. *) let n = input st.file st.yyinput st.yylimit (bufsize \- st.yylimit \- 1) in (* \-1 for sentinel *) st.yylimit <\- st.yylimit + n; if n = 0 then st.eof <\- true; (* end of file *) set st.yyinput st.yylimit \(aq\ex00\(aq; (* append sentinel *) Ok) %{ re2c:YYFN = [\(dqlex;(semver list) option\(dq, \(dqst;state\(dq, \(dqvers;semver list\(dq]; re2c:YYFILL = \(dqfill st = Ok\(dq; re2c:yyrecord = \(dqst\(dq; re2c:tags = 1; re2c:eof = 0; num = [0\-9]+; @t1 num @t2 \(dq.\(dq @t3 num @t4 (\(dq.\(dq @t5 num)? [\en] { let ver = { major = s2n st.yyinput st.t1 st.t2; minor = s2n st.yyinput st.t3 st.t4; patch = if st.t5 = \-1 then 0 else s2n st.yyinput st.t5 (st.yycursor \- 1) } in lex_loop st (ver :: vers) } $ { Some (List.rev vers) } * { None } %} and lex_loop st vers = st.token <\- st.yycursor; lex st vers let main () = let fname = \(dqinput\(dq in (* Prepare input file. *) Out_channel.with_open_bin fname (fun oc \-> for i = 1 to bufsize do output_string oc \(dq1.22.333\en\(dq done); (* Construct the expected result to compare against. *) let expect = Some (List.init bufsize (fun _ \-> {major = 1; minor = 22; patch = 333;})) in (* Run lexer on the prepared file. *) In_channel.with_open_bin fname (fun ic \-> let yylimit = bufsize \- 1 in let st = { file = ic; yyinput = create bufsize; yycursor = yylimit; yymarker = yylimit; yylimit = yylimit; token = yylimit; eof = false; %{svars format = \(dq\en\et\et@@{tag} = \-1;\(dq; %} %{stags format = \(dq\en\et\et@@{tag} = \-1;\(dq; %} } in if (lex_loop st [] <> expect) then raise (Failure \(dqerror\(dq)); (* Cleanup. *) Sys.remove fname let _ = main () .ft P .fi .UNINDENT .UNINDENT .sp در اینجا مثالی از به‌کارگیری گروه‌های تسخیر (capturing groups) برای تجزیهٔ نگارش‌های معنایی (semantic versions) آورده شده است. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT *) open String type state = { yyinput: string; mutable yycursor: int; mutable yymarker: int; (* Final tag variables available in semantic action. *) %{svars format = \(dq\en\etmutable @@{tag}: int;\(dq; %} (* Intermediate tag variables used by the lexer (must be autogenerated). *) %{stags format = \(dq\en\etmutable @@{tag}: int;\(dq; %} } type semver = { major: int; minor: int; patch: int; } let s2n (str: string) (i1: int) (i2: int) : int = let rec f s i j n = if i >= j then n else f s (i + 1) j (n * 10 + Char.code s.[i] \- 48) in f str i1 i2 0 %{local re2c:YYFN = [\(dqparse;semver option\(dq, \(dqst;state\(dq]; re2c:yyrecord = \(dqst\(dq; re2c:captvars = 1; re2c:yyfill:enable = 0; num = [0\-9]+; (num) \(dq.\(dq (num) (\(dq.\(dq num)? [\ex00] { Some { major = s2n st.yyinput st.yytl1 st.yytr1; minor = s2n st.yyinput st.yytl2 st.yytr2; patch = if st.yytl3 = \-1 then 0 else s2n st.yyinput (st.yytl3 + 1) st.yytr3 } } * { None } %} let test (str: string) (result: semver option) = let st = { yyinput = str; yycursor = 0; yymarker = 0; %{svars format = \(dq\en\et\et@@{tag} = \-1;\(dq; %} %{stags format = \(dq\en\et\et@@{tag} = \-1;\(dq; %} } in if not (parse st = result) then raise (Failure \(dqerror\(dq) let main () = test \(dq23.34\(dq (Some {major = 23; minor = 34; patch = 0}); test \(dq1.2.99999\(dq (Some {major = 1; minor = 2; patch = 99999}); test \(dq1.a\(dq None let _ = main () .ft P .fi .UNINDENT .UNINDENT .sp در اینجا مثالی از به‌کارگیری m\-tags برای تجزیهٔ نگارشی با تعداد متغیر مؤلفه‌ها آورده شده است. متغیرهای برچسب در یک trie ذخیره می‌شوند. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT *) open String type state = { yyinput: string; mutable yycursor: int; mutable yymarker: int; (* Final tag variables available in semantic action. *) %{svars format = \(dq\en\etmutable @@{tag}: int;\(dq; %} %{mvars format = \(dq\en\etmutable @@{tag}: int list;\(dq; %} (* Intermediate tag variables used by the lexer (must be autogenerated). *) %{stags format = \(dq\en\etmutable @@{tag}: int;\(dq; %} %{mtags format = \(dq\en\etmutable @@{tag}: int list;\(dq; %} } let s2n (str: string) (i1: int) (i2: int) : int = let rec f s i j n = if i >= j then n else f s (i + 1) j (n * 10 + Char.code s.[i] \- 48) in f str i1 i2 0 %{local re2c:YYFN = [\(dqparse;(int list) option\(dq, \(dqst;state\(dq]; re2c:YYMTAGP = \(dq@@ <\- st.yycursor :: @@;\(dq; re2c:YYMTAGN = \(dq\(dq; // alternatively could add \(ga\-1\(ga to the list re2c:yyrecord = \(dqst\(dq; re2c:tags = 1; re2c:yyfill:enable = 0; num = [0\-9]+; @t1 num @t2 (\(dq.\(dq #t3 num #t4)* [\ex00] { let x = s2n st.yyinput st.t1 st.t2 in let xs = List.rev (List.map2 (fun x y \-> s2n st.yyinput x y) st.t3 st.t4) in Some (x :: xs) } * { None } %} let test (str: string) (result: (int list) option) = let st = { yyinput = str; yycursor = 0; yymarker = 0; %{svars format = \(dq\en\et\et@@{tag} = \-1;\(dq; %} %{mvars format = \(dq\en\et\et@@{tag} = [];\(dq; %} %{stags format = \(dq\en\et\et@@{tag} = \-1;\(dq; %} %{mtags format = \(dq\en\et\et@@{tag} = [];\(dq; %} } in if not (parse st = result) then raise (Failure \(dqerror\(dq) let main () = test \(dq1\(dq (Some [1]); test \(dq1.2.3.4.5.6.7\(dq (Some [1; 2; 3; 4; 5; 6; 7;]); test \(dq1.2.\(dq None let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "پشتیبانی از کدگذاری (Encoding support)" .sp درک تفاوت بین \fBنقطه‌های کد (code points)\fP و \fBواحدهای کد (code units)\fP ضروری است\&. یک نقطه کد، شناسه عددی یک نماد است. یک واحد کد، کوچک‌ترین واحد ذخیره‌سازی در متن کدگذاری‌شده است. یک نقطه کد تکی ممکن است با یک یا چند واحد کد نمایش داده شود. در یک کدگذاری با طول ثابت، تمام نقطه‌های کد با تعداد یکسانی از واحدهای کد نشان داده می‌شوند. در یک کدگذاری با طول متغیر، نقطه‌های کد ممکن است با تعداد متفاوتی از واحدهای کد نمایش داده شوند. توجه داشته باشید که قاعده \(dqany\(dq یعنی \fB[^]\fP با هر نقطه کدی تطابق دارد، اما لزوماً با هر واحد کدی تطابق ندارد (تنها راه تطبیق با هر واحد کد صرف‌نظر از نوع کدگذاری، قاعده پیش‌فرض \fB*\fP است). تحلیل‌گر لغوی تولیدشده با جریانی از واحدهای کد کار می‌کند: \fByych\fP یک واحد کد را ذخیره می‌کند و \fBYYCTYPE\fP نوع واحد کد است. از سوی دیگر، عبارت‌های منظم برحسب نقطه‌های کد مشخص می‌شوند. هنگامی که re2ocaml عبارت‌های منظم را به اتوماتا کامپایل می‌کند، نقطه‌های کد را به واحدهای کد ترجمه می‌نماید. این کار معمولاً یک نگاشت ساده نیست: در کدگذاری‌های با طول متغیر، ممکن است یک بازه از یک نقطه کد منفرد به یک گراف پیچیده از واحدهای کد ترجمه شود. کدگذاری‌های زیر پشتیبانی می‌شوند: .INDENT 0.0 .IP \(bu 2 \fBASCII\fP (به‌طور پیش‌فرض فعال است). یک کدگذاری با طول ثابت با فضای کد \fB[0\-255]\fP و نقطه‌های کد و واحدهای کد ۱\-بایتی است. .IP \(bu 2 \fBEBCDIC\fP (فعال‌سازی با \fB\-\-ebcdic\fP یا \fBre2c:encoding:ebcdic\fP). یک کدگذاری با طول ثابت با فضای کد \fB[0\-255]\fP و نقطه‌های کد و واحدهای کد ۱\-بایتی است. .IP \(bu 2 \fBUCS2\fP (فعال‌سازی با \fB\-\-ucs2\fP یا \fBre2c:encoding:ucs2\fP). یک کدگذاری با طول ثابت با فضای کد \fB[0\-0xFFFF]\fP و نقطه‌های کد و واحدهای کد ۲\-بایتی است. .IP \(bu 2 \fBUTF8\fP (فعال‌سازی با \fB\-\-utf8\fP یا \fBre2c:encoding:utf8\fP). یک کدگذاری Unicode با طول متغیر است. اندازه واحد کد ۱ بایت است. نقطه‌های کد با 1 \-\- 4 واحد کد نمایش داده می‌شوند. .IP \(bu 2 \fBUTF16\fP (فعال‌سازی با \fB\-\-utf16\fP یا \fBre2c:encoding:utf16\fP). یک کدگذاری Unicode با طول متغیر است. اندازه واحد کد ۲ بایت است. نقطه‌های کد با 1 \-\- 2 واحد کد نمایش داده می‌شوند. .IP \(bu 2 \fBUTF32\fP (فعال‌سازی با \fB\-\-utf32\fP یا \fBre2c:encoding:utf32\fP). یک کدگذاری Unicode با طول ثابت با فضای کد \fB[0\-0x10FFFF]\fP و نقطه‌های کد و واحدهای کد ۴\-بایتی است. .UNINDENT .sp فایل‌های ضمیمه \fBinclude/unicode_blocks.re\fP، \fBinclude/unicode_categories.re\fP و \fBinclude/unicode_properties.re\fP تعاریف re2ocaml را برای بلوک‌ها، دسته‌ها و ویژگی‌های شرح‌داده‌شده در استاندارد Unicode ارائه می‌دهند. .sp گزینه \fB\-\-input\-encoding\fP کدگذاری فایل منبع را مشخص می‌کند، که می‌تواند برای فعال‌سازی لیترال‌های Unicode در عبارت‌های منظم استفاده شود. برای مثال، \fB\-\-input\-encoding utf8\fP به re2ocaml اعلام می‌کند که فایل منبع به فرمت UTF8 است (این با \fB\-\-utf8\fP که کدگذاری متن ورودی را تنظیم می‌کند متفاوت است). گزینه \fB\-\-encoding\-policy\fP نحوه مدیریت جانشین‌های یونیکد (Unicode surrogates؛ نقطه‌های کد در محدوده \fB[0xD800\-0xDFFF]\fP) را توسط re2ocaml تعیین می‌کند. .sp در زیر نمونه‌ای از یک تحلیل‌گر لغوی برای شناسه‌های Unicode با کدگذاری UTF8 آورده شده است. .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT \-\-utf8 \-i *) open String %{include \(dqunicode_categories.re\(dq %} type state = { yyinput: string; mutable yycursor: int; mutable yymarker: int; mutable yyaccept: int; } %{ re2c:YYFN = [\(dqlex;bool\(dq, \(dqyyrecord;state\(dq]; 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 { true } * { false } %} let main () = let st = { yyinput = \(dq_Ыдентификатор\(dq; yycursor = 0; yymarker = 0; yyaccept = 0; } in if not (lex st) then raise (Failure \(dqerror\(dq) let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "فایل‌های ضمیمه (Include files)" .sp ابزار re2ocaml به شما اجازه می‌دهد فایل‌های دیگر را با استفاده از بلوکی به شکل \fB/*!include:re2c FILE */\fP یا \fB%{include FILE %}\fP، یا دستور درون‌بلوکی \fB!include FILE ;\fP ضمیمه کنید، که در آن \fBFILE\fP مسیر فایلی است که باید ضمیمه شود. re2ocaml فایل‌های ضمیمه را در دایرکتوریِ فایلِ دربرگیرنده و در مکان‌های include (که می‌توان با گزینه \fB\-I\fP مشخص کرد) جستجو می‌کند. بلوک‌ها/دستورهای ضمیمه‌سازی در re2ocaml به همان شیوه \fB#include\fP در C/C++ عمل می‌کنند: محتویات \fBFILE\fP عیناً به جای بلوک/دستور کپی و جای‌گذاری می‌شوند. فایل‌های ضمیمه می‌توانند خود دارای includeهای بیشتری باشند. از گزینه \fB\-\-depfile\fP برای ردیابی وابستگی‌های ساخت فایل خروجی نسبت به فایل‌های ضمیمه استفاده کنید. ابزار re2ocaml تعدادی فایل ضمیمه از پیش تعریف‌شده ارائه می‌دهد که در زیردایرکتوری \fBinclude/\fP از پروژه قرار دارند. این فایل‌ها شامل تعاریفی هستند که ممکن است برای پروژه‌های دیگر نیز مفید باشند (مانند دسته‌بندی‌های Unicode) و چیزی شبیه به یک کتابخانه استاندارد را برای re2ocaml تشکیل می‌دهند\&. در ادامه مثالی از به‌کارگیری فایل‌های ضمیمه آورده شده است. .SS "فایل ضمیمه ۱ (definitions.ml)" .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C type number = Int | Float | NaN %{ 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 { Float } .ft P .fi .UNINDENT .UNINDENT .SS "فایل ورودی (Input file)" .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT \-i *) open String %{include \(dqdefinitions.ml\(dq %} type state = { yyinput: string; mutable yycursor: int; mutable yymarker: int; mutable yyaccept: int; } %{ re2c:YYFN = [\(dqlex;number\(dq, \(dqyyrecord;state\(dq]; re2c:yyfill:enable = 0; * { NaN } number { Int } !include \(dqextra_rules.re.inc\(dq; %} let test(str, num) = let st = {yyinput = str; yycursor = 0; yymarker = 0; yyaccept = 0} in if not (lex st = num) then raise (Failure \(dqerror\(dq) let main () = test(\(dq123\(dq, Int); test(\(dq123.4567\(dq, Float) let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "فایل‌های سرآیند (Header files)" .sp ابزار re2ocaml به کاربر امکان می‌دهد تا با استفاده از گزینه \fB\-\-header\fP یا پیکربندی \fBre2c:header\fP و جفت‌بلوک‌هایی به شکل \fB/*!header:re2c:on*/\fP و \fB/*!header:re2c:off*/\fP، یا \fB%{header:on%}\fP و \fB%{header:off%}\fP\&، از فایل ورودی یک فایل سرآیند تولید کند. بلوک نخست آغاز فایل سرآیند و بلوک دوم پایان آن را مشخص می‌سازد. هر آنچه میان این دو بلوک قرار گیرد توسط re2ocaml پردازش شده و کد تولیدشده در فایلی که با گزینه \fB\-\-header\fP یا پیکربندی \fBre2c:header\fP مشخص شده نوشته می‌شود (یا در صورت عدم استفاده از گزینه یا پیکربندی، در \fBstdout\fP نوشته خواهد شد). فایل سرآیند تولیدشده خودکار ممکن است در مواردی نیاز باشد که از re2ocaml برای ایجاد تعاریفی استفاده می‌شود که باید از سایر واحدهای ترجمه قابل مشاهده باشند. .sp در ادامه مثالی از تولید یک فایل سرآیند آورده شده است که شامل تعریف وضعیت تحلیل‌گر لغوی به همراه متغیرهای برچسب (tag variables) است (تعداد متغیرها به دستور زبان باقاعده بستگی داشته و برای برنامه‌نویس نامشخص است). .SS "فایل ورودی (Input file)" .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* re2ocaml $INPUT \-o $OUTPUT \-\-header lexer/state.ml \-i *) open State open String %{header:on %} type state = { yyinput: string; mutable yycursor: int; mutable tag: int; %{stags format = \(dqmutable @@: int;\(dq; %} } %{header:off %} %{ re2c:YYFN = [\(dqlex;int\(dq, \(dqyyrecord;State.state\(dq]; re2c:tags = 1; re2c:yyfill:enable = 0; re2c:header = \(dqlexer/state.ml\(dq; [a]* @tag [b]* { yyrecord.tag } %} let main () = let st = { yyinput = \(dqab\(dq; yycursor = 0; tag = 0; %{stags format = \(dq\en\et@@ = 0;\(dq; %} } in if not (lex st = 1) then raise (Failure \(dqerror\(dq) let _ = main () .ft P .fi .UNINDENT .UNINDENT .SS "فایل سرآیند (Header file)" .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C (* Generated by re2c *) type state = { yyinput: string; mutable yycursor: int; mutable tag: int; mutable yyt1: int; } .ft P .fi .UNINDENT .UNINDENT .SS "برنامه‌های اسکلت (Skeleton programs)" .sp با استفاده از گزینه \fB\-S, \-\-skeleton\fP، ابزار re2ocaml تمام کدهای غیر re2ocaml را نادیده گرفته و یک برنامه خودکفای C تولید می‌کند که می‌تواند در ادامه کامپایل و اجرا شود. این برنامه از کد تحلیل‌گر لغوی و داده‌های ورودی تشکیل شده است. به ازای هر DFA (بلوک یا شرط) ساخته‌شده، re2ocaml یک تحلیل‌گر لغوی مستقل و دو فایل تولید می‌کند: یک فایل \fB&.input\fP شامل رشته‌های مشتق‌شده از DFA و یک فایل \fB&.keys\fP با نتایج تطابق مورد انتظار. برنامه هر تحلیل‌گر را روی فایل \fB&.input\fP متناظر اجرا کرده و نتایج را با موارد مورد انتظار مقایسه می‌کند. برنامه‌های اسکلت به دلایل متعددی بسیار سودمند هستند: .INDENT 0.0 .IP \(bu 2 آن‌ها می‌توانند صحت بهینه‌سازی‌های گوناگون re2ocaml را بررسی کنند (داده‌ها در مراحل اولیه پردازش و پیش از اعمال هرگونه دگرگونی بر روی DFA تولید می‌شوند). .IP \(bu 2 تولید مجموعه‌ای از داده‌های ورودی با پوشش‌دهی مناسب می‌تواند هم برای آزمون و هم برای سنجش کارایی (benchmarking) مفید باشد. .IP \(bu 2 تولید برنامه‌های اجرایی خودکفا امکان به‌دست آوردن نمونه‌های آزمون کمینه‌شده را فراهم می‌سازد (چرا که کد اصلی ممکن است بسیار بزرگ بوده یا وابستگی‌های فراوانی داشته باشد). .UNINDENT .sp دشواری تولید داده‌های ورودی در این است که برای تمامی موارد به جز ساده‌ترین حالت‌ها، تعداد رشته‌های ورودی ممکن بیش از حد زیاد است (حتی در حالتی که طول رشته محدود باشد). ابزار re2ocaml این مشکل را با تولید رشته‌های کافی به منظور پوشش تقریباً تمام گذارهای DFA حل می‌کند. این ابزار از الگوریتم زیر بهره می‌برد: نخست، اسکلتی از DFA می‌سازد. برای کدگذاری‌هایی با اندازه واحد کد ۱ بایتی (مانند ASCII، UTF\-8 و EBCDIC) اسکلت تنها یک رونوشت دقیق از DFA اولیه است. برای کدگذاری‌هایی با واحدهای کد چندبایتی، اسکلت رونوشتی از DFA با حذف برخی گذارهاست: به این صورت که re2ocaml برای هر بازه پیوسته و مجزا که با یک گذار DFA مطابقت دارد، حداکثر ۲۵۶ واحد کد برمی‌گزیند. مقادیر انتخاب‌شده به‌طور یکنواخت توزیع شده‌اند و شامل کران‌های بازه نیز می‌شوند. re2ocaml به جای تلاش برای پوشش تمام مسیرهای ممکن در اسکلت (که امری ناشدنی است)، مسیرهای کافی را برای پوشش تمامی گذارهای اسکلت ایجاد می‌کند و بدین ترتیب پرش‌های شرطی متناظر را در تحلیل‌گر فعال می‌سازد. پیاده‌سازی این الگوریتم به حدود ۱ گیگابایت گذار محدود شده است و مقدار ثابتی از حافظه را مصرف می‌کند (re2ocaml داده‌ها را به محض تولید، در فایل می‌نویسد). .SS "مصورسازی و اشکال‌زدایی (Visualization and debug)" .sp با گزینه \fB\-D, \-\-emit\-dot\fP، برنامه re2ocaml کدی تولید نمی‌کند. در عوض، DFA تولیدشده را در قالب DOT خروجی می‌دهد. می‌توان این خروجی را با استفاده از Graphviz یا کتابخانه‌ای دیگر به تصویری از DFA تبدیل کرد. توجه داشته باشید که این گزینه، DFA نهایی را پس از اعمال چندین مرحله بهینه‌سازی و تبدیل نمایش می‌دهد. مراحل پیشین را می‌توان با گزینه‌های گوناگون اشکال‌زدایی، مانند \fB\-\-dump\-nfa\fP، \fB\-\-dump\-dfa\-raw\fP و غیره خروجی گرفت (فهرست کامل گزینه‌ها را ببینید). .SH "همچنین ببینید (SEE ALSO)" .sp می‌توانید اطلاعات بیشتری درباره re2c در وبگاه رسمی بیابید: \fI%http://re2c.org\fP\&. برنامه‌های مشابه عبارتند از flex(1)، lex(1)، quex(\fI%http://quex.sourceforge.net\fP). .SH "نویسندگان (AUTHORS)" .sp برنامه re2ocaml در ابتدا توسط 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. .