java代码如下:
package 文法分析器;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;
/*
*(1)产生式集合
*(2)first和follower集合
**/
public class Grammar_Analysis {
//first集合
public static HashMap<String, HashSet<String>> first = new HashMap<>();
//firstX集合,指任意符号串的first集合
public static HashMap<String, HashSet<String>> firstX = new HashMap<>();
//follower集合
public static HashMap<String, HashSet<String>> follower = new HashMap<>();
//文法的开始符
public static String start = "S";
//存储非终结符的集合
public static HashSet<String> VnSet = new HashSet<>();
//存储终结符的集合
public static HashSet<String> VtSet = new HashSet<>();
//存储每个非终结符的产生式
public static HashMap<String, ArrayList<String>> outputSet = new HashMap<>();
//分析表
public static String[][] analysis_table;
//分析栈
public static Stack<String> Ana_stack = new Stack<>();
//记录动作
public static String active = "";
//记录分析步数
public static int index = 0;
//源程序
public static String source = "id = id * id $";
//文件路径
public static String PATH = "D:\\程序\\Maven\\maven-project\\编译原理\\src\\main\\java\\文法分析器\\readin.txt";
public static int rows = 33;
public static String PATH1 = "D:\\程序\\Maven\\maven-project\\编译原理\\src\\main\\java\\文法分析器\\readin1.txt";
public static int rows1 = 8;
public static String getSource_PATH = "D:\\程序\\Maven\\maven-project\\编译原理\\src\\main\\java\\文法分析器\\source.txt";
//读入文件
public static String[] grammar = getSource();
public static String[] getSource() {
FileInputStream inputStream = null;
BufferedReader bufferedReader = null;
String str;
String[] grammar = new String[rows];
int num = 0;
try {
inputStream = new FileInputStream(PATH);
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
while ((str = bufferedReader.readLine()) != null) {
grammar[num] = str;
num++;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return grammar;
}
//初始化
public static void Init() {
for (String s : grammar) {
String[] str = s.split("->");//通过“->”分隔文法
String left = str[0];
//判断outputSet中是否有左部,若有,通过get方法得到,若没有,新建一个ArrayList
ArrayList<String> list;
if (outputSet.containsKey(left)) {
list = outputSet.get(left);
} else {
list = new ArrayList<>();
}
list.add(str[1]);
outputSet.put(left, list);
}
for (String left : VnSet) {
HashSet<String> element = new HashSet<>();
follower.put(left, element);
}
//求非终结符的first集
for (String left : VnSet) {//遍历所有左部(非终结符)
getFirst(left);
}
//求每个产生式的firstX集
for (String left : VnSet) {
ArrayList<String> right = outputSet.get(left);
for (String Generational : right) {
getFirstX(Generational);
}
}
//求非终结符的follower集
getFollower();
//构造分析表
create_analysis_table();
//初始化栈
Ana_stack.push("$");
Ana_stack.push(start);
}
//构造分析表
private static void create_analysis_table() {
//终结符数组
Object[] VtArray = VtSet.toArray();
//非终结符数组
Object[] VnArray = VnSet.toArray();
//初始化预测分析表
analysis_table = new String[VnArray.length + 1][VtArray.length + 1];
analysis_table[0][0] = "分析表";
//初始化分析表
//初始化首行
for (int i = 0; i < VtArray.length; i++)
analysis_table[0][i + 1] = (Objects.equals(VtArray[i].toString(), "@")) ? "$" : VtArray[i].toString();
//初始化首列
for (int i = 0; i < VnArray.length; i++)
analysis_table[i + 1][0] = VnArray[i].toString();
//初始化分析表,全部置为error
for (int i = 0; i < VnArray.length; i++) {
for (int j = 0; j < VtArray.length; j++) {
analysis_table[i + 1][j + 1] = "error";
}
}