資源簡介
LL(1)語法分析器的范例代碼...實驗內容及操作示范詳見實驗指導書...
內容簡介:
1.如下為給定的LL(1)文法。 G[]: 1) ->program : begin end {program} 2) D->i D’ {i} 3) D’->, i D’ {,} 4) D’->ε {:} 5) S->s S’ {s} 6) S’-> s S’ { } 7) S’->ε {end} 8) T->real {real} 9) T->integer {integer} 其中右側{}內為產生的可選集。
2.調試并完善如下給出的文法的LL(1)分析器示例程序,并設輸入的文法的句子為: program i , i , i : integer begin s s s end 給出輸出結果并進行分析說明。

代碼片段和文件信息
#include?“stdio.h“
#include?“string.h“
#include?“stdlib.h“
#include?“conio.h“
typedef?struct
{?int?kind;??/*kind值為0時,表示為非終結符,否則存儲終結符的種別碼*/
??int?entry;??/*存儲文法符號名的位置(即下標)*/
}?tokentype;??/*定義Token字類型,即文法符號類型*/
typedef?struct
{??tokentype?left;?/*產生式的左部*/
???tokentype?right[20];?/*產生式的右部*/
???int?rightlen;??/*產生式右部的長度*/
}?ptype;??/*產生式類型*/
typedef?struct?{
tokentype?vn[30];??/*非終結符集*/
char?vn_names[30][10];??/*存放各非終結符名稱*/
tokentype?vt[100];?/*存放終結符*/
char?vt_names[30][20];??/*存放各終結符名稱*/
ptype?p[40];?/*存放產生式*/
int?s;??/*文法的開始符號*/
int?vnlenvtlenplen;?/*非終結符、終結符與產生式的個數*/
}gtype;?/*文法類型*/
int?isvt(tokentype?token)?/*判斷token是否為終結符*/
{?return?(token.kind!=0);}
int?locatevn(gtype?*G?char?name[])/*在文法G中查找給定面值為name的非終結符位置*/
{?int?i;
??for(i=1;i<=G->vnlen;i++)
????if(strcmp(nameG->vn_names[i])==0)?return?i;
??return?0;
}
int?locatevt(gtype?*g?char?name[])?/*查找面值為name的終結符位置*/
{?int?i;
??for(i=1;i<=g->vtlen;i++)
????if(strcmp(nameg->vt_names[i])==0)?return?i;
??return?0;
}
void?InputG(gtype?*G)??/*文法的輸入函數*/
{??int?ijk;
???int?vt_tag;
???char?name[30];
???printf(“\n?Input?the?number?of?VN:“);
???scanf(“%d“&(G->vnlen));
???for(i=1;i<=G->vnlen;i++)?/*輸入非終結符*/
???{??printf(“Input?%dth?VN:“i);
??????scanf(“%s“G->vn_names[i]);
?????G->vn[i].kind=0;G->vn[i].entry=i;
???}
???printf(“\nInput?the?number?of?Vt:“);
???scanf(“%d“&(G->vtlen));
???for(i=1;i<=G->vtlen;i++)/*注釋A:輸入終結符*/
???{??printf(“Input?%dth?Vt:“i);
??????scanf(“%s“G->vt_names[i]);
G->vt[i].kind=i;?/*終結符的種別碼按輸入順序編號*/
G->vt[i].entry=i;
????}
???G->vt[++G->vtlen].kind=-1;?G->vt[G->vtlen].entry=G->vtlen;
???strcpy(G->vt_names[G->vtlen]“#“);??/*增加結束標識#,種別碼為-1*/
???printf(“\n?Input?the?number?of?P:“);
???scanf(“%d“&(G->plen));
???for(i=1;i<=G->plen;i++)?/*輸入產生式*/
???{??printf(“Input?%dth?P:\n“i);
printf(“Input?Left:“);
??????scanf(“%s“?name);
k=locatevn(Gname);
if?(k)?G->p[i].left=G->vn[k];
else?{?printf(“?Wrong!!!??%s?is?not?a?right?Vn.?\n“name);exit(0);}
??????printf(“Input?right?len:“);
??????scanf(“%d“&(G->p[i].rightlen));
?????for(j=0;jp[i].rightlen;j++)
?????{??printf(“???Input?%dth?symbol\n“j+1);
????????printf(“?????Is?vt---1(Yes)0(No):“);?scanf(“%d“&vt_tag);
????????printf(“???????name:“);???scanf(“%s“?name);
????????if(vt_tag)
????{??k=locatevt(G?name);
???????if(k)??G->p[i].right[j]=G->vt[k];
???????????else??{?printf(“?Wrong!!!??%s?is?not?a?right?Vt.?\n“name);exit(0);}
????}
else?{???k=locatevn(Gname);
if?(k)?G->p[i].right[j]=G->vn[k];
else?{?printf(“?Wrong!!!??%s?is?not?a?right?Vn.?\n“name);exit(0);}
????????????}
??????}
???}
???printf(“input?start?symbol:“);
???scanf(“%s“name);
k=locatevn(Gname);
if?(k)??G->s=k;
else???{?printf(“?Wrong!!!??%s?is?not?a?right?Vn.?\n“name);exit(0);}
?}
?void?OutputG(gtype?*G)??/*輸出文法*/
?{??int?ij;
????printf(“G->Vn:\n“);
????for(i=1;i<=G->vnlen;i++)
????printf(“\t?%s\n“G->vn_names[i]);
getch();
????printf(“G->Vt:\n“);
????f
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????176202??2001-01-15?02:38??LL?(1)?parser\Debug\text3.exe
?????文件?????216552??2001-01-15?02:38??LL?(1)?parser\Debug\text3.ilk
?????文件??????18624??2001-01-15?02:38??LL?(1)?parser\Debug\text3.obj
?????文件?????213628??2001-01-15?01:14??LL?(1)?parser\Debug\text3.pch
?????文件?????476160??2001-01-15?02:38??LL?(1)?parser\Debug\text3.pdb
?????文件??????33792??2001-01-15?02:38??LL?(1)?parser\Debug\vc60.idb
?????文件??????53248??2001-01-15?02:38??LL?(1)?parser\Debug\vc60.pdb
?????文件???????8836??2001-01-15?02:17??LL?(1)?parser\g1.dat
?????文件??????12000??2001-01-15?02:26??LL?(1)?parser\LL1.dat
?????文件???????5715??2001-01-15?02:38??LL?(1)?parser\text3-1.txt
?????文件???????5717??2001-01-15?02:39??LL?(1)?parser\text3-2.txt
?????文件???????5717??2001-01-15?02:38??LL?(1)?parser\text3.cpp
?????文件???????3389??2001-01-15?01:14??LL?(1)?parser\text3.dsp
?????文件????????535??2001-01-15?02:39??LL?(1)?parser\text3.dsw
?????文件??????33792??2001-01-15?02:39??LL?(1)?parser\text3.ncb
?????文件??????48640??2001-01-15?02:39??LL?(1)?parser\text3.opt
?????文件???????1123??2001-01-15?02:38??LL?(1)?parser\text3.plg
?????目錄??????????0??2001-01-15?01:14??LL?(1)?parser\Debug
?????目錄??????????0??2001-01-15?01:13??LL?(1)?parser
-----------?---------??----------?-----??----
??????????????1313670????????????????????19
- 上一篇:基于離散分數余弦變換的圖像加密算法研究
- 下一篇:湖北大學計算機網絡期末試題和重點
評論
共有 條評論