資源簡介
編寫一個算符優先分析程序,能實現以下功能:
1. 輸入文法,判斷是否為算符文法。
2. 構造并輸出文法的每個非終結符的FIRSTVT和LASTVT。
3. 構造并輸出算符優先分析表,判斷是否為算符優先文法,如果不是提示無法進行分析。
4. 輸入任意一個輸入串,可得到成功的分析或錯誤提示,輸出其分析過程或打印語法分析樹。

代碼片段和文件信息
#include?
#include?
int?k;
char?a;
int?j;
char?q;
int?r;//輸入的文法規則數
int?r1;//轉化后文法的個數?
char?st[10][30];//文法二維數組,其中一個巨型的表示為st[i]
char?data[20][20];//優先分析表?
char?s[100];//符號棧?
char?lable[20];//除大寫字母、->和|之外的否有字符規定為非中介符字符串或者集合?
char?input[100];//輸入待分析的串?
char?string[20][10];//不含->符號的文法?
//[i][0]中存放的的是集合中的元素個數?
char?first[10][10];?
char?last[10][10];
int?fflag[10]=?{0};?
int?lflag[10]=?{0};
int?deal();//分析過程?
int?zhongjie(char?c);//判斷字符是否是終結符?
int?xiabiao(char?c);//非終結符在lable中的下標?
void?out(int?jint?kchar?*s);
void?firstvt(char?c);
void?lastvt(char?c);
void?table();//生成轉化的文法和算符優分析系表?
int??main(void)
{
int?ijk=0;
printf(“請輸入文法規則數:“);
scanf(“%d“&r);
printf(“請輸入文法規則:\n“);
for(i=0;?i scanf(“%s“st[i]);
first[i][0]=0;?
last[i][0]=0;
}
//判斷是否是算符文法
for(i=0;?i for(j=0;?st[i][j]!=‘\0‘;?j++)?{
if(st[i][0]<‘A‘||st[i][0]>‘Z‘)?{?
printf(“不是算符文法!\n“);
exit(-1);
}
if(st[i][j]>=‘A‘&&st[i][j]<=‘Z‘)?{
if(st[i][j+1]>=‘A‘&&st[i][j+1]<=‘Z‘)?{
printf(“不是算符文法!\n“);
exit(-1);
}
}
}
}
//除大寫字母、->和|之外的所有字符規定為終結符?
for(i=0;?i for(j=0;?st[i][j]!=‘\0‘;?j++)?{
if((st[i][j]<‘A‘||st[i][j]>‘Z‘)&&st[i][j]!=‘-‘&&st[i][j]!=‘>‘&&st[i][j]!=‘|‘)
lable[k++]=st[i][j];
}
}
lable[k]=‘#‘;
lable[k+1]=‘\0‘;
table();//去除|轉換化文法?
printf(“每個非終結符的FIRSTVT集為:\n“);
for(i=0;?i printf(“%c:?“st[i][0]);
for(j=0;?j printf(“%c?“first[i][j+1]);
}
printf(“\n“);
}
printf(“每個非終結符的LASTVT集為:\n“);
for(i=0;?i printf(“%c:?“st[i][0]);
for(j=0;?j printf(“%c?“last[i][j+1]);
}
printf(“\n“);
}
printf(“算符優先分析表如下:\n“);
for(i=0;?lable[i]!=‘\0‘;?i++)?{
printf(“\t%c“lable[i]);
}
printf(“\n“);
for(i=0;?i printf(“%c\t“lable[i]);
for(j=0;?j printf(“%c\t“data[i][j]);
}
printf(“\n“);
}
printf(“請輸入文法輸入符號串以#結束:“);
scanf(“%s“input);
deal();
system(“pause“);
return?0;
}
?
void?table()
{
char?text[20][10];
int?ijktlx=0y=0;
int?mn;
x=0;
for(i=0;?i firstvt(st[i][0]);?
lastvt(st[i][0]);
}
//把st文法中的|去掉并放入text文法中??
for(i=0;?i text[x][y]=st[i][0];
y++;
for(j=1;?st[i][j]!=‘\0‘;?j++)?{
if(st[i][j]==‘|‘)?{
text[x][y]=‘\0‘;
x++;
y=0;
text[x][y]=st[i][0];
y++;
text[x][y++]=‘-‘;
text[x][y++]=‘>‘;
}?else?{
text[x][y]=st[i][j];
y++;
}
}
text[x][y]=‘\0‘;
x++;
y=0;
}
r1=x;?
//輸出轉化后的文法規則串
printf(“轉化后的文法為:\n“);
for(i=0;?i printf(“%s\n“text[i]);
}
//把文法中的->符號去掉并放在string[i]中?
for(i=0;?i string[i][0]=text[i][0];
for(j=3l=1;?text[i][j]!=‘\0‘;?j++l++)
string[i][l]=text[i][j];
string[i][l]=‘\0‘;
}
//構造算符優先分析表?
for(i=0;?i for(j=1;?text[i][j+1]!=‘\0‘;?j
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????60416??2016-03-01?15:04??編譯原理實驗報告參考模板.doc
?????文件????????8873??2016-05-22?22:47??算符優先分析程序.c
- 上一篇:數字邏輯電路課程設計自動洗滌系統設計
- 下一篇:ANSYS材料庫267338
評論
共有 條評論