1. 任務描述–SLP Interpreter
- 華保健的lab1
- [modern complier implementation in java]
- 總結來說就是利用前面介紹的數據結構和文法規則創建一個計算最大print參數數量的函數和一個直線型程序語言翻譯器。
- SLP Gramar
- 要分析的stm是
2. program
代碼在(tiger/src/slp/)[https://github.com/s1530129650/tiger/tree/Lab1/src/slp]
Slp裏給出了stm,exp和explist 類的定義。
Sample裏給出了符合SL語法的語句用來。
Main給出了max print agrs和interperter的具體實現。
3. 解決思路
對照着Tree representation比較好理解代碼。
3.1 計算print中的最大參數個數
只需要計算不同情況的print的最大參數數量即可。
// ///////////////////////////////////////////
// maximum number of args
private int maxArgsExp(Exp.T exp){...}
private int maxArgsExpList(ExpList.T explist){...}
private int maxArgsStm(Stm.T stm){...}
// ////////////////////////////////////////
在不同的class計算各自的print參數的數量,在maxArgsExpList有所不同需要先加1,因爲explist裏總會有exp,而exp是id或者num是,參數數量是0;
private int maxArgsExpList(ExpList.T explist)
{
if (explist instanceof ExpList.Pair) {
ExpList.Pair pair = (ExpList.Pair) explist;
int n1 = 1 + maxArgsExp(pair.exp);
int n2 = 1 + maxArgsExpList(pair.list);
return n1 >= n2 ? n1 : n2;
}
else if(explist instanceof ExpList.Last)
{
ExpList.Last last = (ExpList.Last) explist;
int n = 1 + maxArgsExp(last.exp);
return n;
}
else
new Bug();
return 0;
}
在modern_compiler_implementation_in_java /chap1裏的size的實現異曲同工
3.2 interpreter
要實現interpreter,可以借鑑printer,分情況interper,
- 需要save,variables和對應的值,這裏tiger有個提示:
用Table保存那些變量和value。
class Table{
String id;
int value;
Table tail;
Table(String i, int v, Table t)
{
id = i;
value = v;
tail = t;
}
}
exp 和explist僅需要返回一個Int值,但也需要用到Table,於是用IntAndTable來聲明exp和explist。
class IntAndTable{
int i;
Table t;}
程序未實現update。