lex 文件结构
lex 文件命名通常以 .l 结尾,共分为三个部分,由 %%
分割。
声明部分
%{
会被原封不动拷贝到生成的文件中
%}
选项设置及预定义一些常用的模式
%%
规则定义部分,一个规则包含一个模式和一个动作
REG
{C 语言代码, return 一个 Token
}
其中 reg 是正则表达式模式,每读取的字符匹配了一个模式,就执行规则 {}
里面的动作代码,返回一个 TOKEN。其中模式必须出现在行首,如果有俩个模式匹配,则选取其中最长的,也就是最长匹配原则
规则定义部分,也可以包含一个 %{ C 代码 %}
块,其中的 C 代码会被执行一次,这通常可以用来返回一个 TOKEN,这个 TOKEN 会加在所有的 TOKEN 之前
%%
子例程,也就是 C 语言的 函数定义,会被拷贝到生成的此法额分析器 C 代码中
Flex
三层输入
-
默认使用标准输入或者yyin文件句柄读取,yyrestart() 重置输入状态,用来读取多个输入文件。
-
创建并使用 YY_BUFFER_STATE 输入缓冲区
-
#define YY_INPUT(buf, result, max_size)
当词法分析器的输入缓冲区为空时,就会调用 YY_INPUT,buf 是缓存区,result 等于实际存放在缓冲区的字符大小,max_size 缓存区的最大值。定义部分就是要把字符串拷贝到 buf 中。YY_INPUT 一般用于输入来自于其他一些内容,而这些内容无法预先载入字符串缓冲区且无法支持标准输入输出。
状态
定义:%x,%s
切换:BEGIN(S)
Bison
每次规约就会执行规则相关联的动作
yyparse() 会调用yylex()获取记号,yyval 或得记号值。
网友评论