資源簡介
根據(jù)某一文法編制調(diào)試LL(1)分析程序,以便對任意輸入的符號串進(jìn)行分析。

代碼片段和文件信息
/*LL(1)分析法源程序,只能在VC++中運(yùn)行??*/
#include
#include
#include
#include
char?A[20]; /*分析棧*/
char?B[20]; /*剩余串*/
char?v1[20]={‘i‘‘+‘‘*‘‘(‘‘)‘‘#‘}; /*終結(jié)符??*/
char?v2[20]={‘E‘‘G‘‘T‘‘S‘‘F‘}; /*非終結(jié)符???*/
int?j=0b=0top=0l; /*L為輸入串長度?*/
typedef?struct?type /*產(chǎn)生式類型定義??*/
{
char?origin; /*大寫字符??*/
char?array[5]; /*產(chǎn)生式右邊字符?*/
int?length; /*字符個數(shù)??????*/
}type;
type?etgg1ss1ff1; /*結(jié)構(gòu)體變量??*/
type?C[10][10]; /*預(yù)測分析表??*/
/*--------------------------------*/
/*輸出分析棧??*/
void?print()
{
int?a; /*指針*/
for(a=0;a<=top+1;a++)
printf(“%c“A[a]);
printf(“\t\t“);
}
/*--------------------------------*/
/*輸出剩余串*/
void?print1()
{
int?j;
for(j=0;j printf(“?“);
for(j=b;j<=l;j++)
printf(“%c“B[j]);
printf(“\t\t\t“);
}
/*--------------------------------*/
void?main()
{
int?mnk=0flag=0finish=0;
char?chx;
type?cha;/*用來接受C[m][n]*/
/*把文法產(chǎn)生式賦值結(jié)構(gòu)體*/
e.origin=‘E‘; strcpy(e.array“TG“); e.length=2;
t.origin=‘T‘; strcpy(t.array“FS“); t.length=2;
g.origin=‘G‘; strcpy(g.array“+TG“); g.length=3;
g1.origin=‘G‘; g1.array[0]=‘^‘; g1.length=1;
????s.origin=‘S‘; strcpy(s.array“*FS“); s.length=3;
s1.origin=‘S‘; s1.array[0]=‘^‘; s1.length=1;
f.origin=‘F‘; strcpy(f.array“(E)“); f.length=3;
f1.origin=‘F‘; f1.array[0]=‘i‘; f1.length=1;
/*初始化分析表*/
for(m=0;m<=4;m++)
for(n=0;n<=5;n++)
C[m][n].origin=‘N‘;/*全部賦為空*/
???
/*填充分析表*/
C[0][0]=e; C[0][3]=e;
C[1][1]=g; C[1][4]=g1; C[1][5]=g1;
C[2][0]=t; C[2][3]=t;
C[3][1]=s1; C[3][2]=s; C[3][4]=C[3][5]=s1;
C[4][0]=f1; C[4][3]=f;
???
printf(“提示:本程序只能對由‘i‘‘+‘‘*‘‘(‘‘)‘構(gòu)成的以‘#‘結(jié)束的字符串進(jìn)行分析\n“);
printf(“請輸入要分析的字符串:“);
???
do/*讀入分析串*/
{
???scanf(“%c“&ch);
???if?((ch!=‘i‘)?&&(ch!=‘+‘)?&&(ch!=‘*‘)&&(ch!=‘(‘)&&(ch!=‘)‘)&&(ch!=‘#‘))
???{
???printf(“輸入串中有非法字符\n“);
???exit(1);
???}
???B[j]=ch;
???j++;
}while(ch!=‘#‘);
??
l=j; /*分析串長度*/
ch=B[0]; /*當(dāng)前分析字符*/
A[top]=‘#‘;?A[++top]=‘E‘; /*‘#‘‘E‘進(jìn)棧*/
printf(“步驟\t\t分析棧?\t\t剩余字符?\t\t所用產(chǎn)生式?\n“);
do
{
x=A[top--];/*x為當(dāng)前棧頂字符*/
printf(“%d“k++);
printf(“\t\t“);
for(j=0;j<=5;j++)/*判斷是否為終結(jié)符*/
if(x==v1[j])?
{
??flag=1;
??break;
}
if(flag==1)/*如果是終結(jié)符*/
{
??if(x==‘#‘)
??{
??finish=1; /*結(jié)束標(biāo)記*/
??printf(“acc!\n“); /*接受?*/
??getchar();
??getchar();
??exit(1);
??}
??if(x==ch)
??{
??print();
??print1();
??printf(“%c匹配\n“ch);
??ch=B[++b]; /*下一個輸入字符*/
??flag=0; /*恢復(fù)標(biāo)記*/
??}
??else
??{ /*出錯處理*/
??print();
??print1();
??printf(“%c出錯\n“ch);/*輸出出錯終結(jié)符*/
??exit(1);
??}
}
else
{ /*非終結(jié)符處理*/
for(j=0;j<=4;j++)
if(x==v2[j])
{
m=j; /*?m:?分析表行號*/
break;
}
for(j=0;j<=5;j++)
if(ch==v1[j])
{
n=j; /*n:?分析表列號*/
break;
}
cha=C[m][n];
if(cha.origin!=‘N‘)/*判斷是否為空*/
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????36352??2008-10-26?20:43??LL(1)分析\實(shí)驗(yàn)05-LL(1)分析.doc
?????文件?????????47??2008-10-05?19:47??LL(1)分析\t1-lower2Upper.lex
?????文件?????????57??2008-10-13?13:51??LL(1)分析\t2-printIdentifier.lex
?????文件?????????15??2008-10-13?15:46??LL(1)分析\t3-printEverything.lex
?????文件????????113??2008-11-05?15:59??LL(1)分析\t4-dividedBy7.lex
?????文件??????53248??2008-11-18?20:36??LL(1)分析\Debug\vc60.pdb
?????文件??????12463??2008-11-18?20:36??LL(1)分析\Debug\3-LL1-v2.obj
?????文件?????168003??2008-11-18?20:36??LL(1)分析\Debug\3-LL1-v2.exe
?????文件?????427008??2008-11-18?20:36??LL(1)分析\Debug\3-LL1-v2.pdb
?????文件??????41984??2008-11-18?20:37??LL(1)分析\3-LL1-v2.ncb
?????文件????????744??2008-11-18?20:36??LL(1)分析\3-LL1-v2.plg
?????文件???????3425??2008-11-18?20:13??LL(1)分析\3-LL1-v2.dsp
?????文件???????3747??2008-11-18?20:35??LL(1)分析\3-LL1-v2.c
?????文件??????48640??2008-11-18?20:37??LL(1)分析\3-LL1-v2.opt
?????文件????????541??2008-11-18?20:37??LL(1)分析\3-LL1-v2.dsw
?????目錄??????????0??2008-11-17?11:20??LL(1)分析\Debug
?????目錄??????????0??2008-11-17?10:36??LL(1)分析
-----------?---------??----------?-----??----
???????????????796387????????????????????17
評論
共有 條評論