下面的答案仅供参考!
1.按照表6.1所示的属性文法,构造表达式(4*7+1) *2的附注语法树。
答:
首先考虑最底最左边的内部结点,它对应于产生式F→digit,相应的语义规则为F. val: = digit.lexval,由于这个结点的子结点digit的属性digit . lexval的值为4,所以决定了结点F的属性F.val的值也为4。同样,在F.结点的父结点处,属性T.val的值也算得为4。
再考虑关于产生式T→T1*F的结点。这个结点的属性T.val的值由下面的语义规则确定:
当在这个结点应用语义规则时,根据规则T→T1*F得到左子结点,val的值为4,从右子结点得到F.val值为7。因此,在这个结点中算得T.val的值为28。再由E→T知E.val的值为28。
再考虑关于产生式E→E1+T的结点。这个结点的属性T.val的值由下面的语义规则确定:
根据规则E→E+T得到左子结点,val的值为28,从右子结点得到T.val值为1。因此,在这个结点中算得E.val的值为29。再由F→(E)知F.val的值为29。再由T→F知T.val的值为29。
再考虑关于产生式T→T1*F的结点。这个结点的属性T.val的值由下面的语义规则确定:
当在这个结点应用语义规则时,根据规则T→T1*F得到左子结点,val的值为29,从右子结点得到F.val值为2。因此,在这个结点中算得T.val的值为58。再由E→T知E.val的值为58。
最后,包含开始符号L的产生式L→En对应的语义规则打印出通过E得到的表达式的值。
2. 对表达式((a) + (b)):
① 按照表6.4所示的属性文法构造该表达式的抽象语法树;
表6.4是一个为包含运算符号+和-的表达式建立抽象语法树的S-属性文法。它利用文法的基本产生式来安排函数mknode和 mkleaf 的调用以建立语法树。E和T的综合属性nptr是函数调用返回的指针。
按表6.4所列的属性文法,表达式((a) +(b))带注释的语法分析树如图5.7所示。其中,构造出的抽象语法树用实线表示,语法分析树用虚线表示,语法分析树之中的E和T标识的结点中用综合属性nptr来保存指向抽象语法 树中该非终结符号对应的结点的指针(图中用带箭头的虚线表示)。
标识符和一个数的新的叶结点的指针。属性id.entry和 num.val是词法值,假设这些值是由词法分析器提供的。
② 按照图6.17所示的翻译模式,构造该表达式的抽象语法树。
按如图6.17所示的翻译模式,表达式((a)+(b))带注释的语法分析树如图5.8所示。为了使图清晰,省略了部分节点的nptr、s和i属性在图中的表示。
3.设+运算具有左结合性,试画出下列表达式的DAG图:
a+a+(a+a+a+a(a+a+a+a))
不知道是不是多打了一个a? 贴另外一个题的解法。
设+运算具有左结合性,试画出下列表达式的DAG图:
a+a+(a+a+a+(a+a+a+a))
1 id a 2 + 1 1 3 + 2 1 4 + 3 1 5 + 3 4 6 + 2 5
4.设+、-、*、/运算都具有左结合性,试设计一个属性文法,删除算术表达式中冗余的括弧。例如,若已知表达式为((a* (b+c))* (d))应改写成a * (b+c)* d。
5.下列文法对整形常数和实型常数施用加法运算符+生成表达式;当两个整型数相加时,结果仍为整型数,否则 ,结果为实型数:
E →E+T|T
T → num.num |num
① 试给出确定每个子表达式结果类型的属性文法;
答:确定每个子表达式结果类型的属性文法是比较容易定义的。关键是如何扩充此属性文法,使之把表达式翻译成后缀形式。我们将不在name或num.num向T归约的时候输出该运算对象,而是把运算对象的输出放在T或E+T向E归约的时候。这是因为考虑输出类型转换算符inttoreal的动作可能在E+T向E归约的时候进行,如果这时两个运算对象都在前面name或num.num向T归约的时候已输出,需要为第1个运算对象输出类型转换算符时就已经为时太晚。
还要注意的是,在E+T向E归约时,该加法运算的第1个运算对象已经输出。所以E→E+T的语义规则不需要有输出E运算对象的动作。
(1)为文法符号E和T配以综合属性type,用来表示它们的类型。类型值分别用int和real来表示。确定每个子表达式结果类型的属性文法如下:
② 扩充(1)的属性文法,使之把表达式翻译成后缀形式 ,同时也能确定结果的类型。应该注意施用一元运算符inttoreal把整型数转换成实型数,以便使后缀形如加法运算符的两个操作数具有相同的类型。
下面属性文法将表达式的后缀表示打印输出,其中lexeme属性表示单词的拼写。
6.扩充表6.8属性文法,除跟踪方块的高度之外,还要跟踪方块的宽度。假定终结符号text具有综合属性w,给出字形的常规宽度。
答:
7.下列文法由开始符号S产生一个二进制数,令综合属性val给出该数的值:
S→L.L∣L
L→LB∣B
B→0∣1
试设计求S.val的属性文法,其中,已知B的综合属性c, 给出由B产生的二进位的结果值。例如,输入101.101时,S.val=5.625,其中第一个二进位的值是4,最后一个二进位的值是0.125。
8.分别修改习题5之(1)、(2)得到的属性文法,消除其中的左递归。
解题思路:
对文法:
E→E+TIT
T一num. num|num
消除左递归:
E→TE'
E'→+ TE'l e
T→num.num|num
9.由下列文法
S→E
E→E:=EIE+EI(E)l id
产生的表达式,其语义如C语言,包含赋值运算。就是说,b: = c是一个表达式,把c的值赋给b;该表达式的右值为e的右值。进而, a: =(b: = c)先把c的值赋给b,然后再赋给a。
(1)试建立一个属性文法,用非终结符E的继承属性side表示由E生成的表达式出现在赋值运算的左边还是右边,检查表达式的左部是一个左值。
(2)扩充(1)中的属性文法,产生某种形式的中间代码。
10.试设计一个翻译模式,检查同一个标识符在标识符表中是否重复出现。
11.设下列文法生成变量的类型说明:
L→ id L
L→, id L∣:T
T→ integer∣real
(1)构造一下翻译模式,把每个标识符的类型存入符号表;参考例6.2。
(2)由(1)得到的翻译模式,构造一个预测翻译器。
解题思路:
这是一个对说明语句进行语义分析的题目,不需要产生代码,但要求把每个标识符的类型填入符号表中。
对给定的适合于自顶向下翻译的翻译模式,书中给出了设计预测翻译器(或称递归下降翻译器)的方法。按照此方法,不难构造所求的预测翻译器。