编译技术第6次上机内容
算术表达式的扩充
1. 实验目的
充分理解语义分析的方法及相关语义计算的执行时机。
掌握LR分析表的设计方法和语义加工程序的扩充。
2. 实验要求
参照算术表达式LR分析表的设计方法,设计扩充后的算术表达式LR分析表,并对原语义加工程序进行修改,加入新添加的内容。写一段程序,打印出计算结果E。
3. 实验内容
假设有以下文法:
L->En
E->E+T
E->E-T
E->T
T->T*F
T->T/F
T->F
F->(E)
F->id
设该文法进行自下而上计算时,打印出四则运算的计算结果。
E、T、F这些非终结符需要综合属性。以L属性的翻译方案为基础,将下表的语义规则嵌套在语法分析的过程中,即实现语法制导的翻译过程。
产 生 式 |
语 义 规 则 |
L®En |
{print(E.val)} |
E®E1+T |
{ E.val=E1.val+T.val} |
E®E1-T |
{ E.val=E1.val-T.val} |
E®T |
{ E.val= T.val} |
T®T1*F |
{ T.val=T1.val*F.val} |
T®T1/F |
{ T.val=T1.val/F.val} |
T®F |
{ T.val= F.val} |
F®(E) |
{ F.val=E.val} |
F®id |
{ F.val=id.lexval} |
2.以词法分析和语法分析部分的上机结果为基础,添加语义分析部分。即以LR文法为基础。当进行产生式归约时执行对应的语义动作。
3.输入:
5+3+8*2
输出:24
输入10-6/2
输出:7
4. 若输入有误,如:3++2
则应提示:重新输入!
5. 由于输入串是具体的数值,因此应调用相应的词法分析的功能。
扩展:
- 对浮点数和科学计数法的表示也能完成上述的操作。
- 增加减法和除法(也可继续扩展其他运算)对应的产生式,并能计算其语义结果。
- 在ftp中第五次上机的文件夹中有两个压缩包,用递归下降法实现的程序在压缩包“recursion_calculator.rar”中,用非递归的预测分析方法实现的程序在压缩包“predict_calculator.rar”中。可以任选其一作为基础进行改进,增加减法和除法的操作,写出改进后的文法,输出表达式的结果。
import java.util.Scanner;
import java.util.Stack;
//E->E+T 1
//E->E-T 2
//E->T 3
//T->T*F 4
//T->T/F 5
//T->F 6
//F->(E) 7
//F->id 8
public class Main {
private static boolean guiyuefou = false;
private static String Str = null; // 输入串
private static String Sub = null;
private static boolean acc = false;// 是否已处理完输入串
private static boolean bResult