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

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 | TermTerm → Term * Factor | FactorFactor → ( Expr ) | digit其中,终结符号digit是0~9中的任何一个数字。该文法的YSP文件可编写如下:%{/*说明部分*/#include #include %}%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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值