编译原理与实践作业答案 下载本文

作业题:

2.1(a,c,d), 2.8(a,c,d), 2.12, 3.3, 3.4, 4.8, 4.12

5.8(a,b,c), 5.12, 6.7, 6.8, 6.13 7.4, 7.15

第二章作业: 2.1 (a) a | a[a-z]*a

(c) [1-9][0-9]* (d) [0-9]*[02468]

2.8(a)

Start a a [b-z] [b-z]

a

正则表达式中丢了单独a的情况的比较多,另外有些同学在有NFA到DFA的转化过程

中,不能够正确的确定最终的状态,造成有两个终结状态的情况。 (c)

Start [0-9]

[1-9]

(d)

问题比较多,建议同学画出DFA图生成的全部过程。

2.12

3.4

a a a b a bb b a a b b b a (c).rewrite this grammar to establish the correct precedences for the operator.

rexp -> rexp “|” rexp1 | rexp1 rexp1 -> rexp1 rexp2 | rexp2 rexp2 -> rexp3 * | rexp3 rexp3 -> (rexp) | letter 左结合 4.8

(a) 消除左递归

lexp -> atom | list atom -> number | identifier list -> (lexp-seq) lexp-seq -> lexp lexp-seq’ lexp-seq’ -> lexp lexp-seq’ | ?

first (lexp)= { number ,identifier,( } first (atom)= { number, identifier } first (list) = { ( }

first (lexp-seq)= { number ,identifier,( } first (lexp-seq’)= { number ,identifier,( , ?}

follow(lexp)= { $,),number,identifier,(} follow (atom)= { $,), number,identifier,( } follow (list) = {$,), number,identifier,(} follow (lexp-seq)= { )} follow (lexp-seq’)= { )} M[N,T] lexp atom list lexp-seq lexp-seq’

4.12

(a) LL(1)文法不会是二义的,因为它的分析表的每个入口是唯一的。就不会是二义文法

了。

(b) 二义文法也不可能是LL(1)的,否则在LL(1)的parsing table 中会产生各种冲突。 非二义的文法不一定是LL(1)的,因为二义文法是非LL(1)文法的一个因素,但不是唯一的因素。如一些带有左递归的文法也不是LL(1)文法。

number lexp->atom atom->number lexp-seq’ lexp-seq’ identifier lexp->atom atom->identifier lexp-seq’ lexp-seq’ ( lexp->list list -> (lexp-seq) -> lexp-seq’ lexp-seq’ ? ) lexp $ lexp-seq -> lexp lexp-seq -> lexp lexp-seq lexp-seq’ -> lexp lexp-seq’ -> lexp lexp-seq’ -> lexp lexp-seq’ -> 第五章作业 5.12 s’ ?s

s?a A d | b B d | a B e | b A e A?c B?c c·, e A?B? c·, d A c b s’ ?s·,$ s’ ?·s,$ s?·a A d,$ s ?·b B d ,$ s?· a B e,$ s? ·b A e,$ a A?c·, d B?c·, e c s ?b·B d ,$ s? b·A e,$ A?·c, e B?·c, d B B s?a·A d,$ s?a·B e,$ A?·c, d B?·c, e s?aB·e,$ s?aBe·,$ A s?aA·d,$ s? bA·e,$

5.8 Consider the following grammar

declaration -> type var-list type -> int | float

var-list -> identifier, var-list | identifier

(a) declaration -> type var-list

type -> int | float

var-list -> var-list, identifier | identifier

s?aAd·,$ s?bAe· ,$ s?bB·d,$ s?bBd·,$ (b) decl -> type vlist

type -> int

type ->float 7 vlist -> vlist, id vlist -> id

Decl-> . type vlist type->.int type ->.float 6 0

decl -> type. vlist 1 vlist -> . vlist , id 2 vlist -> .id

id vlist -> vlist, .id id 4 vlist -> id. 3

5 follow(decl)= { $ }, follow(type)= { id } follow(vlist)= { $, , }

(c ) construct the SLR(1) parsing table for the rewritten grammar state 0 1 2 3 4 5 6 7 6.7

input int 6 float 7 id 3 5 r2 r3 , 4 r5 r4 $ r1 r5 r4 goto type 1 Decl vlist 2 vlist -> vlist, id. type vlist decl -> type vlist. vlist -> vlist. , id , type -> float. type->int.