定义部分
%%
规则部分
%%
辅助程序
在规则部分,正规式与处理之间要用空格隔开,不然会报错
规则部分,正规式后面的其实是c语言片段。
简单来说,就是输入流经过这个编译文件进行扫描,当扫描到与正规式相符的时候,就进行后面所对应得c语言片段。
给每一个终结点正规式一个处理片段。
举个例子
{whitespace}*[.,?!]{whitespace}*{word} {//解决句号、逗号、问号、感叹号
for(j=0;j<yyleng;j++){
if(ispunct(yytext[j])){
printf("%c ",yytext[j]);
break;
}
}
for(j=j+1;j<yyleng;j++){
if(isalnum(yytext[j])){
break;
}
}
yyless(j);
}
yyless(n)指的是将yytext的0-n个字符保留,剩下的还给输入流进行下面的匹配。
个人感觉这样做会比较好,因为如果下一个字符匹配了这个字符,那么流中就没有它了,那么后面得匹配就可能出问题,这是此次作业中我感觉比较好的收获吧。
至于书中提到的
ECHO :LEX的默认行为(将yylex输出到yyout)
BEGIN:后面跟某个开始条件名,激活该开始条件对应的词形
REJECT:放弃当前匹配的字符串和当前规则,让分析器重新扫描并选择另一个规则。
yylex():LEX的扫描过程。
yymore():将当前识别的字符串保留在yytext中,下一次被匹配的字符串将被添加到当前串之后。
yyless:...
yywrap():LEX读到输入文件结束时自动调用,判断对输入的处理是否全部结束。
很多压根没有用到,但是个人觉得光是一个简单的yyless就让整个过程那么简单了,这些内置的函数自有她存在的道理
如果有朋友知道的话可以留言一下我们一起讨论!
以后再用到的时候研究一下!
新的感悟,把词法理论应用到实际编程中还是很重要的。例如dfa,我们需要寻找一个开始符,在作业中,我们可以用{word}作为开始符
所有的正规式都用word开始,然后把最后的那个word还给输入流,这样就不会有重复的识别了。
同时我想到,如果用flex编写一个编译器,用自己定义的词法生成一个应用文件。比如说python。那么就可以创建一个自己的小程序了。
比如复习时用的提纲什么的。
比如输入 最右推导:定义。。
然后对应的c片段是在.py文件中写相应的代码。。。
但是又想到flex中输入输出中文貌似会有问题吧!看来路还很长呢。