说明说明一章1lexyacc chap1.pdfVIP

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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)

183****7931 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档