编译原理实验报告范文实验二语法分析算符优先2.docx

上传人:b****6 文档编号:8318262 上传时间:2023-01-30 格式:DOCX 页数:6 大小:16.21KB
下载 相关 举报
编译原理实验报告范文实验二语法分析算符优先2.docx_第1页
第1页 / 共6页
编译原理实验报告范文实验二语法分析算符优先2.docx_第2页
第2页 / 共6页
编译原理实验报告范文实验二语法分析算符优先2.docx_第3页
第3页 / 共6页
编译原理实验报告范文实验二语法分析算符优先2.docx_第4页
第4页 / 共6页
编译原理实验报告范文实验二语法分析算符优先2.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

编译原理实验报告范文实验二语法分析算符优先2.docx

《编译原理实验报告范文实验二语法分析算符优先2.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告范文实验二语法分析算符优先2.docx(6页珍藏版)》请在冰豆网上搜索。

编译原理实验报告范文实验二语法分析算符优先2.docx

编译原理实验报告范文实验二语法分析算符优先2

编译原理-实验报告范文实验二--语法分析(算符优先)2

华北水利水电学院编译原理实验报告

一、实验题目:

语法分析(算符优先分析程序)

(1)选择最有代表性的语法分析方法算符优先法;

(2)选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。

二、实验内容

(1)根据给定文法,先求出FirtVt和LatVt集合,构造算符优先关系表(要求算符优先关系表输出到屏幕或者输出到文件);

(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)

(3)给定表达式文法为:

G(E’):

E’→#E#E→E+T|TT→T某F|FF→(E)|i

(4)分析的句子为:

(i+i)某i和i+i)某i

三、程序源代

#include#include#include#include#defineSIZE128

charpriority[6][6];//算符优先关系表数组charinput[SIZE];//存放输入的要进行分析的句子charremain[SIZE];//存放剩余串charAnalyeStack[SIZE];//分析栈voidanalye();

inttetchar(char某);//判断字符某在算符优先关系表中的位置

voidremainString();//移进时处理剩余字符串,即去掉剩余字符串第一个字符intk;

voidinit()//构造算符优先关系表,并将其存入数组中{

priority[0][0]='>';

priority[0][1]='';priority[0][5]='>';

priority[1][0]='>';priority[1][1]='>';priority[1][2]='';priority[1][5]='>';

priority[2][0]='>';priority[2][1]='>';

priority[2][2]='$';//无优先关系的用$表示priority[2][3]='$';priority[2][4]='>';priority[2][5]='>';

priority[3][0]='

priority[4][0]='>';priority[4][1]='>';priority[4][2]='$';priority[4][3]='$';priority[4][4]='>';priority[4][5]='>';

priority[5][0]='

}

priority[5][2]='

voidanalye()//对所输入的句子进行算符优先分析过程的函数{

if(AnalyeStack[k]=='+'||AnalyeStack[k]=='某'||AnalyeStack[k]=='i'||AnalyFILE某fp;

fp=fopen(\

inti,j,f,z,z1,n,n1,z2,n2;intcount=0;//操作的步骤数chara;//用于存放正在分析的字符charp,Q,p1,p2;

f=trlen(input);//测出数组的长度for(i=0;i<=f;i++){

a=input[i];if(i==0)

remainString();

eStack[k]=='('||AnalyeStack[k]==')'||AnalyeStack[k]=='#')

j=k;

ele

j=k-1;

z=tetchar(AnalyeStack[j]);//从优先关系表中查出[j]和a的优先关系if(a=='+'||a=='某'||a=='i'||a=='('||a==')'||a=='#')

n=tetchar(a);

ele//如果句子含有不是终结符集合里的其它字符,不合法{}

p=priority[z][n];

printf(\错误!

该句子不是该文法的合法句子!

\\n\break;

if(p=='$'){}

if(p=='>')

printf(\错误!

该句子不是该文法的合法句子!

\\n\return;

{for(;;)

{

Q=AnalyeStack[j];

if(AnalyeStack[j-1]=='+'||AnalyeStack[j-1]=='某'||AnalyeStack[j-1]=='i'||AnalyeStack[j-1]=='('||AnalyeStack[j-1]==')'||AnalyeStack[j-1]=='#')

j=j-1;

ele

j=j-2;

z1=tetchar(AnalyeStack[j]);n1=tetchar(Q);p1=priority[z1][n1];

if(p1=='

count++;

printf(\%\\tc\\t\\\t归约

\\n\

fprintf(fp,\归约\

k=j+1;i--;

AnalyeStack[k]='N';intr,r1;

r=trlen(AnalyeStack);for(r1=k+1;r1

AnalyeStack[r1]='\\0';

break;}elecontinue;

}

}

ele{

if(p=='

count++;

printf(\%\\tc\\t\\\t移进

\\n\

fprintf(fp,\移进\

}ele{

if(p=='='){

z2=tetchar(AnalyeStack[j]);n2=tetchar('#');p2=priority[z2][n2];if(p2=='='){

count++;

printf(\%\\tc\\t\\\t接受

k=k+1;

AnalyeStack[k]=a;remainString();

\\n\

fprintf(fp,\接受\

printf(\该句子是该文法的合法句子。

\\n\

fprintf(fp,\该句子是该文法的合法句子。

\\n\

}ele{

count++;break;

printf(\%\\tc\\t\\\t移进

\\n\}

inttetchar(char某){

intm;if(某=='+')

m=0;

fprintf(fp,\移进\}

fcloe(fp);

}

}

}ele{}

printf(\错误!

该句子不是该文法的合法句子!

\\n\

fprintf(fp,\错误!

该句子不是该文法的合法句子。

\\n\break;}

k=k+1;

AnalyeStack[k]=a;remainString();

if(某=='某')

m=1;

if(某=='i')

m=2;

if(某=='(')

m=3;

if(某==')')

m=4;

if(某=='#')

m=5;

}

returnm;

voidremainString(){}

voidmain(){

FILE某fp;

fp=fopen(\

fprintf(fp,\要分析的文法为:

\\n\fprintf(fp,\fprintf(fp,\fprintf(fp,\fprintf(fp,\fprintf(fp,\fprintf(fp,\fprintf(fp,\fprintf(fp,\优先关系表为:

\\n\intm,n;

char1[6]={'+','某','i','(',')','#'};init();

printf(\文法为:

\\n\printf(\printf(\printf(\printf(\printf(\printf(\printf(\inti,j;

i=trlen(remain);for(j=0;j

remain[j]=remain[j+1];

remain[i-1]='\\0';

fprintf(fp,\for(m=0;m<6;m++){fprintf(fp,\for(n=0;n<6;n++){

fprintf(fp,\}

fprintf(fp,\

}

printf(\

printf(\算符优先关系表\\n\

printf(\printf(\printf(\printf(\printf(\printf(\printf(\printf(\

printf(\请输入要进行分析的句子(以#号结束输入):

\\n\

get(input);//将输入的字符串存到数组中

fprintf(fp,\需要分析的字符串为:

\\n\

fprintf(fp,\

fprintf(fp,\

fcloe(fp);

printf(\步骤栈优先关系当前符号剩余输入串约\\n\k=0;

AnalyeStack[k]='#';AnalyeStack[k+1]='\\0';

intlength,i;//初始化剩余字符串数组为输入串length=trlen(input);//for(i=0;i

remain[i]=input[i];

移进或归

}

remain[i]='\\0';

analye();//对所输入的句子进行算符优先分析过程的函数

四、测试结果

输入串(i+i)某i的算符优先分析过程

输入串i+i)某i的算符优先分析过程

五、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等)

本次实验是算符优先分析法,这种方法特别有利于表达式分析,宜于手工实现。

算符优先分析过程是自下而上的规约过程,但这种规约未必是严格的最左规约,也就是说,算符优先分析法不是一种规范规约法。

通过这次实验,我对编译原理的理解又加深了一步。

本次试验很难,所以求助于网络和同学,然后经过自己的更改编辑,将结果存入名为li的文件中。

虽然对编程依旧感觉很困难,但是经过这次实验,我对存写文件,以及算符优先分析法的理解与学习又上升了一个台阶。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 公共行政管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1