zoukankan      html  css  js  c++  java
  • lex/flex 学习笔记 一

    lex/flex,词法分析器,在文本中查找特定模式的字符串,并触发相应的操作,lex内部使用状态机实现,速度比手写的词法分析更快。

    环境:Ubuntu14

    安装编程环境:

    $ apt-get install build-essential g++ xorg-dev libx11-dev libgtk2.0-dev

    安装flex和bison:

    $ sudo apt-get install flex bison

    第一个lex文件 a.l :

      1 %{
      2 int num_lines = 0, num_chars = 0;
      3 %}
      4 %%
      5       ++num_lines; ++num_chars;
      6 .       ++num_chars;
      7
      8 %%
      9 main()
     10 {
     11     yylex();
     12     printf( "# of lines = %d, # of chars = %d ", num_lines, num_chars );
     13 }

    编译运行:

    通过lex命令将a.l编译成词法解析程序的源代码,缺省文件名是lex.yy.c。

    $ lex a.l
    $ gcc lex.yy.c   // 有错误,提示缺少yywrap()函数
    $ gcc lex.yy.c -ll // 直接链接lex的llib.a,也可以自己在a.l中写一个空函数

    $ ./a.out < a.l
    # of lines = 13, # of chars = 200

    Lex文件的基本语法,一共三个段,中间用两个“%%”隔开:

    定义段

    %%

    规则段

    %%

    用户代码段

    定义段基本语法(不能有缩进):

    DIGIT [0-9]

    ID [a-z][a-z0-9]*

    定义段的: /*注释内容*/ 也会被复制到输出“.c”文件中。

    规则段基本语法:

    pattern action

    规则中也可以通过/**/加注释,但不会被复制到输出".c"文件中。  

    用户代码段:

    原样复制到输出的“.c”文件中

    补充:

    在定义和规则段,任何缩进的文本,或者是放在“%{”“%}”之间的内容会被原封不动的复制到输出".c"文件中。

    %{

        这里的内容会被原封不动复制到输出“.c”文件中, 可以放在定义和规则的段里, “%{” “%}”一定不能有缩进。

    %}

  • 相关阅读:
    Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析
    Oracle Instant Client 安装配置
    Android Studio配置文件路径修改
    Java压缩技术(三) ZIP解压缩——Java原生实现
    Java压缩技术(二) ZIP压缩——Java原生实现
    Java压缩技术(一) ZLib
    [JavaEE] JBoss主要版本下载链接一览
    EL表达式
    如何实现hibernate的缓存机制
    如何理解hibernate当中的锁机制
  • 原文地址:https://www.cnblogs.com/zhuyingchun/p/5289674.html
Copyright © 2011-2022 走看看