美文网首页
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