資源簡(jiǎn)介
假使給定任意文法G(E): E->E+T|T
T->T*P|P
P->(E)|i
1. 如果輸入符號(hào)串為正確句子,顯示分析步驟,包括分析棧中的內(nèi)容、優(yōu)先關(guān)系、輸入符號(hào)串的變化情況;
2. 如果輸入符號(hào)串不是正確句子,則指示出錯(cuò)位置。
代碼片段和文件信息
#include?“stdio.h“
#include?“stdlib.h“
#include?“iostream.h“
char?data[20][20];????????????????????//算符優(yōu)先關(guān)系
char?s[100];??????????????????????????//模擬符號(hào)棧s?
char?lable[20];???????????????????????//文法終極符集
char?input[100];??????????????????????//文法輸入符號(hào)串
char?string[20][10];??????????????????//用于輸入串的分析
int?k;??????????????????????????????????????????
char?a;?
int?j;???????????????????????????????????????????????
char?q;??????????????????????????????????????????????
int?r;????????????????????????????????//文法規(guī)則個(gè)數(shù)
int?r1;???????????????????????????????//轉(zhuǎn)化后文法規(guī)則個(gè)數(shù)
char?st[10][30];??????????????????????//用來存儲(chǔ)文法規(guī)則
char?first[10][10];???????????????????//文法非終結(jié)符FIRSTVT集
char?last[10][10];????????????????????//文法非終結(jié)符LASTVT集
int?fflag[10]={0};????????????????????//標(biāo)志第i個(gè)非終結(jié)符的FIRSTVT集是否已求出
int?lflag[10]={0};???????????????????//標(biāo)志第i個(gè)非終結(jié)符的LASTVT集是否已求出
int?deal();??????????????????????????//對(duì)輸入串的分析
int?zhongjie(char?c);????????????????//判斷字符c是否是終極符
int?xiabiao(char?c);?????????????????//求字符c在算符優(yōu)先關(guān)系表中的下標(biāo)
void?out(int?jint?kchar?*s);???????//打印s棧
void?firstvt(char?c);????????????????//求非終結(jié)符c的FIRSTVT集
void?lastvt(char?c);?????????????????//求非終結(jié)符c的LASTVT集
void?table();????????????????????????//創(chuàng)建文法優(yōu)先關(guān)系表
int?main()
{
int?ijk=0;
????printf(“請(qǐng)輸入文法規(guī)則數(shù):“);
scanf(“%d“&r);
printf(“請(qǐng)輸入文法規(guī)則:\n“);
for(i=0;i {
???scanf(“%s“st[i]);????//存儲(chǔ)文法規(guī)則,初始化FIRSTVT集和LASTVT集*/????????
???first[i][0]=0;????????????/*first[i][0]和last[i][0]分別表示st[i][0]非終極
符的FIRSTVT集和LASTVT集中元素的個(gè)數(shù)*/
???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(“每個(gè)非終結(jié)符的FIRSTVT集為:\n“);????//輸出每個(gè)非終結(jié)符的FIRSTVT集
for(i=0;i {
???printf(“%c:?“st[i][0]);
???for(j=0;j ???{
????printf(“%c?“first[i][j+1]);
???}
???printf(“\n“);
}
printf(“每個(gè)非終結(jié)符的LASTVT集為:\n“);????//輸出每個(gè)非終結(jié)符的LASTVT集
for(i=0;i {
???printf(“%c:?“st[i][0]);
???for(j=0;j ???{
????printf(“%c?“l(fā)ast[i][j+1]);
???}
???printf(“\n“);
}
printf(“算符優(yōu)先分析表如下:\n“);
for(i=0;lable[i]!=‘\0‘;i++)?????????????????????
???printf(“\t%c“l(fā)able[i]);
printf(“\n“);???????????????????????????????????
for(i=0;i {
???printf(“%c\t“l(fā)able[i]);
???for(j=0;j ???{
????printf(“%c\t“data[i][j]);
???}
???printf(“\n“);
}
printf(“請(qǐng)輸入文法輸入符號(hào)串以#結(jié)束:“);
scanf(“%s“input);??????????????????????????????????????????
deal();
}
void?table()
{
char?text[20][10];
int?ijktlx=0y=0;
int?mn;
x=0;
for(i
評(píng)論
共有 條評(píng)論