yacc是一个生成编译程序的工具,它的输入是文法G的产生式规则,它的输出是文法G的(29)。

admin2013-05-11  27

问题 yacc是一个生成编译程序的工具,它的输入是文法G的产生式规则,它的输出是文法G的(29)。

选项 A、优先分析器
B、LL(1)分析器
C、LR(1)分析器
D、LALR(1)分析器

答案D

解析 一个LR分析器由以下3个部分组成。
   (1)驱动器:或称驱动程序。对所有LR分析器,驱动程序都是相同的。
   (2)分析表:不同的文法具有不同的分析表。同一文法采用不同的LR分析方法时,分析表也不同。分析表又可分为动作表(ACTION)和状态转换表(GOTO)两个部分,它们都可用二维数组表示。
   (3)分析栈:包括文法符号栈和相应的状态栈。
   分析器的动作由栈顶状态和当前输入符号决定(LR(0)分析器不须向前查看输入符号), LR分析器的模型如下图所示。
  
   设Si为状态,i为文法符号,ACTION[Si,a]=Sj规定了栈顶状态为Si且遇到输入符号 a时应执行的动作。状态转换表GOTO[Si,X]=Sj表示当状态栈顶为Si且文法符号栈顶为X时应转向状态Sj。分析表实际上是一个DFA,它识别文法G的所有右句型的活前缀。构造 LR分析器,本质上是构造LR分析表。根据文法的产生式规则,LR分析表用程序能自动生成。
   yacc的输入,本质上是文法的产生式规则,称为yacc的源程序,通过yacc编译程序,生成用C书写的LALR(1)分析表。再经过C编译器,就得到LALR(1)分析器。
   LALR(1)分析器比SLR(1)适用的文法范围要宽,一般能满足常用程序语言的需要;和LR(1)比,它适用的文法范围要窄,但时空效率都有很大提高。
转载请注明原文地址:https://kaotiyun.com/show/CnRZ777K
0

相关试题推荐
最新回复(0)