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

代碼片段和文件信息
#include
using?namespace?std;
const?int?max_word?=?505;
//關鍵字?
const?char?keyWord[13][20]?=?{“main““if““else““do““while““for““switch“
“case““int““double““float““long““void“};
//單詞表?
struct?Word{
char?value[20];//單詞值?
int?type;//單詞種類
int?line;//行號?
}w[max_word];?
//四元式
struct?si_Yuan{
string?op;//運算符
string?s1;
string?s2;
string?res;//結果?
}sy[105];
//文件流?
FILE?*fin*fout;
int?line?=?1;
char?token[12];//存放單詞?
int?flag?=?0;//判斷是否獲取字符?
int?flag1?=?0flag2;//flag1判斷是否項已經產生miss錯誤;?
int?e?=?0;//錯誤個數?
int?sy_num?=?0;//四元式的個數
string?ops1ss1s2resres1res2op2op1;?
int?op_num?=?0op_num1?=?0;//運算符的個數
int?sy_id;//四元式的序號?
string?var[300];//已經聲明的變量?
int?var_num?=?0;//聲明變量的個數?
int?sent_id;//判斷ifwhile語句?
string?equ[300];//=?
int?abc;?
int?equ_num?=?1;?//=個數?
int?cnt?=?0token_num?=?0;//當前字符?
int?row?=?1;//當前行數?
char?ch;
char?ch1;?
int?word_num?=?0;//單詞的總個數?
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();//標識符表
void?D1();
void?E();//標識符
void?F();//字母?
void?G();//數字?
void?H();//語句?
void?I();//賦值語句?
void?J();//條件語句?
void?K();//循環語句?
int?L();//關系運算符?
void?M();//表達式?
void?M1();
void?N();//項?
void?N1();
int?O();//加法運算符?
int?Q();//乘法運算符?
void?R();//常量?
void?S();//無符號整數?
void?T();//數字序列?
void?W();//復合語句?
void?X();//條件?
void?Y();//語句1?
void?Z();//因子
?
//構造四元式?
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)//報錯,定位到錯誤行?
{
????????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?<=?‘z‘)?||?(ch?>=?‘A‘?&&ch?<=?‘Z‘)){
//可能為標識符或者變量名?
while((ch>=‘a‘?&&?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
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????????132??2018-12-31?19:23??compiler.txt
?????文件?????????309??2018-12-31?19:23??sy.txt
?????文件???????15070??2018-12-31?19:09??編譯原理end.cpp
- 上一篇:編譯原理語法分析代碼
- 下一篇:算法分析與設計實驗代碼.cpp
評論
共有 條評論