html2 Flex - a scanner generator: 9. Actions
[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9. Actions

Each pattern in a rule has a corresponding action, which can be any arbitrary C statement. The pattern ends at the first non-escaped whitespace character; the remainder of the line is its action. If the action is empty, then when the pattern is matched the input token is simply discarded. For example, here is the specification for a program which deletes all occurrences of "zap me" from its input:

 
%%
"zap me"

(It will copy all other characters in the input to the output since they will be matched by the default rule.)

Here is a program which compresses multiple blanks and tabs down to a single blank, and throws away whitespace found at the end of a line:

 
%%
[ \t]+        putchar( ' ' );
[ \t]+$       /* ignore this token */

If the action contains a ’{’, then the action spans till the balancing ’}’ is found, and the action may cross multiple lines. flex knows about C strings and comments and won’t be fooled by braces found within them, but also allows actions to begin with ‘%{’ and will consider the action to be all the text up to the next ‘%}’ (regardless of ordinary braces inside the action).

An action consisting solely of a vertical bar (’|’) means "same as the action for the next rule." See below for an illustration.

Actions can include arbitrary C code, including return statements to return a value to whatever routine called ‘yylex()’. Each time ‘yylex()’ is called it continues processing tokens from where it last left off until it either reaches the end of the file or executes a return.

Actions are free to modify yytext except for lengthening it (adding characters to its end–these will overwrite later characters in the input stream). This however does not apply when using ‘%array’ (see above); in that case, yytext may be freely modified in any way.

Actions are free to modify yyleng except they should not do so if the action also includes use of ‘yymore()’ (see below).

There are a number of special directives which can be included within an action:

Two notes regarding use of ‘yymore()’. First, ‘yymore()’ depends on the value of yyleng correctly reflecting the size of the current token, so you must not modify yyleng if you are using ‘yymore()’. Second, the presence of ‘yymore()’ in the scanner’s action entails a minor performance penalty in the scanner’s matching speed.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 29, 2020 using texi2html 1.82.