概念
子集构造算法
等价条件
一致性条件:状态 s 和 t 必须同时为可接受状态或不可接受状态
蔓延性条件:对于所有输入符号,状态 s 和 t 必须转移到等价状态
分割子集法
1 | // 状态编码 |
自动构造工具:是一类利用形式化描述如正规表达式自动生成程序的工具,也就是说,用户只需要用正规表达式描述单词模式,自动构造工具就可以自动生成用于词法分析的代码
lex:读入用户编写的一个 lex.l
的描述文件,生成一个名为 lex.yy.c
的 C 源程序文件,其中包含函数 yylex()
,用于读取源程序的字符流,并返回下一个 Token
全局变量
lex 的正规表达式匹配原则
假设有两个 pattern:ID = [A-Za-z]+ 和 NUM = [0-9]+;输入流是:abc123xyz
lex 描述文件:描述各种单词的模式,并为每种模式指定对应的 C 语言动作代码,每个部分之间用 %%
分割
定义部分:设定词法分析器的全局环境和基础配置
#include <stdio.h>
int num_lines=0;
#define ADDCOL() Column += yyleng;
D [0-9]
%option noyywrap
表示不自动调用 yywrap()
%x COMMENT
规则部分:定义了词法分析器如何从输入中识别各类单词,同时应该作出什么反应,格式通常为 正则表达式 {动作代码}
"if"
或 [ \t\n]
{ return IF; }
或 { return ~YYEOF; }
辅助代码部分:实现了词法分析器的运行入口及相关功能,可以配合后续语法分析器使用
int main() { yylex(); return 0; }
yywrap()
或 yyerror()
~YYEOF
是一个特殊的返回值,用来表明匹配到了无效字符,从而让词法分析器忽略当前匹配,继续扫描下一个 token
mylexer.l
$ lex mylexer.l
:生成 lex C 源程序文件 lex.yy.c
$ gcc lex.yy.c -ll -o mylexer
:链接 lex 库,生成可执行文件 mylexer
./mylexer < input.txt
:传递输入文件,执行可执行文件1 | %{ |
输入文本
1 | Hello world! |
输出结果
1 | Word: Hello |