《《編譯原理》綜合訓(xùn)練實(shí)習(xí)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《《編譯原理》綜合訓(xùn)練實(shí)習(xí)報(bào)告.doc(15頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
西北農(nóng)林科技大學(xué)信息工程學(xué)院
《編譯原理》綜合訓(xùn)練實(shí)習(xí)報(bào)告
小組成員
姓 名
學(xué) 號(hào)
張浩宇
2012013332
黃彬
2012013338
鄭瑞
2012013343
王冠
2012013347
姓名
黃彬
學(xué)號(hào)
2012013338
專業(yè)班級(jí)
軟件工程
指導(dǎo)教師
王美麗
實(shí)踐日期
2014年6月30日-7月4日
目 錄
一、綜合訓(xùn)練目的與要求 1
二、綜合訓(xùn)練任務(wù)描述 1
三、編譯系統(tǒng)設(shè)計(jì) 1
五、調(diào)試與測(cè)試 1
六、實(shí)習(xí)日志 1
七、實(shí)習(xí)總結(jié) 1
八、附錄:核心代碼清單 1
一、綜合訓(xùn)練目的與要求
本綜合訓(xùn)練是軟件工程專業(yè)重要的實(shí)踐性環(huán)節(jié)之一,是在學(xué)生學(xué)習(xí)完《編譯原理》課程后進(jìn)行的綜合練習(xí)。本課綜合訓(xùn)練的目的和任務(wù):
1. 鞏固和加深學(xué)生對(duì)編譯原理課程基本知識(shí)的理解和掌握;
2. 提高抽象思維能力以及加深理解編譯系統(tǒng)的原理;
3. 掌握利用JavaCC開發(fā)編譯系統(tǒng)的方法;
4. 掌握書寫設(shè)計(jì)與實(shí)現(xiàn)編譯系統(tǒng)說明文檔的能力;
5. 提高綜合運(yùn)用算法、程序設(shè)計(jì)語言、數(shù)據(jù)結(jié)構(gòu)知識(shí)的能力。
二、綜合訓(xùn)練任務(wù)描述
根據(jù)組長(zhǎng)的安排,我主要負(fù)責(zé)的任務(wù)是for循環(huán)語句的翻譯,包括詞法分析,語法分析和語義分析。
能夠根據(jù)單詞的構(gòu)詞規(guī)則,完成for語言中的單詞的解析(詞法分析),如果不符合單詞的構(gòu)詞規(guī)則,請(qǐng)給出錯(cuò)誤信息。如果源語言符合單詞的詞法規(guī)則,請(qǐng)輸出<單詞種別,單詞自身值>二元式。
在詞法分析的基礎(chǔ)上,構(gòu)造for的LL(1)文法,利用JavaCC實(shí)現(xiàn)LL(1)文法,判斷源語言是否符合MiniC的語法,如果不符合,請(qǐng)給出語法錯(cuò)誤信息。
在語法分析的基礎(chǔ)上,根據(jù)屬性文法制導(dǎo)翻譯,進(jìn)行語義分析,輸出四元式。如果源語言不符合for的語義,請(qǐng)指出錯(cuò)誤信息。
三、編譯系統(tǒng)設(shè)計(jì)
(1)五大類的單詞
關(guān)鍵字:由程序語言定義的具有固定意義的標(biāo)識(shí)符。
標(biāo)識(shí)符:用來表示各種名字,如變量、數(shù)組名、過程名等等。
常數(shù):類型一般有整型,實(shí)型,布爾型等等。
運(yùn)算符:如+、-、*、/等。
界符:如逗號(hào),分號(hào),括號(hào),/*?*/等等
(2) LL(1)文法的描述
LL(1)文法滿足:
a、 文法不含左遞歸;
b、 對(duì)于文法中每一個(gè)非終結(jié)符的各個(gè)產(chǎn)生式的候選首符集兩兩不相交;
c、 對(duì)文法中的每一個(gè)非終結(jié)符A,若它存在某個(gè)候選首符集包含ε,則
FIRST(A)∩FOLLOW(A)=Φ
(3) for語句語法
void forstate() :
{}
{
< FOR > "("
(fuzhistate())?";"
(boolbiaodashi())?";"
(fuzhistate())?
")" Expression_Blocks()
其中,fuzhistate()表示的是賦值語句,也就是for語句的初始化語句,如:i = 0;boolbiaodashi()是表示for語句中的條件判斷部分,條件為真則繼續(xù)循環(huán),為假則跳出循環(huán),如:i
"("
(
fuzhistate()
{
quad = Snode.innerIdSeqen + 1;
}
)?
";"
(
boolbiaodashi()
)?
";"
(
fuzhistate()
{
quad1 = Snode.innerIdSeqen + 1;
}
)?
")" Expression_Blocks()
{
Slist.addSnode(new Snode("J", "_", "_", quad));
Snode backFill = Slist.get(jump - 1);
String nxq = "" + (Snode.innerIdSeqen + 1);
backFill.setResult(nxq);
}
}
void fuzhistate() :
{
Token f, node = null;
Token m;
String middle;
String newTemp1, newTemp2;
int D = 0;
String IDE = null;
String s;
}
{
(
f = < ID > ("[" node = < CONSTANT >
{
D++;
}
"]")*
(
(
"=" middle = biaodashi()
{
qtTable.addSnode(new Snode("=", middle, "_", f.image));
}
)
|
(
(
< zizeng >
{
qtTable.addSnode(new Snode("+", f.image, "1", f.image));
}
)
|
(
< zijian >
{
qtTable.addSnode(new Snode("-", f.image, "1", f.image));
}
)
)
)
{
IDE = f.image;
if (!myNodeList.isExientence(IDE))
{
s = "變量" + IDE + "未聲明,錯(cuò)誤" + "\n";
// System.out.println(s);
S += s;
s = null;
//System.exit(- 1);
}
}
)
|
(
m = < zizeng > f = < ID >
{
qtTable.addSnode(new Snode("+", f.image, "1", f.image));
IDE = f.image;
if (!myNodeList.isExientence(IDE))
{
s = "變量" + IDE + "未聲明,錯(cuò)誤" + "\n";
// System.out.println(s);
S += s;
s = null;
//System.exit(- 1);
}
}
)
|
(
m = < zijian > f = < ID >
{
qtTable.addSnode(new Snode("-", f.image, "1", f.image));
IDE = f.image;
if (!myNodeList.isExientence(IDE))
{
s = "變量" + IDE + "未聲明,錯(cuò)誤" + "\n";
// System.out.println(s);
S += s;
s = null;
//System.exit(- 1);
}
}
)
}
void boolbiaodashi() :
{}
{
andboolbiaodashi()
(
< OR > andboolbiaodashi()
)*
}
void andboolbiaodashi() :
{}
{
notboolbiaodashi()
(
< AND > notboolbiaodashi()
)*
}
void notboolbiaodashi() :
{}
{
(< NOT >)? guanxibiaodashi()
}
int guanxibiaodashi() :
{
String node;
int nxq;
String first;
String middle;
}
{
first = biaodashi()
(
node = guanxifu() middle = biaodashi()
{
nxq = Snode.innerIdSeqen + 1;
// 因?yàn)闆]有布爾運(yùn)算,真出口已經(jīng)確定
Slist.addSnode(new Snode("J" + node, first, middle, nxq + 2));
return nxq + 1; //返回(j,_,_,0)的四元式標(biāo)號(hào)
}
)?
}
String guanxifu() :
{
Token t;
}
{
(
t = < XIAOYU >
| t = < XIAOYUDENGYU >
| t = < DAYU >
| t = < DAYUDENGYU >
| t = < DENGYUDENGYU >
| t = < BUDENGYU >
)
{
return t.image;
}
}
String biaodashi() :
{
String first;
String middle;
String newTemp;
}
{
first = term()
{
newTemp = first;
}
(
< PLUS > middle = term()
{
newTemp = VariableNameGenerator.genVariableName();
Slist.addSnode(new Snode("+", first, middle, newTemp));
}
| < MINUS > middle = term()
{
newTemp = VariableNameGenerator.genVariableName();
Slist.addSnode(new Snode("-", first, middle, newTemp));
}
)*
{
return newTemp;
}
}
String term() :
{
String first;
String middle;
String newTemp;
}
{
first = unary()
{
newTemp = first;
}
(
< MULTIPLY > middle = unary()
{
newTemp = VariableNameGenerator.genVariableName();
Slist.addSnode(new Snode("*", first, middle, newTemp));
}
| < DIVIDE > middle = unary()
{
newTemp = VariableNameGenerator.genVariableName();
Slist.addSnode(new Snode("/", first, middle, newTemp));
}
)*
{
return newTemp;
}
}
String unary() :
{
String str;
Token node;
String IDE;
String s = null;
}
{
node = < CONSTANT >
{
return node.image;
}
| "(" str = biaodashi() ")"
{
return str;
}
|
(
< zizeng > node = < ID >
{
Slist.addSnode(new Snode("+", node.image, "1", node.image));
IDE = node.image;
if (!myNodeList.isExientence(IDE))
{
s = "變量" + IDE + "未聲明,錯(cuò)誤" + "\n";
S += s;
s = null;
}
}
)
|
(
< zijian > node = < ID >
{
qtTable.addSnode(new Snode("-", node.image, "1", node.image));
IDE = node.image;
if (!myNodeList.isExientence(IDE))
{
s = "變量" + IDE + "未聲明,錯(cuò)誤" + "\n";
S += s;
s = null;
}
}
)
|
(
LOOKAHEAD(2)
node = < ID >
{
IDE = node.image;
if (!myNodeList.isExientence(IDE))
{
s = "變量" + IDE + "未聲明,錯(cuò)誤" + "\n";
S += s;
s = null;
}
return node.image;
}
|
(
node = < ID >
(
"++"
| "--"
)
{
IDE = node.image;
if (!myNodeList.isExientence(IDE))
{
s = "變量" + IDE + "未聲明,錯(cuò)誤" + "\n";
S += s;
s = null;
}
}
)
)
}
鏈接地址:http://m.appdesigncorp.com/p-9507984.html