美文网首页
词法分析工具flex的安装及使用(Ubuntu)

词法分析工具flex的安装及使用(Ubuntu)

作者: Minority | 来源:发表于2020-02-21 11:07 被阅读0次

一、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的功能

    1. article.txt文件的内容如下,wc的功能就是统计该文件中的行数、单词及字符个数。

      wc统计结果
    1. 编写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的词法生成器的好处是使得程序员可以集中考虑词法的特点;而不是具体如何实现词法分析。

参考:https://zhuanlan.zhihu.com/p/65490271

相关文章

网友评论

      本文标题:词法分析工具flex的安装及使用(Ubuntu)

      本文链接:https://www.haomeiwen.com/subject/hbiqqhtx.html