Flex Manual基础笔记1

http://flex.sourceforge.net/manual/

1. 介绍

Flex是一个用于生成扫描器(scanners)的工具。输入是文件或标准输入,然后根据描述的规则,flex生成C源文件,其中定义函数yylex()。这个C文件就能被编译了,其就能作为一个扫描器使用的。

2. 输入文件的格式

flex输入文件包含三个部分,通过一行只包含%%来分隔开,即:

definitions
%%
rules
%%
user code

(1) definition部分

主要包含是声明一个简单的name定义来简化扫描器说明,和声明一个start条件。

name定义有如下形式:

name definition

其中name为一个以字母或下划线开头的单词,后面有零个或多个字母、数字、下划线或破折号。definition是从name之后的第一个非空字符开始直到这一行的结束。而且,definition可以在后面通过"{name}"引用,将会将其扩展为“(definition)"。

举例:

digit [0-9]

id [a-z][a-z0-9]*

这样就分别定义了name="digit",其definition为"[0-9]和name="id",其definition为"[a-z][a-z0-9]*"。

那么后面可以通过引用digit的定义使用{digit}+"."{digit}*来表示([0-9])+"."([0-9])*的内容。

另外,没有缩进的注释(如/* */)会被直接复制到输出中。

一个缩进的文本或使用"%{"和"%}"包含的文本也会被复制到输出中(不包括"%{"和"%}"本身)。

另外,还有"%top"块,和上面的类似,但是其中的代码会被复制到输出的顶部,一般用于在里面定义一些头文件或宏等。允许多个%top块。如:

%top{

             /* This code goes at the "top" of the generated file. */

             #include <stdint.h>

             #include <inttypes.h>

         }

(2) rules部分

rules部分包含一系列形式的规则,其格式为:

pattern action

简单理解就是满足某一个模式,执行某一个行为,后面继续讨论其规则。其中pattern必须是没有缩进的,action必须在同一行。

在rules部分,任何缩进的或者被%{ %}包含的内容,如果出现在第一条rule之前,可能用于声明用于扫描时候的局部变量和进入扫描程序时候要执行的代码,如果出现在rule后面,那么这些内容会被直接复制到输出中,其行为可能是未定义的,可能引发错误。

(3) user code部分 

user code部分会被简单的复制到输出文件lex.yy.c中。用于定义一些代码被扫描器使用。这部分是可选的,如果不需要这部分,那么第二个%%也不需要。

(4) 注释

Flex支持/**/的注释形式。flex遇到注释,就会将其原封不动的复制到输出文件中。注释可以在任何地方出现,除非:

1. 可能不能出现在rules部分,当flex需要一个正则表达式的时候(比如%%之后的一行就要求是正则表达式等)。

2. 可能不能出现在definiton部分的"%option"的行中。

总之,为了简单,尽量所有的注释都在单独的一行开始并且在/*之前有一个以上空格,就不会有任何问题了。

 

你可能感兴趣的:(Flex)