编译原理实验报告四

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理实验报告

题目表达式语法分析程序的构造学院

专业

班级

学号

学生姓名

指导教师

西安思源学院教务处制

二〇一年

实验四表达式语法分析程序的构造

一、实验目的

1 掌握C++语言编译的语法分析程序

2 分别掌握LL(1)、算符优先、LR等语法分析方法的构造。

二、实验环境

Microsoft Visual C++ 6.0

三、实验内容

给定某一文法,试构造其简单优先矩阵(或LL(1)矩阵),并编制程序。给出相应句子的语法分析过程,判其正确性。

例如:给定文法G:

E→T E1

E1→+TE1/ε

T→FT1

T1→*F/ε

F→id/(E)

(1)先构造其SELECT集合,判定其是否为LL(1)文法

(2)是则构造其分析表

(3)给出句子id+id*id$的语法分析过程

四、设计说明

LL(1):

#include

#include

typedef int datatype;

char a[N3]={'$','E'};

char c[N4]={'$','z','*','z','+','z'};

char *B[N1][N2]={

" ", "z ", "+ " , "*" , "(" , ")", "$ ",

"E " , "xT", " " , " ", "xT", " ", " ",

"x ", " ", "xT+", " ", " ", "", "",

"T ", "yF", " ", " ", "yF ", " ", " ",

"y ", " ", "", "yF*", " ", "" , "",

"F ", "z", " ", " ", ")E(", " ", " ",

};

void FXB()

{

int i,j;

cout<<"分析表为: "<

for(i=0;i

{

for(j=0;j

{cout<

cout<

void WF()

{ int s;

char *w[5]={"E->TE'","E'->TE'/e","T->FT'","T'->*F/e","F->(E)/id"}; cout<<"文法为: "<

for(s=0;s<5;s++)

{cout<

}

void SELECT()

{

cout<<"SELECT集合为:"<

cout<<"1. select(E->TE')=FIRST(TE')={(,id}"<

cout<<"2. select(E'->+TE')=FIRST(+TE')={+}"<

cout<<"3. select(E'->e)=FIRST(E)UFOLLOW(E')-{e}={$,)}"<

cout<<"4. select(T->FT')={(,id}"<

cout<<"5. select(T'->*F)={*}"<

cout<<"6. select(T'->e)={+,),$}"<

cout<<"7. select(F->(E))={(}"<

cout<<"8. select(F->id)={id}"<

cout<<"为LL(1)文法"<

}

void showa()

{ int i;

cout<<"分析栈为:"<

for(i=0;i

{if(a[i]!=0) cout<

cout<

void showb()

{ int j;

cout<<"输入流为:"<

for(j=0;j

{if(c[j]!=NULL) cout<

cout<

}

void FX()

{

cout<<"分析如下:"<

showa();showb();

int i,j,m,n;

i=I();j=J();m=M();n=N();

while(a[m]!='$')

{

if ((a[m]!=c[n])&&(B[i][j]!=NULL))

{

a[m]=B[i][j][0];

a[m+1]=B[i][j][1];

a[m+2]=B[i][j][2];

showa();showb();m=M();n=N();

if(a[m]==c[n]){ }

else{m=M();n=N();i=I();j=J();}

}

else if(a[m]==c[n])

{a[m]=NULL; c[n]=NULL;showa();showb();

m=M();n=N();i=I();j=J();}

}

}

void main()

{WF();SELECT();FXB();FX();}

算符优先:

void main()

{ int i,j,k=0;

printf("请输入文法规则数:");

scanf("%d",&r);

printf("请输入文法规则:\n");

for(i=0;i

{scanf("%s",st[i]);//存储文法规则,初始化FIRSTVT集和LASTVT集

first[i][0]=0;/*first[i][0]和last[i][0]分别表示st[i][0]非终极符的FIRSTVT集和LASTVT集中元素的个数*/

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]!='|')

相关文档
最新文档