• flex & bison学习(一)


    编译器是软件开发中的核心部件,其作用是其他任何软件所不能取代的。编译器在工作过程中,往往完成如下的任务:

    1. 读取源代码并且获得程序的结构描述
    2. 分析程序结构,并且生成相应的目标代码

    在UNIX早期时代,编写一个编译器是一件非常耗时的工作。人们为了简化开发过程,开发了Lex和YACC程序来解决第一个任务,根据用户描述的语言,生成能够解决问题的C/C++语言代码,供开发者使用。

    1. 将源代码文件分解为各种词汇(Lex)
    2. 找到这些词汇的组成方式(YACC)

    GNU软件协会开发了Flex和BISON,其功能与LEX和YACC基本兼容,并且在Lex和YACC提供的功能的基础上进行了各种扩展。

    下面是一个统计单词个数的flex代码,类似于unix下的wc

    /* fb1-1 just like unix wc */
    %{
    int chars = 0;
    int words = 0;
    int lines = 0;
    %}

    %%

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

    %%

    main()
    {
      yylex();
      printf("%8d%8d%8d\n", lines, words, chars);
    }

    用flex进行编译

    $ flex fb1-1.l

    $ cc lex.yy.c -lfl

    $ ./a.out

    This is a test.

    ^D

    即可看到单词结果

    其中

    int chars = 0;
    int words = 0;
    int lines = 0;

    三句作为第一段定义了三个变量,并初始化

    第二段为统计,使用正则表达式进行匹配

    第三段为主函数,每段之间用%%号分开

  • 相关阅读:
    C# 类 (7)
    C# 类 (6) -继承
    C# 类 (5)
    c# 类(4)
    C# 类(3)
    c# 类(2)
    C# 类 (1)
    C# 零碎知识点
    VINS_Fusion 初始化过程
    视觉SLAM(一)预备课程与基础知识
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2250123.html
Copyright © 2020-2023  润新知