龙书 第四章课后作业答案

  • 格式:doc
  • 大小:153.50 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

P1774.14 为练习4.3的文法构造一个预测语法分析器

bexpr→bexpr or bterm|bterm

bterm→bterm and bfactor | bfactor

bfactor→not bfactor|(bexpr)|true |false

解1 非递归方法

1)消除左递归

①bexpr→bterm A

②A→or bterm A

③A→ε

④bterm→bfactor B

⑤B→and bfactor B

⑥B→ε

⑦bfactor→not bfactor

⑧bfactor→(bexpr)

⑨bfactor→true

⑩bfactor→false

2)求first集与follow集

针对以同一非总结符开头的产生式右部求first集如果该非终结符能产生ε则需要求其follow集

①bexpr→bterm A first(bterm A)= {not,(,true,false}

②A→or bterm A first(or bterm A)={or}

③A→εfollow(A)=follow(bexpr)= {$, )}

④bterm→bfactor B first(bfactor B)={not,(,true,false}

⑤B→and bfactor B first(and bfactor B)={and}

⑥B→εfollow(B)=follow(bterm)=first(A)

因为first(A)= {or , ε} 包含ε

所以follow(B)=follow(bterm)

=first(A)∪follow(A)-{ε}={or, $, )}

⑦bfactor→not bfactor first(not bfactor)={not}

⑧bfactor→(bexpr)first((bexpr))={(}

⑨bfactor→true first(true)={true}

⑩bfactor→false first(false)={false}

表中空白处填error,表示调用错误处理程序

4)根据步骤3)编写预测分析程序

下面给出通用的预测分析算法,具体程序留给同学们根据算法自己完善。

repeat

X=当前栈顶符号;a=当前输入符号;

if X∈VT∪{#} then

if X=a then

if X≠# then {将X弹出,且前移输入指针}

else error

else

if M[X,a]=Y1Y2…Y k then

{将X弹出;依次将Y k…Y2Y1压入栈;

输出产生式X→Y1Y2…Y k }

else error

until X=#

注:

如果考虑错误恢复,上面的预测分析表还显得简单,应该将每个非总结符的follow集作为同步(sync)记号,便于错误恢复。具体留给感兴趣的同学深入研究

解2:递归下降方法

①消除给定文法中的左递归,并提取公因子:

bexpr→bterm {or bterm }

bterm→bfactor {and bfactor}

bfactor→not bfactor | (bexpr) | true |false

②用类Pascal语言写出其递归预测分析器

PROCEDURE bexpr;

BEGIN

Bterm

WHILE (lookahead =='or')

BEGIN

match ('or');

bterm;

END;

END;

PROCEDURE bterm;

BEGIN

bfactor;

WHILE (lookahead =='and');

BEGIN

match ('and');

bfactor;

END;

END;

PROCEDURE bfactor;

BEGIN

if (llokahead=='not')

then BEGIN

match ('not');

bfactor;

END

else if (lookahead=='(')

then BEGIN

match ('(');

bexpr;

match(')');

END

else if (lookahead =='true')

then match ('true)

else if (lookahead=='false')

then match ('false');

else error;

END;

P1784.24 图4-60给出了练习4.1中文法的算符优先关系,利用这些优先关系分析练习4.1(b)的句子。

S→(L)|a

L→L,S|S

解:

对每个终结符或$建立符号f与g,把f

(和g

)

分成一组。根据文法的算符优先关系表,画出如下的有向图。

优先函数如下:

用算符优先分析法分析句子(a,(a,a))

另外2个句子的分析略。

(也可不必如上面先构造优先矩阵在分析,亦可直接分析)

P1794.35 考虑下面文法

E→E+T|T

T→TF|F

F→F*|a|b

a)试为该文法构造SLR语法分析表

解:

该文法的拓广文法G'为

(0) E' → E

(1) E → E+T

(2) E → T

(3) T → TF

(4) T → F

(5) F → F*

(6) F → a

(7) F → b

其LR(0)项目集规范族和goto函数(识别活前缀的DFA)如下:

= {E'→·E, E→·E+T, E→·T, T→·TF, T→·F, F→·F*,F→·a, F→·b} I

={E'→E·, E→E·+T}

I

1

={E→T·, T→T·F, F→·F*, F→·a, F→·b}

I

2

={T→F·, F→F·*}

I

3

={F→a·}

I

4

={F→b·}

I

5

={E→E+·T, T→·TF, T→·F, F→·F*, F→·a, F→·b}

I

6

={T→TF·, F→F·*}

I

7

={F→F*·}

I

8

={E→E+T·, T→T·F, F→·F*, F→·a, F→·b}

I

9

求FOLLOW集:

FOLLOW(E)={+, $}

FOLLOW(T)={+, $, a, b}

FOLLOW(F)={+, $, a, b, *}