1、Introduction of Flex,概要,flex是一个用于生成扫描器的工具,扫描器可识别文本中的词法模式。 flex从给定的输入中读取有关要生成的扫描器的说明。这种说明的格式是一对正规表达式和C代码,称之为规则。 flex的输出是名为lex.yy.c的C源程序,它可编译生成exe程序。执行该程序,它会分析输入,察看是否满足正规表达式,只要它发现一个,就会执行相应的C代码。,flex编译器的实现步骤,对flex源程序识别规则中的每个pi构造一个相应的NFA Ni 引入唯一初态S,从初态S通过弧将所有NFA Ni(i=1,n)连接成新的NFA N 对NFA N确定化,产生DFA N DFA
2、 N 最小化 给出控制程序。控制程序的作用是激活有限自动机,即控制输入字符串在有限自动机上运行,一旦达到终态,即识别出flex源程序模式描述的某个单词,转去调用相应的动作部分就可以了,使用方法,下载并安装flex包( 将flex.exe所在路径加入Path 编写 .l 文件,作为flex的输入文件 运行flex.exe *.l生成lex.yy.c源文件 使用VC6打开lex.yy.c文件,编译成exe 运行exe文件分析输入字符串,词法分析器源文件 .l,格式,% c程序定义 % 声明部分(正则表达式定义) % 规则定义(对应Token的处理方法) % 其他辅助过程,全局变量,File*yyi
3、n File*yyout char*yytext int yyleng,函数,yymore(), yyless(int n), yywrap(), input(), output(char c), unput(char c),示例1,输入文件中,所有标识符的数量 digit = 0-9 letter = a-zA-Z ID = letter(letter|digit)*,注意事项,匹配优先规则: 能匹配的最长的规则优先 匹配长度相等时,按顺序 考虑全面 尽量描述每种可能的输入情况(包括错误或不处理的情况),示例2,计算输入文件的字符数、单词数以及行数 tn+ n .,示例3,Tiny扫描程序的实现,Reserved Words Special Symbols Other if + number then - (1 or more digits) else * end / repeat = until identifier read ( (1 or more letters) write ) ; :=, :Comments,Flex Examples.rar在Course page中提供下载,Thanks,