网站大量收购独家精品文档,联系QQ:2885784924

510 语法分析程序的自动生成工具.doc

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
510 语法分析程序的自动生成工具

5.10 语法分析程序的自动生成工具 迄今为止,读者已经学习了语法分析和语义翻译的基本知识。从理论上讲,对于常见的程序设计语言的语法结构,我们已能构造相应的处理程序,以完成语法分析和语义翻译工作。本节,我们将介绍几种语法分析器的自动生成工具,这些工具可将用户输入的文法自动转换成LL或LR语法分析程序,除此之外,它们还允许用户在产生式中插入语义处理动作 (语义子程序),并在分析程序中的适当位置安排调用语义子程序的代码。目前,这些工具已在许多领域的软件系统研制过程中得到广泛的使用。 5.10.1 LALR(1)分析器的自动生成工具——YACC和OCCS YACC (Yet Another CompilerCompiler)是LALR(1)分析器的自动生成工具,它的第1版于70年代初发表,是美国贝尔实验室的软件产品 (作者为S.C.Johnson)。这个工具目前在UNIX,DOS等系统平台上广泛流行。OCCS (Other Compiler Compiler System)是由A.I.Holub开发的与YACC类似的工具[28]。与YACC不同的是,OCCS给用户提供了一个功能较为完善,基于窗口的调试系统yydebug.c,此调试系统能使用户实际观察分析动作中的处理过程和分析栈的变化情况,以及根据不同的栈状态及指定的输入符号设置断点等等。此外,OCCS比YACC有更完善的错误诊断机制,其输出的代码也比YACC有更好的可维护性。不过,二者的用法基本相同,本节主要介绍国内十分流行的YACC的用法,对于OCCS所特有的功能,则只作简要的说明。 使用YACC构造语法分析程序非常简便,它要求用户按一定规则编写出“文法处理说明文件”,简称YSP (Yacc SPecification)文件,文件的扩展名为“.y”。当输入YSP文件时,YACC就会自动构造出相应的C语言形式的语法分析器。该分析器主要包括由YACC提供的标准总控程序和一个LALR(1)语法分析表。其使用过程如图5 13所示。 在DOS系统下,使用YACC的格式为: YACC[选择项]filename.y 此命令根据用户输入的名为filename.y的YSP文件,使YACC自动生成相应的C语言形式的语法分析器源文件ytab.c (有的YACC系统生成的文件名为y.tab.c)。然后。用户可在C环境下将其编译成可执行文件。其工作过程如图5 14所示。 ??? 一、 YSP文件的结构 一个完整的YSP文件由说明、规则、程序三个部分组成,各部分之间以双百分号“%%”隔开: [说明部分] %% 规则部分 [%% 程序部分] 其中,用方括号括起来的说明部分和程序部分可以空缺,但规则部分则是必须的。因此,YSP文件的最简形式是: %% 规则部分 首先,我们以一个简单台式计算器中的处理程序的自动生成为例,说明怎样编写YSP文件。该计算器的功能为:读入一行算术表达式,然后计算并打印它的值。算术表达式的文法如下: Expr → Expr + Term | Term Term → Term * Factor | Factor Factor → ( Expr ) | digit 其中,终结符号digit是0~9中的任何一个数字。该文法的YSP文件可编写如下: %{/*说明部分*/ #include stdio.h #include ctype.h %} %tokendigit300 %%/*规则部分*/ Line:Expr ′\n′{printf(%d\n,$1);}/*打印表达式值*/ ; Expr:Expr ′+′ Term {$$=$1+$3;}/*Expr=Expr+Term*/ |Term/*Expr=Term*/ ; Term:Term ′*′ Factor {$$=$1*$3;}/*Term=Term*Factor*/ |Factor/*Term=Factor*/ ; Factor:′(′ Expr ′)′{$$=$2;}/*Factor=Expr*/ |digit/*Factor=digit的属性值*/ ; %%/*程序部分*/ int yylex(void)/*词法分析程序*/ { int c; c=getchar( );/*读入一个字符*/ if(isdigit(c))/*判别c是否为数字*/ { yylval=c-′0′; return digit; } return c; } void yyerror( )/*出错处理程序*/ { printf(Syntax error\n); } void main( ) { yyparse( );/*调用语法分析程序*/ } 下面分别论述YSP文件各部分的组成规则。 ??? 二、 YSP说明部分的组成 YSP文件中的说明部分用于定义规则部

文档评论(0)

zhuliyan1314 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档