-
大小: 3KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-08-20
- 語(yǔ)言: 其他
- 標(biāo)簽:
資源簡(jiǎn)介
建立文法及其LL(1)分析表表示的數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)并實(shí)現(xiàn)相應(yīng)的預(yù)測(cè)分析器,對(duì)源程序經(jīng)詞法分析后生成的二元式代碼流進(jìn)行預(yù)測(cè)分析,如果輸入串是文法定義的句子則輸出“是”,否則輸出“否”。

代碼片段和文件信息
#include?
#include?
#include?
#include?
//???????????????0???1???2???3???4???5???6
char?termin[7]={‘#‘‘;‘‘+‘‘*‘‘(‘‘)‘‘i‘};??????????/*終結(jié)符號(hào)*/
char?non_ter[8]={‘p‘‘P‘‘e‘‘t‘‘E‘‘f‘‘T‘‘S‘};?????????/*非終結(jié)符號(hào)*/
char?Yy_pushtab[13][4]=???????????????????????????????????/*逆序存放產(chǎn)生式右部?jī)?nèi)容*/
{
{‘P‘‘;‘‘e‘‘\0‘}
{‘p‘‘\0‘}
{‘\0‘}
{‘E‘‘t‘‘\0‘}
{‘\0‘}
{‘E‘‘t‘‘+‘‘\0‘}
{‘\0‘}
{‘T‘‘f‘‘\0‘}
{‘T‘‘f‘‘*‘‘\0‘}
{‘\0‘}
{‘)‘‘e‘‘(‘‘\0‘}
{‘i‘‘\0‘}
{‘p‘‘\0‘}
};
int?Yy_d[8][7]=????????????????????????????//LL1分析表
{
-1 0 -1 -1 0 -1 0
2 1 -1 -1 1??-1 1
-1 4 -1 -1 3 4 3
-1 -1 -1 -1 7 -1 7
-1 6 5 -1 -1 6 -1
-1 -1 -1 -1 10 -1 11
-1 9 9 8 -1 9 -1
-1 12 -1 -1 12 -1 12
};
int?is_Vt(char?x)//判斷是否為終結(jié)符
{
int?i;
// printf(“x?=?%c?\n“x);
for(i=0;i<7;i++)
{
if(termin[i]==x){
// ????printf(“is_Vt?:?%c??%d\n“termin[i]i);
????????????return?1;???????//若是,返回1
}
}
?????return?0;????//若不是,返回0
}
/*******************************************
?主函數(shù)
********************************************/
int?main()
{
int?ijkpqwhat_to_doa;
????char?chre;
char?W[20]=“S“S[20]=“S“str[20]st[20];
????printf(“\n?請(qǐng)輸入該文法的句型:“);
scanf(“%s“st);
//????st={‘1‘‘+‘‘2‘‘;‘};
????for(?a=0;a<=strlen(st);a++)
????{
????????r=st[a];
????????if(isdigit(r))??//判斷是否是十進(jìn)制數(shù)
????????????str[a]=‘i‘;
????????else?str[a]=st[a];
????}
????st[strlen(st)]=‘#‘;
i=strlen(str);
// str[i]=‘#‘;
// str[i+1]=‘\0‘;
j=0;
ch=str[j];
printf(“S棧(字母)?|?str棧(輸入串)??|?What_to_do?\n“);
????while(S[0]!=‘\0‘)//分析棧非空則繼續(xù)
{
????????for(q=0;S[q]!=‘\0‘;q++)
????????????W[q]=S[q];
????????W[q]=‘\0‘;
//????????printf(“resurlt?:?%d\n“is_Vt(S[strlen(S)-1]));
if(is_Vt(S[strlen(S)-1]))//棧頂為終結(jié)符
{
// printf(“\n棧頂元素為:%c?ch為:?%c?\n“S[strlen(S)-1]ch);
what_to_do=-1;
if(S[strlen(S)-1]!=ch)//棧頂與輸入符號(hào)不等
{
printf(“\n分析結(jié)果:該符號(hào)串不是文法的句型!\n“);
????????????????return?0;
}
else
{
????????????????S[strlen(S)-1]=‘\0‘;
j++;
ch=str[j];
}
}
else?//棧頂為非終結(jié)符
{
// printf(“進(jìn)來(lái)過(guò)\n“);
????????????for(i=0;;i++)//獲得Yy_d[][]的第一個(gè)下標(biāo)
if(non_ter[i]==S[strlen(S)-1])
break;
for(k=0;;k++)//獲得Yy_d[][]的第二個(gè)下標(biāo)
{
if(termin[k]==ch)
break;
if(k==strlen(termin))//輸入符號(hào)不是終結(jié)符
{
printf(“詞法錯(cuò)誤!“);
return?0;
}
}
what_to_do=Yy_d[i][k];
if(what_to_do==-1)
{
printf(“語(yǔ)法錯(cuò)誤!“);
return?0;
}
else???????????????????????????????????//把棧頂元素彈出???再把右部壓棧
{
????????????????if(Yy_pushtab[what_to_do][0]==‘\0‘)
S[strlen(S)-1]=‘\0‘;
else
{
int?mnh;
????n=strlen(S)-1;
????m=n;
????for(?h=0;h S[n++]=Yy_pushtab[what_to_do][h];
????S[m+strlen(Yy_pushtab[what_to_do])]=‘\0‘;
}
}
}
printf(“?%-10s????????
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????3415??2018-05-09?16:40??非遞歸預(yù)測(cè)分析器.c
?????文件???????2218??2018-05-07?21:58??編譯原理非遞歸預(yù)測(cè).lnk
-----------?---------??----------?-----??----
?????????????????5633????????????????????2
評(píng)論
共有 條評(píng)論