- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
至此,我们希望已经激起了读者的学习。这一章并不是lex和yacc的完整
指南,我们只对lex和yacc的用法做一个初步的介绍。
最简单的lex程序
下面的lex程序将它的标准输入拷贝到标准输出:
%%
.|\nECHO;
%%
它的行为非常类似于不带参数运行的UNIXcat命令。
lex自动生成实际的C程序代码,这些代码负责处理读输入文件,有时(正如上
述情况下)也负责写输出。
使用lex和yacc无论是构建程序的一部分,还是构建辅助编程的工具,一旦你掌
握了它们,就会发现它们的价值:处理问题时它们能简化输入的,提供更易
的编码库,并且能很容易地“调整”出程序的正确语义。
用lex识别单词
让我们构建一个识别不同类型英语单词的简单程序。先标识词性(名词、动词等),
然后再扩展到处理符合简单的英语语法的多个单词的句子。
先列出要识别的一组动词:
isamarewere
wasbebeingbeen
dodoesdidwill
wouldshouldcancould
hashavehadgo
例1-1展示了识别这些动词的简单lex规范。
例1-1:单词识别程序ch1-02.l
%{
/*
*这个例子演示了(非常)简单的识别
*动词/非动词
*/
%}
%%
2
[\t]+/*忽略空白*/;
is|
am|
are|
were|
was|
be|
being|
been|
do|
does|
did|
will|
would|
should|
can|
could|
has|
have|
had|
go{printf(%s:isaverb\n,yytext);}
[a-zA-Z]+{printf(%s:isnotaverb\n,yytext);}
.|\n{ECHO;/*通常的默认状态*/}
%%
main()
{
yylex();
}
下面是编译和运行这个程序时进行的操作,键入的文字采用黑体字。
%example1
didIhavefun?
did:isaverb
I:isnotaverb
have:isaverb
fun:isnotaverb
?
^D
%
3
我们从第一部分开始解释正在运行的内容:
%{
/*
*这个例子演示了(非常)简单的识别
*动词/非动词
*/
%}
第一部分(定义段,即定义部分)介绍了将拷贝到最终程序中的原始C程序代
码。例如,如果有后来文件中的代码必须包含的头文件,那么这部分尤其重要。
用特殊的定界符“%{”和“%}”括起C代码。lex将“%{”和“%}”之间的内
容直接拷贝到生成的C文件,所以在这可以编写任何有效的C代码。
文档评论(0)