The `flex' input file consists of three sections, separated by a line
containing only `%%'.
definitions
%%
rules
%%
user code
Some patterns:
`\123'
the character with octal value 123
`\x2a'
the character with hexadecimal value 2a
`(?r-s:pattern)'
apply option `r' and omit option `s' while interpreting pattern.
Options may be zero or more of the characters `i', `s', or `x'.
`(?# comment )'
omit everything within `()'. The first `)' character encountered
ends the pattern. It is not possible to for the comment to contain
a `)' character. The comment may span lines.\
`r/s'
an `r' but only if it is followed by an `s'.
`<s>r'
an `r', but only in start condition `s'
`<s1,s2,s3>r'
same, but in any of start conditions `s1', `s2', or `s3'.
`<<EOF>>'
an end-of-file.
`<s1,s2><<EOF>>'
an end-of-file when in start condition `s1' or `s2'
character class expressions:
[:alnum:] [:alpha:] [:blank:]
[:cntrl:] [:digit:] [:graph:]
[:lower:] [:print:] [:punct:]
[:space:] [:upper:] [:xdigit:]
[:^alnum:] [:^alpha:] [:^blank:]
[:^cntrl:] [:^digit:] [:^graph:]
[:^lower:] [:^print:] [:^punct:]
[:^space:] [:^upper:] [:^xdigit:]
The `{-}' operator computes the difference of two character classes, '{+}' does a union operation.
匹配方式是“最大长度优先”,长度一样时写在前面的优先。
每当匹配到一个token时,这个token能在全局char型指针'
yytext'中被找到,它的长度可以从全局int '
yyleng'里读到;这个token对应的action也在这个时候被执行;token之后的文本被继续扫描。
actions special directives:
`ECHO'
copies yytext to the scanner's output.
`BEGIN'
followed by the name of a start condition places the scanner in the
corresponding start condition
`REJECT'
directs the scanner to proceed on to the "second best" rule which
matched the input (or a prefix of the input).
`yymore()'
tells the scanner that the next time it matches a rule, the
corresponding token should be _appended_ onto the current value of
`yytext' rather than replacing it.
`yyless(n)' returns all but the first `n' characters of the current
token back to the input stream, where they will be rescanned when the
scanner looks for the next match. `yytext' and `yyleng' are adjusted
appropriately
`input()' reads the next character from the input stream.
`YY_FLUSH_BUFFER()' flushes the scanner's internal buffer
`yyterminate()' can be used in lieu of a return statement in an
action.
Start Conditions:
`%s' or '%x' represents "inclusive" start conditions or "exclusive" start conditions.
`BEGIN(INITIAL)' is equivalent to `BEGIN(0)'
We can access the current start condition using the integer-valued `YY_START' macro, and Flex provides `YYSTATE' as an alias for `YY_START'
Multiple Input Buffers:
-- Function: YY_BUFFER_STATE
yy_create_buffer ( FILE *file, int size )
which takes a `FILE' pointer and a size and creates a buffer associated with the given file and large enough to hold `size' characters (when in doubt, use `YY_BUF_SIZE' for the size).
-- Function: void
yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer )
The above function switches the scanner's input buffer so subsequent tokens will come from `new_buffer'.
-- Function: void
yy_delete_buffer ( YY_BUFFER_STATE buffer )
is used to reclaim the storage associated with a buffer.
-- Function: void
yypush_buffer_state ( YY_BUFFER_STATE buffer )
This function pushes the new buffer state onto an internal stack.
-- Function: void
yypop_buffer_state ( )
This function removes the current state from the top of the stack, and deletes it by calling `yy_delete_buffer'.
-- Function: void
yy_flush_buffer ( YY_BUFFER_STATE buffer )
This function discards the buffer's contents
-- Function: YY_BUFFER_STATE
yy_new_buffer ( FILE *file, int size )
is an alias for `yy_create_buffer()'
`YY_CURRENT_BUFFER' macro returns a `YY_BUFFER_STATE' handle to the current buffer. It should not be used as an lvalue.
-- Function: YY_BUFFER_STATE
yy_scan_string ( const char *str )
scans a NUL-terminated string.
-- Function: YY_BUFFER_STATE
yy_scan_bytes ( const char *bytes, int len )
scans `len' bytes (including possibly `NUL's) starting at location `bytes'.
Note that both of above two functions create and scan a _copy_ of the string or bytes.You can avoid the copy by using:
-- Function: YY_BUFFER_STATE
yy_scan_buffer (char *base, yy_size_t size)
the last two bytes of which _must_ be `YY_END_OF_BUFFER_CHAR' (ASCII NUL). These last two bytes are not scanned; thus, scanning consists of `base[0]' through `base[size-2]', inclusive.
-- Data type: yy_size_t
is an integral type to which you can cast an integer expression reflecting the size of the buffer.