递归下降语法制导翻译
实现含多条简单赋值语句的简化语言的语义分析和中间代码生成。
测试样例
begin
a:=2; b:=4;
c:=c-1;
area:=3.14*a*a;
s:=2*3.1416*r*(h+r);
end
#
词法分析
public class analyzer {
public static List<String> llist=new ArrayList<>();
static Map<Integer,Integer> map=new HashMap<>();
final static String ID = "\\p{Alpha}(\\p{Alpha}|\\d)*";
static int countLine=1;
/** 整形常数 NUM >> 正则表达式*/
final static String NUM = "\\d\\d*";
/** token 词法单元
* <词符号, 种别码> */
/** 关键字 token*/
static Map<String, Integer> TOKEN_KEYWORDS;
/** 运算符/界符 token */
static Map<String, Integer> TOKEN_OPERATOR_BOUNDARY;
/** 其他单词 token*/
static Map<String, Integer> TOKEN_ID_SUM;
/** 文件根目录*/
static final String ROOT_DIRECTORY = "program.txt";
/**
* 初始化 token 单元
*/
public static void initToken(){
//种别码创建
TOKEN_KEYWORDS = new HashMap<String, Integer>(){
//关键字
{
put("begin", 1);
put("if", 2);
put("then", 3);
put("while", 4);
put("do", 5);
put("end", 6);
}
};
TOKEN_OPERATOR_BOUNDARY= new HashMap<String, Integer>(){
//运算符和界符
{
put("+", 13);
put("-", 14);
put("*", 15);
put("/", 16);
put(":", 17);
put(":=", 18);
put("<", 20);
put("<>", 21);
put("<=", 22);
put(">", 23);
put(">=", 24);
put("=", 25);
put(";", 26);
put("(", 27);
put(")", 28);
put("#", 0);
}
};
TOKEN_ID_SUM= new HashMap<String, Integer>(){
//标识符和整型常数
{
put(ID, 10);
put(NUM, 11);
}
};
}
/**
* 读 源程序 文件
*/
public static void ReadFile1() {
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
fis = new FileInputStream(ROOT_DIRECTORY);
isr = new InputStreamReader(fis, "UTF-8"); // 转化类
br = new BufferedReader(isr); // 装饰类
String line;
/** 记录 程序 行数 */
while ((line = br.readLine()) != null) {
// 每次读取一行,分析一行
boolean answer = lexicalAnalysis(line);
if(answer == false){
System.out.printf("ERROR 编译错误=== 第 %d 行出现 词法错误 \n", countLine);
break;
}
countLine++;
}
System.out.printf("===词法分析完成===\n");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
br.close(); // 关闭最后一个类,会将所有的底层流都关闭
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/** 判断key是否是其他单词*/
private static boolean isIDOrSUM(String key){
if (key.matches(<