- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Lex和Yacc应用方法(二).再识Lex与Yacc
Lex和Yacc应用方法(二).再识Lex与Yacc
草木瓜早在二十世记七十年代之前,编写编译器一直是一个非常费时的工作。但到了1975这
一年这一切却发生了重大转变,首先Stephen C. Johnson Lesk在贝尔实验室完成了
Yacc开发,为了配合yacc更好的协作, Mike Lesk和Eric Schmidt又完成了lex。从
而Lex和yacc成为计算机编译领域的重要理论,而这些工具也极大地简化了编写编译
器的工作。
后来Robert Corbett和Richard Stallman在此基础上又完成了bison。Jef Poskanzer,
Vern Paxson 也对lex作了大量改进,称为flex。
本系列文章的地址:/liwei_cmg/category/207528.aspx
一、Lex理论
Lex使用正则表达式从输入代码中扫描和匹配字符串。每一个字符串会对应一个动作。
通常动作返回一个标记给后面的剖析器使用,代表被匹配的字符串。每一个正则表达
式代表一个有限状态自动机(FSA)。我们可以用状态和状态间的转换来代表一个(FSA)。
其中包括一个开始状态以及一个或多个结束状态或接受状态。
我们以上文《Lex和Yacc应用方法(一).初识Lex》第一个例子详细说明:
exfirst.l
%{
#include stdio.h
%}
%%
[\n] ; A
[0-9]+ printf(Int : %s\n,yytext); B
[0-9]*\.[0-9]+ printf(Float : %s\n,yytext); C
[a-zA-Z][a-zA-Z0-9]* printf(Var : %s\n,yytext); D
[\+\-\*\/\%] printf(Op : %s\n,yytext); E
. printf(Unknown : %c\n,yytext[0]); F
%%
这里使用一相对简单的输入文件 file.txt
i=1.344+39;
bcd=4%9-333
我们假定,
Lex 系统创建一动态列表:内容+规则+状态
Lex 状态:1 接受 2 结束
接受表示该元素可以做为模式匹配
结束表示该元素已完成模式匹配
读入“i”
[查找元素]查找相邻且状态为1的元素,无元素,
[匹配规则]D,
[新增列表元素1并置数据](存在则覆盖)状态为1,规则为D,内容为i。
[操作顺序符] 1
读入“=”
[查找元素]查找相邻且状态为1的元素,“i=”寻找匹配规则,无规则
[置上一元素]元素1状态为2
[匹配规则]F,
[新增列表元素2并置数据](存在则覆盖)状态为1,规则为F,内容为=
[操作顺序符] 2
读入“1”,
[查找元素]查找相邻且状态为1的元素,“=1”寻找匹配规则,无规则
[置上一元素]元素2状态为2
[匹配规则]B,
[新增列表元素3并置数据](存在则覆盖)状态为1,规则为B,内容为1
[操作顺序符] 3
读入“.”
[查找元素]查找相邻且状态为1的元素,“1.”寻找匹配规则,无规则,但有潜在规则C
[匹配规则]F,
[新增列表元素4并置数据](存在则覆盖)状态为1,规则为F,内容为.
[置上一元素]元素3状态为1
[操作顺序符] 4
读入“3”
[查找元素]查找相邻且状态为1的元素,“1.3”寻找匹配规则,有规则
[置起始元素]状态为1,规则为C,内容为1.3
[操作顺序符] 3 组合元素的起始操作符
读入“4”
[查找元素]查找相邻且状态为1的元素,“1.34”寻找匹配规则,有规则
[置起始元素]状态为1,规则为C,内容为1.34
[操作顺序符] 3 组合元素的起始操作符
读入“4”
[查找元素]查找相邻且状态为1的元素,“1.344”寻找匹配规则,有规则
[置起始元素]状态为1,规则为C,内容为1.344
[操作顺序符] 3 组合元素的起始操作符
读入“+”
[查找元素]查找相邻且状态为1
文档评论(0)