第二章答案.docx
- 文档编号:7953702
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:13
- 大小:76.35KB
第二章答案.docx
《第二章答案.docx》由会员分享,可在线阅读,更多相关《第二章答案.docx(13页珍藏版)》请在冰豆网上搜索。
第二章答案
第二章部分习题答案
2.1考虑文法
S→SS+|SS*|a
a)证明文法可生成符号串aa+a*
解:
S→SS*→SS+S*→aS+S*→aa+S*→aa+a*
b)为此符号串构造语法树
解:
c)文法生成什么样的语言?
证明结论
解:
将a看作运算数,文法生成语言L={支持加法、乘法的表达式的后缀表示形式}
证明类似2.2题b)
=====================================
2.2下列文法生成什么样的语言?
证明你的结论。
是否有二义性?
a)S→0S1|01
解:
生成语言L={0n1n|n>=1}
证明:
1)证文法推导出的符号串都在L中
i)考虑最小语法树
,推导出的符号串01显然∈L
ii)假定结点数 考虑结点数=n的语法树S,其结构必为 , 子树S1结点数 S对应符号串为t=0t11,因此t∈L 综合i)、ii),1)得证 2)证L中符号串都可由文法推导出 i)L中最短符号串01,显然可由文法推导出 ii)假定L中长度<2n的符号串都可由文法推导出, 考虑长度=2n的符号串t=0n1n,它可表示为0t11, t1∈L且长度<2n,因此它可被文法推导出,对应语法树 , 构造语法树 ,显然,它的输出为t,即t可被文法推导出 综合i)、ii),2)得证 综合1)、2),文法生成的语言即为L 另外,文法没有二义性 ===================================== b)S→+SS|-SS|a 解: 生成语言L={支持加法、减法的表达式的前缀表示形式} 证明: 1)证文法推导出的符号串都在L中 i)考虑最小语法树 ,推导出的符号串a显然∈L ii)假定结点数 考虑结点数=n的语法树S,其结构必为 , 子树S1、S2结点数 S对应符号串为E=+/-E1E2,E也是前缀表达式。 综合i)、ii),1)得证 2)证L中符号串都可由文法推导出 i)L中最短符号串a,显然可由文法推导出 ii)假定L中长度 考虑长度=n的符号串E,它的形式必为+/-E1E2, E1、E2∈L且长度 、 , 构造语法树 ,显然,它的输出为E,即E可被文法推导出 综合i)、ii),2)得证 综合1)、2),文法生成的语言即为L 另外,文法没有二义性 ===================================== c)S→S(S)S|ε 解: 生成语言L={括号匹配的符号串,包括ε} 证明: 1)证文法推导出的符号串都在L中 i)考虑最小语法树 ,推导出的符号串ε显然∈L ii)假定结点数 考虑结点数=n的语法树S,其结构必为 , 子树S1、S2、S3结点数 S对应符号串为t=t1(t2)t3,显然t∈L。 综合i)、ii),1)得证 2)证L中符号串都可由文法推导出 i)L中最短符号串ε,显然可由文法推导出 ii)假定L中长度 考虑长度=n的符号串t=(…),寻找它的∈L的最短前缀t’,则t=t’t1,t1∈L(可能为ε), t’的形式必为()或((…))(否则不是最短前缀),将它表示为t’=(t2),无论哪种情况,必有t2∈L, t1、t2长度 、 , 构造语法树 ,显然,它的输出为t,即t可被文法推导出 综合i)、ii),2)得证 综合1)、2),文法生成的语言即为L 另外,文法有二义性,符号串()()可对应两个语法树 ===================================== d)S→aSbS|bSaS|ε 解: 生成语言L={相同个数的a、b组成的所有符号串,包括ε} 证明: 1)证文法推导出的符号串都在L中 i)考虑最小语法树 ,推导出的符号串ε显然∈L ii)假定结点数 考虑结点数=n的语法树S,其结构有两种可能 , 子树S1、S2结点数 S对应符号串t=at1bt2或bt1at2,显然t∈L。 综合i)、ii),1)得证 2)证L中符号串都可由文法推导出 i)L中最短符号串ε,显然可由文法推导出 ii)假定L中长度 考虑长度=n的符号串t,考虑以a开头的情况t=a…(以b开头的情况类似), 寻找它的∈L的最短前缀t’,t’必有形式a…b(否则不是最短前缀), 将它表示为t’=at1b,显然t1∈L(可能为ε), 而t=t’t2,t2∈L,则t=at1bt2。 由i)图,可为t1、t2构造语法树,则可为t构造语法树,即t可被文法推导出 综合i)、ii),2)得证 综合1)、2),文法生成的语言即为L 另外,文法有二义性,符号串abab可对应两个语法树 ===================================== e)S→a|S+S|SS|S*|(S) 解: 生成语言L={支持加法等四种运算的表达式} 证明: 类似b) 文法是二义性文法,符号串a+a+a可构造两个语法树 ===================================== 2.4为下列语言构造非二义性的上下文无关文法(任选三个) a)后缀表示的算术表达式 解: E→+EE|-EE|*EE|/EE|num 证明参照2.3 b)以’,’间隔的左结合的标识符列表 解: list→list,id|id c)以’,’间隔的右结合的标识符列表 解: list→id,list|id d)包含整数和标识符,支持+、-、*、/的算术表达式 解: expr→expr+term|expr–term|term term→term*factor|term/factor|factor factor→id|num|(expr) e)在d)的基础上,添加一元+、-运算符 解: expr→expr+term|expr–term|term term→term*unary|term/unary|unary unary→+factor|-factor factor→id|num|(expr) ===================================== 2.5 a)证明文法 num→11|1001|num0|numnum 生成的二进制串所表示的数值均可被3整除 证明: 1)考虑规模最小的语法树,生成二进制串为11、110、1001、1100、1111,表示数3、6、9、12、15,均可被3整除 2)假定结点数 其结构有两种可能 ,子树num1结点数 ,子树num1、num2结点数 综合1)、2),命题得证 b)文法是否生成所有可被3整除的二进制串? 解: 不是。 二进制串10101,数值为21,可被3整除,但无法由文法推导出 ===================================== 2.6为罗马数字构造一个上下文无关文法 RomanNumeral→ThousandHundredsTensOnes Ones→LowOnes|IV|VLowOnes|IX LowOnes→ε|I|II|III Tens→LowTens|XL|LLowTens|XC LowTens→ε|X|XX|XXX Hundreds→LowHundreds|CD|DLowHundreds|CM LowHundreds→ε|C|CC|CCC Thousands→MThousands|ε ===================================== 2.7构造翻译模式,实现表达式中缀表示形式到前缀表示形式的转换。 构造9-5+2和9-5*2的注释语法分析树 解: expr→{print(‘+’);}expr+term |{print(‘-’);}expr–term |term term→{print(‘*’);}term*factor |{print(‘/’);}term/factor |factor factor→{print(num.value);}num |(expr) 9-5+2的语法树为 ,输出+-952 9-5*2的语法树为 ,输出-9*52 ===================================== 2.8构造翻译模式,实现后缀表达式到中缀表达式的翻译,构造95-2*和952*-的注释语法树 解: E→{print(‘(’);}E{print(‘+’);}E{print(‘)’};}+ |{print(‘(’);}E{print(‘-’);}E{print(‘)’};}- |{print(‘(’);}E{print(‘*’);}E{print(‘)’};}* |{print(‘(’);}E{print(‘/’);}E{print(‘)’};}/ |id{print(id.lexeme);} |num{print(num.value);} 95-2*的语法树 ,输出为((9-5)*2) 952*-的语法树 ,输出为(9-(5*2)) 显然,此解法括号有冗余情况,但结果是正确的 ===================================== 2.9构建一个语法制导翻译模式,将整数翻译成罗马数字 解: NTOnes、Tens、Hundreds表示整数的个、十、百位,Thousands表示千以上的所有位,Num表示完整的整数,每个NT设定一个属性roman,为字符串类型,代表罗马数字的表示形式。 假定存在chrrep(charc,intn)函数,它将字符c重复n次,形成一个字符串,作为返回结果,若n=0,则返回一个空串。 Num→ThousandsHundredsTensOnes {Num.roman=Thousands.roman||Hundreds.roman||Tens.roman||Ones.roman;} Thousands→digits{Thousands.roman=chrrep(‘M’,digits.val);} digits→digitsdigit{digits.val=digits.val*10+digit.val;} |ε{digits.val=0;} digit→small{digit.val=small.val;} |big{digit.val=big.val;} |4{digit.val=4;} |9{digit.val=9;} small→0{small.val=0;} |1{small.val=1;} |2{small.val=2;} |3{small.val=3;} big→5{small.val=5;} |6{small.val=6;} |7{small.val=7;} |8{small.val=8;} Hundreds→small{Hundreds.roman=chrrep(‘C’,small.val);} |big{Hundreds.roman=“D”||chrrep(‘C’,small.val);} |4{Hundreds.roman=“CD”;} |9{Hundreds.roman=“CM”;} Tens→small{Tens.roman=chrrep(‘X’,small.val);} |big{Tens.roman=“L”||chrrep(‘X’,small.val);} |4{Tens.roman=“XL”;} |9{Tens.roman=“XC”;} Ones→small{Ones.roman=chrrep(‘I’,small.val);} |big{Ones.roman=“V”||chrrep(‘I’,small.val);} |4{Ones.roman=“IV”;} |9{Ones.roman=“IX”;} ===================================== 2.10构建一个语法制导翻译模式,将罗马数字翻译成整数 解: 每个NT设定一个属性val,表示对应整数值 RomanNumeral→ThousandsHundredsTensOnes {RomanNumeral.val=Thousands.val+Hundreds.val +Tens.val+Ones.val; printf(“%d\n”,RomanNumeral.val;)} Ones→LowOnes{Ones.val=LowOnes.val;} |IV{Ones.val=4;} |VLowOnes{Ones.val=LowOnes.val+5;} |IX{Ones.val=9;} LowOnes→ε{LowOnes.val=0;} |I{LowOnes.val=1;} |II{LowOnes.val=2;} |III{LowOnes.val=3;} Tens→LowTens{Tens.val=LowTens.val;} |XL{Tens.val=40;} |LLowTens{Tens.val=LowTens.val+50;} |XC{Tens.val=90;} LowTens→ε{LowTens.val=0;} |X{LowTens.val=10;} |XX{LowTens.val=20;} |XXX{LowTens.val=30;} Hundreds→LowHundreds{Hundreds.val=LowHundreds.val;} |CD{Hundreds.val=400;} |DLowHundreds{Hundreds.val=LowHundreds.val+500;} |CM{Hundreds.val=900;} LowHundreds→ε{LowHundreds.val=0;} |C{LowHundreds.val=100;} |CC{LowHundreds.val=200;} |CCC{LowHundreds.val=300;} Thousands→MThousands1{Thousands.val=Thousands1.val+1000;} |ε{Thousands.val=0;} ===================================== 2.14 解: for语句对应堆栈机代码段如下 expr1的代码段 labeltest expr2的代码段 gofalseout stmt的代码段 expr3的代码段 gototest labelout stmt→for(expr1;expr2;expr3)stmt1{test=newlabel();out=newlabel(); stmt.t=expr1.t|| ‘label’test|| expr2.t|| ‘gofalse’out|| stmt1.t|| expr3.t|| ‘goto’test|| ‘label’out;}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)