Root Zanli
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
proc
/
thread-self
/
root
/
usr
/
share
/
doc
/
re2c
/
manual
/
conditions
/
Filename :
conditions.rst_
back
Copy
Conditions are enabled with ``-c`` ``--conditions``. This option allows one to encode multiple interrelated lexers within the same re2c block. Each lexer corresponds to a single condition. It starts with a label of the form ``yyc_name``, where ``name`` is condition name and ``yyc`` prefix can be adjusted with configuration ``re2c:condprefix``. Different lexers are separated with a comment ``/* *********************************** */`` which can be adjusted with configuration ``re2c:cond:divider``. Furthermore, each condition has a unique identifier of the form ``yycname``, where ``name`` is condition name and ``yyc`` prefix can be adjusted with configuration ``re2c:condenumprefix``. Identifiers have the type ``YYCONDTYPE`` and should be generated with ``/*!types:re2c*/`` directive or ``-t`` ``--type-header`` option. Users shouldn't define these identifiers manually, as the order of conditions is not specified. Before all conditions re2c generates entry code that checks the current condition identifier and transfers control flow to the start label of the active condition. After matching some rule of this condition, lexer may either transfer control flow back to the entry code (after executing the associated action and optionally setting another condition with ``=>``), or use ``:=>`` shortcut and transition directly to the start label of another condition (skipping the action and the entry code). Configuration ``re2c:cond:goto`` allows one to change the default behavior. Syntactically each rule must be preceded with a list of comma-separated condition names or a wildcard ``*`` enclosed in angle brackets ``<`` and ``>``. Wildcard means "any condition" and is semantically equivalent to listing all condition names. Here ``regexp`` is a regular expression, ``default`` refers to the default rule ``*``, and ``action`` is a block of code. * ``<conditions-or-wildcard> regexp-or-default action`` * ``<conditions-or-wildcard> regexp-or-default => condition action`` * ``<conditions-or-wildcard> regexp-or-default :=> condition`` Rules with an exclamation mark ``!`` in front of condition list have a special meaning: they have no regular expression, and the associated action is merged as an entry code to actions of normal rules. This might be a convenient place to peform a routine task that is common to all rules. * ``<!conditions-or-wildcard> action`` Another special form of rules with an empty condition list ``<>`` and no regular expression allows one to specify an "entry condition" that can be used to execute code before entering the lexer. It is semantically equivalent to a condition with number zero, name ``0`` and an empty regular expression. * ``<> action`` * ``<> => condition action`` * ``<> :=> condition``