資源簡介
編譯原理大作業(yè),C語言小子集編譯程序-遞歸下降分析。本上機(jī)實(shí)習(xí)是為C語言(子集)設(shè)計(jì)一個(gè)編譯程序,完成詞法分析、語法分析、語義分析等功能,并生成某種機(jī)器上的目標(biāo)代碼(匯編語言)或中間代碼(四元式)。

代碼片段和文件信息
#include
using?namespace?std;
const?int?max_word?=?505;
//關(guān)鍵字?
const?char?keyWord[13][20]?=?{“main““if““else““do““while““for““switch“
“case““int““double““float““l(fā)ong““void“};
//單詞表?
struct?Word{
char?value[20];//單詞值?
int?type;//單詞種類
int?line;//行號(hào)?
}w[max_word];?
//四元式
struct?si_Yuan{
string?op;//運(yùn)算符
string?s1;
string?s2;
string?res;//結(jié)果?
}sy[105];
//文件流?
FILE?*fin*fout;
int?line?=?1;
char?token[12];//存放單詞?
int?flag?=?0;//判斷是否獲取字符?
int?flag1?=?0flag2;//flag1判斷是否項(xiàng)已經(jīng)產(chǎn)生miss錯(cuò)誤;?
int?e?=?0;//錯(cuò)誤個(gè)數(shù)?
int?sy_num?=?0;//四元式的個(gè)數(shù)
string?ops1ss1s2resres1res2op2op1;?
int?op_num?=?0op_num1?=?0;//運(yùn)算符的個(gè)數(shù)
int?sy_id;//四元式的序號(hào)?
string?var[300];//已經(jīng)聲明的變量?
int?var_num?=?0;//聲明變量的個(gè)數(shù)?
int?sent_id;//判斷ifwhile語句?
string?equ[300];//=?
int?abc;?
int?equ_num?=?1;?//=個(gè)數(shù)?
int?cnt?=?0token_num?=?0;//當(dāng)前字符?
int?row?=?1;//當(dāng)前行數(shù)?
char?ch;
char?ch1;?
int?word_num?=?0;//單詞的總個(gè)數(shù)?
int?word_cnt?=?0;
string?temp;
char?str_int[20];
stackword_stack;//保存?
stackop_stack;
//程序?
void?S();
void?P();//(){分程序}?
void?P1();//分程序?
void?A();//變量說明部分
void?B();//語句部分
void?B1();
int?C();//變量說明
void?D();//標(biāo)識(shí)符表
void?D1();
void?E();//標(biāo)識(shí)符
void?F();//字母?
void?G();//數(shù)字?
void?H();//語句?
void?I();//賦值語句?
void?J();//條件語句?
void?K();//循環(huán)語句?
int?L();//關(guān)系運(yùn)算符?
void?M();//表達(dá)式?
void?M1();
void?N();//項(xiàng)?
void?N1();
int?O();//加法運(yùn)算符?
int?Q();//乘法運(yùn)算符?
void?R();//常量?
void?S();//無符號(hào)整數(shù)?
void?T();//數(shù)字序列?
void?W();//復(fù)合語句?
void?X();//條件?
void?Y();//語句1?
void?Z();//因子
?
//構(gòu)造四元式?
void?siYuan(string?opstring?s1string?s2string?res)
{
sy[sy_num].op?=op;
sy[sy_num].s1=s1;
sy[sy_num].s2=s2;
sy[sy_num].res=res;
sy_num++;
}
void?printFour()//輸出四元式?
{
ofstream?out(“sy.txt“);
????int?i;
????for(i=0;i ??? {
??? cout<??? out<????}
}
void?error(string?err)//報(bào)錯(cuò),定位到錯(cuò)誤行?
{
????????cout<<“第“< cout< e++;
}
//檢查變量是否被聲明
void?is_say(string?a)
{
int?i;
????for(i=1;i<=var_num;i++)
????{
???? if(a.compare(var[i])==0)
{
break;
}
}
if(i>var_num)??
{
cout<<“第?“< cout< e++;
}
}
void?init_token(){
int?i;
for(i?=?0;i?12;i++){
token[i]?=?NULL;
}
}
int?judge_token(){
init_token();
if(flag?==?0){
ch?=?getc(fin);
}
flag?=?1;
while(ch?==?‘?‘?||?ch?==?‘\t‘?||?ch?==?‘\n‘){
if(ch?==?‘\n‘){
row++;
}
ch=getc(fin);
}
token_num?=?0;
if((ch>=‘a(chǎn)‘?&&?ch?<=?‘z‘)?||?(ch?>=?‘A‘?&&ch?<=?‘Z‘)){
//可能為標(biāo)識(shí)符或者變量名?
while((ch>=‘a(chǎn)‘?&&?ch?<=?‘z‘)?||?(ch?>=?‘A‘?&&ch?<=?‘Z‘)?||?(ch?>=?‘0‘?&&?ch?<=?‘9‘)){
token[token_num++]?=?ch;
ch?=?getc(fin);
}
token[token_num++]?=?‘\0‘;
for(int?i?=?0;i?<13;i++){
if(strcmp(t
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件?????????132??2018-12-31?19:23??compiler.txt
?????文件?????????309??2018-12-31?19:23??sy.txt
?????文件???????15070??2018-12-31?19:09??編譯原理end.cpp
評(píng)論
共有 條評(píng)論