lex-两年前的文章了。。
2008年11月17日 阅读(1,881)
2006-4-26日 星期三 凌晨1.08 作者:phylips@bmy
九点之前搞了一下关于编译原理的词法分析器的东西,使用java语言写的。搞得流程全是自己判断的。虽然之前我曾经
考虑到可以使用几种方案来实现。根据老师的要求有三种:1。手工实现2。采用LEX自动生成。3。采用老师提供的一个scanerlib 。由于那个lib使用的是C#,其实我也不知道是啥,也没看,只是听别人说的,所以便放弃了第3种方案。而第一方案侧重于程序逻 辑的编写,主意是编码。而第二种则侧重于工具的使用,以及个人学习的能力。
其实按照我的想法其实也是三种方案,跟老师的大同小异,首先我认为手工实现有两种方式,一种就是纯手工的,另一种则是充分利用java的正则表达式。由于java自1.4版本对正则表达式提供了强大的支持。所以依靠它应该完全可以解决词法分析的问题。
完全手工实现,即自己编码判断是标识符还是数字。
无论是手工实现还是采用正则表达式均需要比较大的力气,且通用性不好。
考虑到LEX的简便性,可以为广大的对编程不熟悉的人使用。
为了服务于广大贫民阶层,我对此进行了简单的研究。
本来只是知道lex是个词法分析器,可以根据定义的规则,进行分析,产生转换矩阵。
直到今天看了,才对他真正的流程有了点了解。仅做如下总结:
FLEX的工作流程如下
lex程序-〉c程序-〉编译执行c程序
可以看到,lex利用自己定义的语言(或者协议),自己进行编译,生成了C原言的源程序。在这个c的源程序里,有保存了转换矩阵信息的二维数组。
lex使用方法:
一开始的时候,直接双击FLEX.exe,但是没有反应。
1。正确的方式,为进入cmd命令行,使用flex file.l命令进行编译,才会生成了file.yy.c的c语言源代码。
2。然后将此c语言程序,使用c的编译器,编译执行即可以。
其间还碰到过如下问题:
1.由于采用了人家的源程序,有些地方导致include **.h文件找不到,而无法编译
2.直接从网页上拷贝源代码,使用flex命令出现如下错误premature EOF的错误,无法生成c的源文件
解决方法:自己重新建立文件,一个一个输入,而不要从网页上直接拷贝。估计跟采用的编码有关。
3.自己定义俄main函数,生成的c文件,编译有错误。
打开c文件:可以发现这里有两个main方法,删掉不是你定义的那个,再试一下。
下面简要介绍一下flex源程序的语法:
以下几点可以记住
1.%{ %}内的东西,直接输到生成的c文件中。
2.附加函数部分,也是直接输到生成的c文件中。
3.书写lex实际上很多一部分除了定义规则外,就是书写c语言了
4.如果要进行文件操作,需要对FILE *yyin,*yyout:为指向字符输入和结果输出文件的指针。如用户未对其定义,则设为标准输入文件stdin和stdout。
5.同时要注意识别时flex遵循两个原则:
one:规则定义在前面的优先进行匹配,这就要求关键字要写在标识符前面
two:进行最长匹配
6.有时候
如果,{a }与{a}某个规则的名称错了,最常见的是末尾加入了空格,出现如下错误提示:
EOF encountered inside an action
如果 {a}{printf("error");}而应当是{a} {printf("error");}
EOF encountered inside an action
7.出现如下警告:
8.以下可用变量:
常用全局变量和宏