Lex 和 Yacc 学习笔记(一):基本使用
Lex 的基本使用
安装
Ubuntu 18.10 下:
ubuntu$ sudo apt install flex
ubuntu$ sudo apt install bison
Lex 源文件的扩展名为 .l
Lex 源文件的基本结构
一个 Lex 源文件的基本结构是这样的:
定义(Definitions)
%%
规则(Rules)
%%
辅助代码(User Code)
定义部分
顾名思义,这一部分用于定义后面用到的名字。但实际上并不只是名字的定义,还包括环境的设置以及需要直接复制到 Lex 生成的 lex.yy.c 文件中的代码。
- 环境设置
目前了解很少,唯一知道的是,如果单独使用 Lex,需要在源文件的最前面加上%option noyywrap,否则可能会出错 - 需要复制的代码
格式如下:%{ // 代码 %} - 名字定义
格式如下:
需要注意的是,<名字> 一定要顶格写,前面不能有空白<名字> <定义>
规则部分
这一部分是 Lex 匹配 token 的规则列表,格式如下:
<模式> <动作>
动作是我们希望匹配到相应的模式之后被执行的 C 代码,可以是一条语句,也可以是由花括号({ })括起来的语句块。
注意
- 模式同样需要顶格写
- 动作起始的花括号要跟模式在同一行(大括号不换行)
辅助代码部分
目前了解不多,是我们定义的 C 代码,可以有 main 函数。
由 Lex 源文件生成可执行程序(单独使用 Lex)
在 Ubuntu 18.10 下,假设我们有一个名为 sample.l 的 Lex 源文件,那么将其变为可执行程序的过程如下:
ubuntu$ lex sample.l
ubuntu$ gcc lex.yy.c
执行完这两步之后,我们得到的 a.out 就是词法分析器,使用 ./a.out 运行之后,会发现阻塞,这个时候可以输入文字,最后按 Ctrl + D,就会得到词法分析的结果。
更多资料
[1] Flex 官方教程:传送门
[2] Lex & Yacc Tutorial:传送门
[3] Introduction to Flex:传送门
[4] 《编译原理》3.5 节
浙公网安备 33010602011771号