美文网首页
Flex语法浅析

Flex语法浅析

作者: Erich_Godsen | 来源:发表于2021-10-17 19:41 被阅读0次

不了解Flex的同学,可以先温习一下上一节的内容Flex和Bison背景介绍

字数统计实例介绍

我们先通过一个例子来给大家介绍Flex的语法规则,这个例子的主要作用是统计我们输入内容的行数,单词数和字符数,代码示例如下:

%option noyywrap
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
/*
1. 变量yytext总是被设为指向本次匹配的输入文本
2. . 在正则表达式中代表任意一个字符

**/
%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n        { chars++; lines++;}
.         { chars++;}
%%

int main(int argc, char **argv)
{
    yylex();
    printf("%8d%8d%8d\n", lines, words, chars);
}

整个程序结构包含三个部分,各部分通过%%来分割。
第一部分主要包含声明和选项设置。在声明部分%{%}之间的代码会直接拷贝到C文件的开头部分,示例代码中主要是声明了三个整形变量,用来分别统计字符数,单词数和行数。

第二部分主要包含匹配模式和相应的动作。在示例代码中第一条正则表达式[a-zA-Z]+主要用来匹配一个单词,当成功匹配到单词后,会将变量word1,同时将字符数加上单词的长度(strlenC语言中获取字符串长度的库函数),第二条\n匹配换行符,当成功匹配后,行数加1,字符数也加1,最后一条.匹配的是除换行符 \n之外的任何单字符,匹配成功以后字符数加1

第三部分则是直接拷贝到词法分析器中的C代码。在示例代码中会将主函数拷贝到生成的C文件中,当运行程序时,会首先调用main函数,在其内部负责调用Flexyylex函数开始词法分析,并打印出分析之后的结果,包括行数,单词数,字符数。

编译和运行示例代码

在Mac平台下编译示例如下:

% flex fb1_1.l
% gcc lex.yy.c -o fb1 -lm

如果是Window或者Linux下编译,链接选项更改为-lfl,当第一行命令执行完以后当前文件夹下应该会生成一个lex.yy.c文件,有兴趣的同学可以对照着上面的示例代码比对一下,看一看Flex是如何处理我们的示例代码的。当第二行命令执行完以后,当前文件夹下应该会生成一个fb1可执行文件,然后执行当前文件,输入测试代码,按Control+D后会显示出统计的行数,单词数和字符数

% ./fb1 
Hello World
       1       2      12    

通过上面的示例代码,大家应该可以深刻的体会到,要想编写好Flex程序,首先要熟悉正则表达式。

本节的内容就先到这里,谢谢大家~

相关文章

网友评论

      本文标题:Flex语法浅析

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