一、Ubuntu安装flex
在ubutu上安装 yacc的命令:
sudo apt-get install flex bison
-
yacc(Yet Another Compiler Compiler)
yacc是一个经典的生成语法分析器的工具。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。 -
flex:词法分析器
flex是一个词法分析器。用来将一个.l文件生成一个.c程序文件。即生成一个词法分析器。然后读取输入,和正则表达式匹配,再执行相应的动作,实现了程序的功能。我们可以发现flex实现在程序外部就可以接受输入的功能。Flex是一个生成扫描器的工具,能够识别文本中的词法模式。Flex 读入给定的输入文件,如果没有给定文件名的话,则从标准输入读取,从而获得一个关于需要生成的扫描器的描述。此描述叫做规则,由正则表达式和 C代码对组成。Flex 的输出是一个 C 代码文件——lex.yy.c——其中定义了yylex() 函数。编译输出文件可以生成一个可执行文件。当运行可执行文件的时候,它分析输入文件,为每一个正则表达式寻找匹配。当发现一个匹配时,它执行与此正则表达式相关的C代码。Flex 不是GNU工程,但是GNU为Flex 写了手册。
二、flex使用示例:实现Ubuntu中wc的功能
-
article.txt文件的内容如下,
wc
的功能就是统计该文件中的行数、单词及字符个数。
wc统计结果
-
article.txt文件的内容如下,
- 编写countNum.l程序如下
%{
#define T_WORD 1
int numChars = 0, numWords = 0, numLines = 0; //初始化字符、单词、行数
%}
WORD ([^ \t\n\r\a]+) //匹配单词
%%
\n { numLines++; numChars++; } //匹配换行
{WORD} { numWords++; numChars += yyleng; return
T_WORD; }
<<EOF>> { return 0; } // 文件结束
. { numChars++; } //其他字符
%%
int main() {
int token_type;
while (token_type = yylex()) {
printf("WORD:\t%s\n", yytext);
}
printf("\nChars\tWords\tLines\n");
printf("%d\t%d\t%d\n", numChars, numWords, numLines);
return 0;
}
int yywrap() {
return 1;
}
- 3 执行
flex countNum
命令,生成一个lex.yy.c文件 - 4 执行
g++ lex.yy.c countNum
对lex.yy.c文件进行编译,生成countNum可执行程序 - 5 运行
./countNum < article.txt
,把article.txt输入到countNum中,打印统计结果
统计结果
三、flex解析
yylex()是由flex创建的扫描程序的入口点,调用yylex()启动或者重新开始扫描。Lex编写的yylex()从名为yyin的FILE *文件指针中读取字符。 如果未设置yyin,则默认为标准输入。 它输出到yyout,如果未设置默认为stdout。 还可以在yywrap()函数中修改yyin,该函数在文件末尾调用。 它允许打开另一个文件,并继续解析。如果是这种情况,将其返回0。如果要结束此文件的解析,将其返回1。一般来说,每次调用yylex()都会返回一个表示标记类型的整数值。
flex的结构如下:
%{ /*declaration*/ %}
/* Definition */
%%
/* Rules */
%%
/* C Code */
一个*.l的文件里的结构大概如上,用%%分隔开来。分为三个区:
- 定义区:包含一些简单的名字定义(name definitions)来简化词法扫描器(scanner)的规则,并且还有起始条件(start condition)的定义。(上个例子比较简单,并未涉及定义区)
- 规则区:包含了一系列具有pattern-action形式的规则,并且模式 pattern 位于行首不能缩进,action 也应该起始于同一行。(上例使用正则表达式给出)
- 用户代码区:代码将被原封不动地拷贝到输出文件中,并且这些代码通常会被扫描器调用,当然,该区是可选的,如果 Flex 源文件中不存在该区,那么可以省略第二个 " %%" 。
使用诸如Flex的词法生成器的好处是使得程序员可以集中考虑词法的特点;而不是具体如何实现词法分析。
网友评论