flex基础小记

The `flex' input file consists of three sections, separated by a line
containing only `%%'.


definitions
%%
rules
%%
user code


[color=blue]Some patterns:[/color]

`\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'

[color=blue]character class expressions:[/color]

[: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型指针'[color=red]yytext[/color]'中被找到,它的长度可以从全局int '[color=red]yyleng[/color]'里读到;这个token对应的action也在这个时候被执行;token之后的文本被继续扫描。

[color=blue]actions special directives:[/color]
`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.

[color=blue]Start Conditions:[/color]
`%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'

[color=blue]Multiple Input Buffers:[/color]
-- Function: YY_BUFFER_STATE [color=darkred]yy_create_buffer[/color] ( 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 [color=darkred]yy_switch_to_buffer[/color] ( YY_BUFFER_STATE new_buffer )

The above function switches the scanner's input buffer so subsequent tokens will come from `new_buffer'.

-- Function: void [color=darkred]yy_delete_buffer[/color] ( YY_BUFFER_STATE buffer )

is used to reclaim the storage associated with a buffer.

-- Function: void [color=darkred]yypush_buffer_state[/color] ( YY_BUFFER_STATE buffer )

This function pushes the new buffer state onto an internal stack.

-- Function: void [color=darkred]yypop_buffer_state[/color] ( )

This function removes the current state from the top of the stack, and deletes it by calling `yy_delete_buffer'.

-- Function: void [color=darkred]yy_flush_buffer[/color] ( YY_BUFFER_STATE buffer )

This function discards the buffer's contents

-- Function: YY_BUFFER_STATE [color=darkred]yy_new_buffer[/color] ( 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 [color=darkred]yy_scan_string[/color] ( const char *str )
scans a NUL-terminated string.

-- Function: YY_BUFFER_STATE [color=darkred]yy_scan_bytes[/color] ( 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 [color=darkred]yy_scan_buffer[/color] (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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值