flex 学习笔记

来源:互联网 发布:怎样备份数据 编辑:程序博客网 时间:2024/06/06 00:15

定义部分

%%

规则部分

%%

辅助程序


在规则部分,正规式与处理之间要用空格隔开,不然会报错

规则部分,正规式后面的其实是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中输入输出中文貌似会有问题吧!看来路还很长呢。

原创粉丝点击