- 实验目的与内容
给定SysY语言中简单算术表达式文法G[E]:
E→TE’
E’→ATE’|ε
T→FT’
T’→MFT’ |ε
F→(E) | i
A → + | -
M → * | /
根据该文法,编写递归下降分析子程序。
【说明】
终结符号i为用户定义的简单变量,即专题1中标识符的定义
1.输入:是词法分析输出的二元组序列,即任意简单算术表达式经过专题1程序输出后得到的结果。【上述文法中i即对应词法分析的标识符, ±*/分别对应词法分析得到的运算符】
2.输出:判定输入串是否为该文法定义的合法算术表达式
3.处理:程序应能发现输入串的错误
4.设计5个以上的测试用例(尽可能完全,包括正确和出错情况),给出测试结果。 - 设计方法
给出语法分析表:
设置ans作为输出字符串,每次分析后加入ans,最后输出至txt
设置index记录当前分析到的字符串位置
flag为错误标识,一旦进入过error()则标记flag.
为每一个非终结符号建立函数进行递归。以E为例,对照分析表建立函数
在主函数中从开始符号进行分析。
- 函数定义
public static String txt2String(File file);//读取文件
public static void E(char t);//对E的分析
public static void T(char t);//对T的分析
public static void Ep(char t);//对E’的分析
public static void Tp(char t);//对T’的分析
public static void F(char t);//对F的分析
public static void A(char t);//对A的分析
public static void M(char t)//对M的分析
public static void error()//对error的判断
import java.io.*;
public class Diguixiajiang {
//递归下降
static String ans="";
static int index = 0; //遍历字符串的当前位置
static String str="";
static int flag=0;
public static String txt2String(File file){
try{
BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文16
String s = null;
while((s = br.readLine())!=null){
//使用readLine方法,一次读一行
str = str +s;
}
br.close();
}catch(Exception e){
e.printStackTrace();
}
return str;
}
public static void E(char t)
{
if (t == '(') {
System.out.println("E::TE'");
ans=ans+"E::TE'\n";
T(str.charAt(index));
Ep(str.charAt(index));
}
else if (t == 'i') {
System.out.println("E::TE'");
ans=ans+"E::TE'\n";
T(str.charAt(index));
Ep(str.charAt(index));
}
else {
error();
index++;
E(str.charAt(index));