NAME
re2c - convert regular-expressions to C/C++
SYNOPSIS
re2c [-bdDefFghisuvVw1] [-o output] [-c [-t header]] file
DESCRIPTION
re2c is a preprocessor that generates C-based recognizers from regular
expressions. The input to re2c consists of C/C++ source interleaved
with comments of the form /*!re2c ... */ which contain scanner
specifications. In the output these comments are replaced with code
that, when executed, will find the next input token and then execute
some user-supplied token-specific code.
For example, given the following code
char *scan(char *p)
{
/*!re2c
re2c:define:YYCTYPE = "unsigned char";
re2c:define:YYCURSOR = p;
re2c:yyfill:enable = 0;
re2c:yych:conversion = 1;
re2c:indent:top = 1;
[0-9]+ {return p;}
[^] {return (char*)0;}
*/
}
re2c -is will generate
/* Generated by re2c on Sat Apr 16 11:40:58 1994 */
char *scan(char *p)
{
{
unsigned char yych;
yych = (unsigned char)*p;
if(yych <= ’/’) goto yy4;
if(yych >= ’:’) goto yy4;
++p;
yych = (unsigned char)*p;
goto yy7;
yy3:
{return p;}
yy4:
++p;
yych = (unsigned char)*p;
{return char*)0;}
yy6:
++p;
yych = (unsigned char)*p;
yy7:
if(yych <= ’/’) goto yy3;
if(yych <= ’9’) goto yy6;
goto yy3;
}
}
You can place one /*!max:re2c */ comment that will output a "#define
YYMAXFILL <n>" line that holds the maximum number of characters
required to parse the input. That is the maximum value YYFILL(n) will
receive. If -1 is in effect then YYMAXFILL can only be triggered once
after the last /*!re2c */.
You can also use /*!ignore:re2c */ blocks that allows to document the
scanner code and will not be part of the output.
OPTIONS
re2c provides the following options:
-? -h Invoke a short help.
-b Implies -s. Use bit vectors as well in the attempt to coax
better code out of the compiler. Most useful for specifications
with more than a few keywords (e.g. for most programming
languages).
-c Used to support (f)lex-like condition support.
-d Creates a parser that dumps information about the current
position and in which state the parser is while parsing the
input. This is useful to debug parser issues and states. If you
use this switch you need to define a macro YYDEBUG that is
called like a function with two parameters: void YYDEBUG(int
state, char current). The first parameter receives the state or
-1 and the second parameter receives the input at the current
cursor.
-D Emit Graphviz dot data. It can then be processed with e.g. "dot
-Tpng input.dot > output.png". Please note that scanners with
many states may crash dot.
-e Cross-compile from an ASCII platform to an EBCDIC one.
-f Generate a scanner with support for storable state. For details
see below at SCANNER WITH STORABLE STATES.
-F Partial support for flex syntax. When this flag is active then
named definitions must be surrounded by curly braces and can be
defined without an equal sign and the terminating semi colon.
Instead names are treated as direct double quoted strings.
-g Generate a scanner that utilizes GCC’s computed goto feature.
That is re2c generates jump tables whenever a decision is of a
certain complexity (e.g. a lot of if conditions are otherwise
necessary). This is only useable with GCC and produces output
that cannot be compiled with any other compiler. Note that this
implies -b and that the complexity threshold can be configured
using the inplace configuration "cgoto:threshold".
-i Do not output #line information. This is usefull when you want
use a CMS tool with the re2c output which you might want if you
do not require your users to have re2c themselves when building
from your source. -o output Specify the output file.
-r Allows reuse of scanner definitions with ’/*!use:re2c’ after
every ’/*!use:re2c’ block that follows. These blocks can contain
inplace configurations, especially ’re2c:flags:w’ and
’re2c:flags:u’. That way it is possible to create the same
scanner multiple times for different character types, different
input mechanisms or different output mechanisms. The
’/*!use:re2c’ blocks can also contain additional rules that will
be appended to the set of rules in ’/*!rules:re2c’.
-s Generate nested ifs for some switches. Many compilers need this
assist to generate better code.
-t Create a header file that contains types for the (f)lex-like
condition support. This can only be activated when -c is in
use.
-u Generate a parser that supports Unicode chars (UTF-32). This
means the generated code can deal with any valid Unicode
character up to 0x10FFFF. When UTF-8 or UTF-16 needs to be
supported you need to convert the incoming stream to UTF-32 upon
input yourself.
-v Show version information.
-V Show the version as a number XXYYZZ.
-w Create a parser that supports wide chars (UCS-2). This implies
-s and cannot be used together with -e switch.
-1 Force single pass generation, this cannot be combined with -f
and disables YYMAXFILL generation prior to last re2c block.
--no-generation-date
Suppress date output in the generated output so that it only
shows the re2c version.
--case-insensitive
All strings are case insensitive, so all "-expressions are
treated in the same way ’-expressions are.
--case-inverted
Invert the meaning of single and double quoted strings. With
this switch single quotes are case sensitive and double quotes
are case insensitive.
INTERFACE CODE
Unlike other scanner generators, re2c does not generate complete
scanners: the user must supply some interface code. In particular, the
user must define the following macros or use the corresponding inplace
configurations:
YYCONDTYPE
In -c mode you can use -t to generate a file that contains the
enumeration used as conditions. Each of the values refers to a
condition of a rule set.
YYCTXMARKER
l-expression of type *YYCTYPE. The generated code saves
trailing context backtracking information in YYCTXMARKER. The
user only needs to define this macro if a scanner specification
uses trailing context in one or more of its regular-expressions.
YYCTYPE
Type used to hold an input symbol. Usually char or unsigned
char.
YYCURSOR
l-expression of type *YYCTYPE that points to the current input
symbol. The generated code advances YYCURSOR as symbols are
matched. On entry, YYCURSOR is assumed to point to the first
character of the current token. On exit, YYCURSOR will point to
the first character of the following token.
YYDEBUG(state,current)
This is only needed if the -d flag was specified. It allows to
easily debug the generated parser by calling a user defined
function for every state. The function should have the following
signature: void YYDEBUG(int state, char current). The first
parameter receives the state or -1 and the second parameter
receives the input at the current cursor.
YYFILL(n)
The generated code "calls" YYFILL(n) when the buffer needs
(re)filling: at least n additional characters should be
provided. YYFILL(n) should adjust YYCURSOR, YYLIMIT, YYMARKER
and YYCTXMARKER as needed. Note that for typical programming
languages n will be the length of the longest keyword plus one.
The user can place a comment of the form /*!max:re2c */ once to
insert a YYMAXFILL(n) definition that is set to the maximum
length value. If -1 switch is used then YYMAXFILL can be
triggered only once after the last /*!re2c */ block.
YYGETCONDITION()
This define is used to get the condition prior to entering the
scanner code when using -c switch. The value must be initialized
with a value from the enumeration YYCONDTYPE type.
YYGETSTATE()
The user only needs to define this macro if the -f flag was
specified. In that case, the generated code "calls"
YYGETSTATE() at the very beginning of the scanner in order to
obtain the saved state. YYGETSTATE() must return a signed
integer. The value must be either -1, indicating that the
scanner is entered for the first time, or a value previously
saved by YYSETSTATE(s). In the second case, the scanner will
resume operations right after where the last YYFILL(n) was
called.
YYLIMIT
Expression of type *YYCTYPE that marks the end of the buffer
(YYLIMIT[-1] is the last character in the buffer). The
generated code repeatedly compares YYCURSOR to YYLIMIT to
determine when the buffer needs (re)filling.
YYMARKER
l-expression of type *YYCTYPE. The generated code saves
backtracking information in YYMARKER. Some easy scanners might
not use this.
YYMAXFILL
This will be automatically defined by /*!max:re2c */ blocks as
explained above.
YYSETCONDITION(c)
This define is used to set the condition in transition rules.
This is only being used when -c is active and transition rules
are being used.
YYSETSTATE(s)
The user only needs to define this macro if the -f flag was
specified. In that case, the generated code "calls" YYSETSTATE
just before calling YYFILL(n). The parameter to YYSETSTATE is a
signed integer that uniquely identifies the specific instance of
YYFILL(n) that is about to be called. Should the user wish to
save the state of the scanner and have YYFILL(n) return to the
caller, all he has to do is store that unique identifer in a
variable. Later, when the scannered is called again, it will
call YYGETSTATE() and resume execution right where it left off.
The generated code will contain both YYSETSTATE(s) and
YYGETSTATE even if YYFILL(n) is being disabled.
SCANNER WITH STORABLE STATES
When the -f flag is specified, re2c generates a scanner that can store
its current state, return to the caller, and later resume operations
exactly where it left off.
The default operation of re2c is a "pull" model, where the scanner asks
for extra input whenever it needs it. However, this mode of operation
assumes that the scanner is the "owner" the parsing loop, and that may
not always be convenient.
Typically, if there is a preprocessor ahead of the scanner in the
stream, or for that matter any other procedural source of data, the
scanner cannot "ask" for more data unless both scanner and source live
in a separate threads.
The -f flag is useful for just this situation : it lets users design
scanners that work in a "push" model, i.e. where data is fed to the
scanner chunk by chunk. When the scanner runs out of data to consume,
it just stores its state, and return to the caller. When more input
data is fed to the scanner, it resumes operations exactly where it left
off.
When using the -f option re2c does not accept stdin because it has to
do the full generation process twice which means it has to read the
input twice. That means re2c would fail in case it cannot open the
input twice or reading the input for the first time influences the
second read attempt.
Changes needed compared to the "pull" model.
1. User has to supply macros YYSETSTATE() and YYGETSTATE(state)
2. The -f option inhibits declaration of yych and yyaccept. So the user
has to declare these. Also the user has to save and restore these. In
the example examples/push.re these are declared as fields of the (C++)
class of which the scanner is a method, so they do not need to be
saved/restored explicitly. For C they could e.g. be made macros that
select fields from a structure passed in as parameter. Alternatively,
they could be declared as local variables, saved with YYFILL(n) when it
decides to return and restored at entry to the function. Also, it could
be more efficient to save the state from YYFILL(n) because
YYSETSTATE(state) is called unconditionally. YYFILL(n) however does not
get state as parameter, so we would have to store state in a local
variable by YYSETSTATE(state).
3. Modify YYFILL(n) to return (from the function calling it) if more
input is needed.
4. Modify caller to recognise "more input is needed" and respond
appropriately.
5. The generated code will contain a switch block that is used to
restores the last state by jumping behind the corrspoding YYFILL(n)
call. This code is automatically generated in the epilog of the first
"/*!re2c */" block. It is possible to trigger generation of the
YYGETSTATE() block earlier by placing a "/*!getstate:re2c */" comment.
This is especially useful when the scanner code should be wrapped
inside a loop.
Please see examples/push.re for push-model scanner. The generated code
can be tweaked using inplace configurations "state:abort" and
"state:nextlabel".
SCANNER WITH CONDITION SUPPORT
You can preceed regular-expressions with a list of condition names when
using the -c switch. In this case re2c generates scanner blocks for
each conditon. Where each of the generated blocks has its own
precondition. The precondition is given by the interface define
YYGETCONDITON and must be of type YYCONDTYPE.
There are two special rule types. First, the rules of the condition ’*’
are merged to all conditions. And second the empty condition list
allows to provide a code block that does not have a scanner part.
Meaning it does not allow any regular expression. The condition value
referring to this special block is always the one with the enumeration
value 0. This way the code of this special rule can be used to
initialize a scanner. It is in no way necessary to have these rules:
but sometimes it is helpful to have a dedicated uninitialized condition
state.
Non empty rules allow to specify the new condition, which makes them
transition rules. Besides generating calls for the define
YYSETCONDTITION no other special code is generated.
There is another kind of special rules that allow to prepend code to
any code block of all rules of a certain set of conditions or to all
code blocks to all rules. This can be helpful when some operation is
common among rules. For instance this can be used to store the length
of the scanned string. These special setup rules start with an
exclamation mark followed by either a list of conditions <! condition,
... > or a star <!*>. When re2c generates the code for a rule whose
state does not have a setup rule and a star’d setup rule is present,
than that code will be used as setup code.
SCANNER SPECIFICATIONS
Each scanner specification consists of a set of rules, named
definitions and configurations.
Rules consist of a regular-expression along with a block of C/C++ code
that is to be executed when the associated regular-expression is
matched. You can either start the code with an opening curly brace or
the sequence ’:=’. When the code with a curly brace then re2c counts
the brace depth and stops looking for code automatically. Otherwise
curly braces are not allowed and re2c stops looking for code at the
first line that does not begin with whitespace.
regular-expression { C/C++ code }
regular-expression := C/C++ code
If -c is active then each regular-expression is preceeded by a list of
comma separated condition names. Besides normal naming rules there are
two special cases. A rule may contain the single condition name ’*’ and
no contition name at all. In the latter case the rule cannot have a
regular-expression. Non empty rules may further more specify the new
condition. In that case re2c will generated the necessary code to
chnage the condition automatically. Just as above code can be started
with a curly brace of the sequence ’:=’. Further more rules can use
’:=>’ as a shortcut to automatically generate code that not only sets
the new condition state but also continues execution with the new
state. A shortcut rule should not be used in a loop where there is code
between the start of the loop and the re2c block unless re2c:cond:goto
is changed to ’continue;’. If code is necessary before all rule (though
not simple jumps) you can doso by using <! pseudo-rules.
<condition-list> regular-expression { C/C++ code }
<condition-list> regular-expression := C/C++ code
<condition-list> regular-expression => condition { C/C++ code }
<condition-list> regular-expression => condition := C/C++ code
<condition-list> regular-expression :=> condition
<*> regular-expression { C/C++ code }
<*> regular-expression := C/C++ code
<*> regular-expression => condition { C/C++ code }
<*> regular-expression => condition := C/C++ code
<*> regular-expression :=> condition
<> { C/C++ code }
<> := C/C++ code
<> => condition { C/C++ code }
<> => condition := C/C++ code
<> :=> condition
<!condition-list> { C/C++ code }
<!condition-list> := C/C++ code
<!*> { C/C++ code }
<!*> := C/C++ code
Named definitions are of the form:
name = regular-expression;
-F is active, then named definitions are also of the form:
name regular-expression
Configurations look like named definitions whose names start with
"re2c:":
re2c:name = value;
re2c:name = "value";
SUMMARY OF RE2C REGULAR-EXPRESSIONS
"foo" the literal string foo. ANSI-C escape sequences can be used.
the literal string foo (characters [a-zA-Z] treated case-insensitive).
ANSI-C escape sequences can be used.
[xyz] a "character class"; in this case, the regular-expression
matches either an ’x’, a ’y’, or a ’z’.
[abj-oZ]
a "character class" with a range in it; matches an ’a’, a ’b’,
any letter from ’j’ through ’o’, or a ’Z’.
[^class]
an inverted "character class".
r\s match any r which isn’t an s. r and s must be regular-
expressions which can be expressed as character classes.
r* zero or more r’s, where r is any regular-expression
r+ one or more r’s
r? zero or one r’s (that is, "an optional r")
name the expansion of the "named definition" (see above)
(r) an r; parentheses are used to override precedence (see below)
rs an r followed by an s ("concatenation")
r|s either an r or an s
r/s an r but only if it is followed by an s. The s is not part of
the matched text. This type of regular-expression is called
"trailing context". A trailing context can only be the end of a
rule and not part of a named definition.
r{n} matches r exactly n times.
r{n,} matches r at least n times.
r{n,m} matches r at least n but not more than m times.
match any character except newline (\n).
def matches named definition as specified by def only if -F is off.
If the switch -F is active then this behaves like it was
enclosed in double quotes and matches the string def.
Character classes and string literals may contain octoal or hexadecimal
character definitions and the following set of escape sequences (\n,
\t, \v, \b, \r, \f, \a, \\). An octal character is defined by a
backslash followed by its three octal digits and a hexadecimal
character is defined by backslash, a lower cased ’x’ and its two
hexadecimal digits or a backslash, an upper cased X and its four
hexadecimal digits.
re2c further more supports the c/c++ unicode notation. That is a
backslash followed by either a lowercased u and its four hexadecimal
digits or an uppercased U and its eight hexadecimal digits. However
only in -u mode the generated code can deal with any valid Unicode
character up to 0x10FFFF.
Since characters greater \X00FF are not allowed in non unicode mode,
the only portable "any" rules are (.|"\n") and [^].
The regular-expressions listed above are grouped according to
precedence, from highest precedence at the top to lowest at the bottom.
Those grouped together have equal precedence.
INPLACE CONFIGURATION
It is possible to configure code generation inside re2c blocks. The
following lists the available configurations:
re2c:condprefix = yyc_ ;
Allows to specify the prefix used for condition labels. That is
this text is prepended to any condition label in the generated
output file.
re2c:condenumprefix = yyc ;
Allows to specify the prefix used for condition values. That is
this text is prepended to any condition enum value in the
generated output file.
re2c:cond:divider = "/* *********************************** */" ;
Allows to customize the devider for condition blocks. You can
use ’@@’ to put the name of the condition or ustomize the
plaeholder using re2c:cond:divider@cond.
re2c:cond:divider@cond = @@ ;
Specifies the placeholder that will be replaced with the
condition name in re2c:cond:divider.
re2c:cond:goto = "goto @@;" ;
Allows to customize the condition goto statements used with
’:=>’ style rules. You can use ’@@’ to put the name of the
condition or ustomize the plaeholder using re2c:cond:goto@cond.
You can also change this to ’continue;’, which would allow you
to continue with the next loop cycle including any code between
loop start and re2c block.
re2c:cond:goto@cond = @@ ;
Spcifies the placeholder that will be replaced with the
condition label in re2c:cond:goto.
re2c:indent:top = 0 ;
Specifies the minimum number of indendation to use. Requires a
numeric value greater than or equal zero.
re2c:indent:string = "\t" ;
Specifies the string to use for indendation. Requires a string
that should contain only whitespace unless you need this for
external tools. The easiest way to specify spaces is to enclude
them in single or double quotes. If you do not want any
indendation at all you can simply set this to "".
re2c:yych:conversion = 0 ;
When this setting is non zero, then re2c automatically generates
conversion code whenever yych gets read. In this case the type
must be defined using re2c:define:YYCTYPE.
re2c:yych:emit = 1 ;
Generation of yych can be suppressed by setting this to 0.
re2c:yybm:hex = 0 ;
If set to zero then a decimal table is being used else a
hexadecimal table will be generated.
re2c:yyfill:enable = 1 ;
Set this to zero to suppress generation of YYFILL(n). When using
this be sure to verify that the generated scanner does not read
behind input. Allowing this behavior might introduce sever
security issues to you programs.
re2c:yyfill:check = 1 ;
This can be set 0 to suppress output of the pre condition using
YYCURSOR and YYLIMIT which becomes usefull when YYLIMIT +
max(YYFILL) is always accessible.
re2c:yyfill:parameter = 1 ;
Allows to suppress parameter passing to YYFILL calls. If set to
zero then no parameter is passed to YYFILL. However
define:YYFILL@LEN allows to specify a replacement string for the
actual length value. If set to a non zero value then YYFILL
usage will be followed by the number of requested characters in
braces unless re2c:define:YYFILL:naked is set. Also look at
re2c:define:YYFILL:naked and re2c:define:YYFILL@LEN.
re2c:startlabel = 0 ;
If set to a non zero integer then the start label of the next
scanner blocks will be generated even if not used by the scanner
itself. Otherwise the normal yy0 like start label is only being
generated if needed. If set to a text value then a label with
that text will be generated regardless of whether the normal
start label is being used or not. This setting is being reset to
0 after a start label has been generated.
re2c:labelprefix = yy ;
Allows to change the prefix of numbered labels. The default is
yy and can be set any string that is a valid label.
re2c:state:abort = 0 ;
When not zero and switch -f is active then the YYGETSTATE block
will contain a default case that aborts and a -1 case is used
for initialization.
re2c:state:nextlabel = 0 ;
Used when -f is active to control whether the YYGETSTATE block
is followed by a yyNext: label line. Instead of using yyNext you
can usually also use configuration startlabel to force a
specific start label or default to yy0 as start label. Instead
of using a dedicated label it is often better to separate the
YYGETSTATE code from the actual scanner code by placing a
"/*!getstate:re2c */" comment.
re2c:cgoto:threshold = 9 ;
When -g is active this value specifies the complexity threshold
that triggers generation of jump tables rather than using nested
if’s and decision bitfields. The threshold is compared against
a calculated estimation of if-s needed where every used bitmap
divides the threshold by 2.
re2c:yych:conversion = 0 ;
When the input uses signed characters and -s or -b switches are
in effect re2c allows to automatically convert to the unsigned
character type that is then necessary for its internal single
character. When this setting is zero or an empty string the
conversion is disabled. Using a non zero number the conversion
is taken from YYCTYPE. If that is given by an inplace
configuration that value is being used. Otherwise it will be
(YYCTYPE) and changes to that configuration are no longer
possible. When this setting is a string the braces must be
specified. Now assuming your input is a char* buffer and you are
using above mentioned switches you can set YYCTYPE to unsigned
char and this setting to either 1 or "(unsigned char)".
re2c:define:define:YYCONDTYPE = YYCONDTYPE ;
Enumeration used for condition support with -c mode.
re2c:define:YYCTXMARKER = YYCTXMARKER ;
Allows to overwrite the define YYCTXMARKER and thus avoiding it
by setting the value to the actual code needed.
re2c:define:YYCTYPE = YYCTYPE ;
Allows to overwrite the define YYCTYPE and thus avoiding it by
setting the value to the actual code needed.
re2c:define:YYCURSOR = YYCURSOR ;
Allows to overwrite the define YYCURSOR and thus avoiding it by
setting the value to the actual code needed.
re2c:define:YYDEBUG = YYDEBUG ;
Allows to overwrite the define YYDEBUG and thus avoiding it by
setting the value to the actual code needed.
re2c:define:YYFILL = YYFILL ;
Allows to overwrite the define YYFILL and thus avoiding it by
setting the value to the actual code needed.
re2c:define:YYFILL:naked = 0 ;
When set to 1 neither braces, parameter nor semicolon gets
emitted.
re2c:define:YYFILL@len = @@ ;
When using re2c:define:YYFILL and re2c:yyfill:parameter is 0
then any occurence of this text inside YYFILL will be replaced
with the actual length value.
re2c:define:YYGETCONDITION = YYGETCONDITION ;
Allows to overwrite the define YYGETCONDITION.
re2c:define:YYGETCONDITION:naked = ;
When set to 1 neither braces, parameter nor semicolon gets
emitted.
re2c:define:YYGETSTATE = YYGETSTATE ;
Allows to overwrite the define YYGETSTATE and thus avoiding it
by setting the value to the actual code needed.
re2c:define:YYGETSTATE:naked = 0 ;
When set to 1 neither braces, parameter nor semicolon gets
emitted.
re2c:define:YYLIMIT = YYLIMIT ;
Allows to overwrite the define YYLIMIT and thus avoiding it by
setting the value to the actual code needed.
re2c:define:YYMARKER = YYMARKER ;
Allows to overwrite the define YYMARKER and thus avoiding it by
setting the value to the actual code needed.
re2c:define:YYSETCONDITION = YYSETCONDITION ;
Allows to overwrite the define YYSETCONDITION.
re2c:define:YYSETCONDITION@cond = @@ ;
When using re2c:define:YYSETCONDITION then any occurence of this
text inside YYSETCONDITION will be replaced with the actual new
condition value.
re2c:define:YYSETSTATE = YYSETSTATE ;
Allows to overwrite the define YYSETSTATE and thus avoiding it
by setting the value to the actual code needed.
re2c:define:YYSETSTATE:naked = 0 ;
When set to 1 neither braces, parameter nor semicolon gets
emitted.
re2c:define:YYSETSTATE@state = @@ ;
When using re2c:define:YYSETSTATE then any occurence of this
text inside YYSETSTATE will be replaced with the actual new
state value.
re2c:label:yyFillLabel = yyFillLabel ;
Allows to overwrite the name of the label yyFillLabel.
re2c:label:yyNext = yyNext ;
Allows to overwrite the name of the label yyNext.
re2c:variable:yyaccept = yyaccept ;
Allows to overwrite the name of the variable yyaccept.
re2c:variable:yybm = yybm ;
Allows to overwrite the name of the variable yybm.
re2c:variable:yych = yych ;
Allows to overwrite the name of the variable yych.
re2c:variable:yyctable = yyctable ;
When both -c and -g are active then re2c uses this variable to
generate a static jump table for YYGETCONDITION.
re2c:variable:yystable = yystable ;
When both -f and -g are active then re2c uses this variable to
generate a static jump table for YYGETSTATE.
re2c:variable:yytarget = yytarget ;
Allows to overwrite the name of the variable yytarget.
UNDERSTANDING RE2C
The subdirectory lessons of the re2c distribution contains a few step
by step lessons to get you started with re2c. All examples in the
lessons subdirectory can be compiled and actually work.
FEATURES
re2c does not provide a default action: the generated code assumes that
the input will consist of a sequence of tokens. Typically this can be
dealt with by adding a rule such as the one for unexpected characters
in the example above.
The user must arrange for a sentinel token to appear at the end of
input (and provide a rule for matching it): re2c does not provide an
<<EOF>> expression. If the source is from a null-byte terminated
string, a rule matching a null character will suffice. If the source
is from a file then you could pad the input with a newline (or some
other character that cannot appear within another token); upon
recognizing such a character check to see if it is the sentinel and act
accordingly. And you can also use YYFILL(n) to end the scanner in case
not enough characters are available which is nothing else then e
detection of end of data/file.
BUGS
Difference only works for character sets.
The re2c internal algorithms need documentation.
SEE ALSO
flex(1), lex(1).
More information on re2c can be found here:
http://re2c.org/
AUTHORS
Peter Bumbulis <peter@csg.uwaterloo.ca>
Brian Young <bayoung@acm.org>
Dan Nuffer <nuffer@users.sourceforge.net>
Marcus Boerger <helly@users.sourceforge.net>
Hartmut Kaiser <hkaiser@users.sourceforge.net>
Emmanuel Mogenet <mgix@mgix.com> added storable state
VERSION INFORMATION
This manpage describes re2c, version 0.13.5.