



本节描述两个可选的具有挑战性的练习,它们涉及调整和改进1.6节中介绍的 L Int 语言的部分求值器。
习题2.7 调整1.6节(图1.5)中的部分求值器,使其适用于 L Var 程序而不仅是 L Int 程序。回想一下, L Var 语言将变量和赋值添加到 L Int 语言中,因此需要在pe_exp和pe_stmt函数中添加相应情形的处理。完成后,将部分求值编译遍添加到编译器的前端,并检查编译器是否仍然能通过所有测试。
习题2.8 通过将pe_neg和pe_add辅助函数替换为更通晓算术的函数来改进部分求值器。例如,部分求值器需要将
翻译为
要做到这一点,pe_exp函数应该以下面语法的非终结符 residual 的形式产生输出。其思想是,在处理加法表达式时,我们总是可以生成以下情况之一:整数常数,左边有整数常数但右边没有整数常数的加法表达式,或者两个子表达式都不是常数的加法表达式。
pe_add和pe_neg函数可以假定它们的输入是 resdiual 表达式 ,并且它们应该返回 resdiual 表达式 。完成改进后,确保编译器仍然能够通过所有的测试。毕竟,如果生成不正确的结果,更快的代码也是无用的!