随笔 - 49  文章 - 0  评论 - 6  阅读 - 10万

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 \n      ++num_lines; ++num_chars;
  6 .       ++num_chars;
  7
  8 %%
  9 main()
 10 {
 11     yylex();
 12     printf( "# of lines = %d, # of chars = %d\n", 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”文件中, 可以放在定义和规则的段里, “%{” “%}”一定不能有缩进。

%}

 

posted on   朱迎春  阅读(761)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示