编译原理_实验报告实验二__语法分析(算符优先)2_第1页
编译原理_实验报告实验二__语法分析(算符优先)2_第2页
编译原理_实验报告实验二__语法分析(算符优先)2_第3页
编译原理_实验报告实验二__语法分析(算符优先)2_第4页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.华北水利水电学院编译原理实验报告一、 实验题目 :语法分析 (算符优先分析程序)( 1)选择最有代表性的语法分析方法算符优先法;( 2)选择对各种常见程序语言都用的语法结构,如赋值语句 (尤指表达式 )作为分析对象,并且与所选语法分析方法要比较贴切。二、 实验内容( 1)根据给定文法 ,先求出 FirstVt 和 LastVt 集合 ,构造算符优先关系表 (要求算符优先关系表输出到屏幕或者输出到文件 );( 2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程 )( 3)给定表达式文法为 :G(E): E#E# EE+T | TT T*F |FF(E)|

2、i(4) 分析的句子为 : (i+i)*i 和 i+i)*i三、程序源代#include<stdlib.h>#include<stdio.h>#include<string.h>#include<iostream.h>专业 .专注.#define SIZE 128char priority66;/ 算符优先关系表数组char inputSIZE;/ 存放输入的要进行分析的句子char remainSIZE;/ 存放剩余串char AnalyseStackSIZE;/ 分析栈void analyse();inttestchar(char x);/

3、判断字符X 在算符优先关系表中的位置void remainString();/ 移进时处理剩余字符串,即去掉剩余字符串第一个字符int k;void init()/构造算符优先关系表,并将其存入数组中priority00='>'priority01='<'priority02='<'priority03='<'priority04='>'priority05='>'priority10='>'priority11='>'

4、priority12='<'priority13='<'priority14='>'专业 .专注.priority15='>'priority20='>'priority21='>'priority22='$'/无优先关系的用$表示priority23='$'priority24='>'priority25='>'priority30='<'priority31=&#

5、39;<'priority32='<'priority33='<'priority34='='priority35='$'priority40='>'priority41='>'priority42='$'priority43='$'priority44='>'priority45='>'专业 .专注.priority50='<'priority51='&l

6、t;'priority52='<'priority53='<'priority54='$'priority55='='void analyse()/对所输入的句子进行算符优先分析过程的函数FILE *fp;fp=fopen("li","a");int i,j,f,z,z1,n,n1,z2,n2;int count=0;/操作的步骤数char a; /用于存放正在分析的字符char p,Q,p1,p2;f=strlen(input);/ 测出数组的长度for(i=0;i&l

7、t;=f;i+)a=inputi;if(i=0)remainString();专业 .专注.if(AnalyseStackk='+'|AnalyseStackk='*'|AnalyseStackk='i'|AnalyseStackk='('|AnalyseStackk=')'|AnalyseStackk='#')j=k;elsej=k-1;z=testchar(AnalyseStackj);/ 从优先关系表中查出s j和 a 的优先关系if(a='+'|a='*'|a

8、='i'|a='('|a=')'|a='#')n=testchar(a);else / 如果句子含有不是终结符集合里的其它字符,不合法printf(" 错误 !该句子不是该文法的合法句子!n");break;p=priorityzn;if(p='$')printf(" 错误 !该句子不是该文法的合法句子!n");return;if(p='>') for( ; ; )专业 .专注.Q=AnalyseStackj;if(AnalyseStackj-1=

9、9;+'|AnalyseStackj-1='*'|AnalyseStackj-1='i'|AnalyseStackj-1='('|AnalyseStackj-1=')'|AnalyseStackj-1='#')j=j-1;elsej=j-2;z1=testchar(AnalyseStackj);n1=testchar(Q);p1=priorityz1n1;if(p1='<')/ 把 AnalyseStack j+1AnalyseStackk归约为 Ncount+;printf(&quo

10、t;(%d)%st%10ct%5c%17st归约n",count,AnalyseStack,p,a,remain);fprintf(fp,"(%d)%st%17st%sn",count,AnalyseStack,remain,"归约 ");k=j+1;i-;AnalyseStackk='N'int r,r1;r=strlen(AnalyseStack);for(r1=k+1;r1<r;r1+)专业 .专注.AnalyseStackr1='0'break;elsecontinue;elseif(p='

11、<')/ 表示移进count+;printf("(%d)%st%10ct%5c%17st移进n",count,AnalyseStack,p,a,remain);fprintf(fp,"(%d)%st%17st%sn",count,AnalyseStack,remain,"移进 ");k=k+1;AnalyseStackk=a;remainString();elseif(p='=')专业 .专注.z2=testchar(AnalyseStackj);n2=testchar('#');p2=p

12、riorityz2n2;if(p2='=')count+;printf("(%d)%st%10ct%5c%17st接 受n",count,AnalyseStack,p,a,remain);fprintf(fp,"(%d)%st%17st%sn",count,AnalyseStack,remain,"接受 ");printf(" 该句子是该文法的合法句子。 n");fprintf(fp,"%s","该句子是该文法的合法句子。 n");break;elsecoun

13、t+;printf("(%d)%st%10ct%5c%17st移 进n",count,AnalyseStack,p,a,remain);fprintf(fp,"(%d)%st%17st%sn",count,AnalyseStack,remain,"移进 ");k=k+1;专业 .专注.AnalyseStackk=a;remainString();elseprintf(" 错误 !该句子不是该文法的合法句子!n");fprintf(fp,"%s","错误!该句子不是该文法的合法句子。 n

14、");break;fclose(fp);int testchar(char x)int m;if(x='+')m=0;if(x='*')m=1;专业 .专注.if(x='i')m=2;if(x='(')m=3;if(x=')')m=4;if(x='#')m=5;return m;void remainString()int i,j;i=strlen(remain);for( j=0;j<i;j+)remainj=remainj+1;remaini-1='0'void

15、main()int m,n;char s16= '+','*','i','(',')','#'专业 .专注.init();printf(" 文法为 : n");printf("(0)E'->#E#n");printf("(1)E->E+Tn");printf("(2)E->Tn");printf("(3)T->T*Fn");printf("(4)T->F

16、n");printf("(5)F->(E)n");printf("(6)F->in");FILE *fp;fp=fopen("li","w");fprintf(fp,"%s","要分析的文法为:n");fprintf(fp,"%s","(0)E'->#E#n");fprintf(fp,"%s","(1)E->E+Tn");fprintf(fp,"

17、%s","(2)E->Tn");fprintf(fp,"%s","(3)T->T*Fn");fprintf(fp,"%s","(4)T->Fn");fprintf(fp,"%s","(5)F->(E)n");fprintf(fp,"%s","(6)F->in");fprintf(fp,"%s","优先关系表为:n");fprintf(fp

18、,"%s","+*i()#n");for(m=0;m<6;m+)专业 .专注.fprintf(fp,"%c",s1m);for(n=0;n<6;n+)fprintf(fp,"%c",prioritymn);fprintf(fp,"%s","n");printf("-n");printf("算符优先关系表 n");printf("+*i()#n");printf("+><<<

19、;>>n");printf("*>><<>>n");printf("i>>>>n");printf("(<<<<=n");printf(")>>>>n");printf("#<<<<=n");printf("-n");printf("请输入要进行分析的句子(以# 号结束输入 ):n");gets(input);/将输入的字符串存到数组中fprintf(fp,"%s","需要分析的字符串为: n");fprintf(fp,"%s&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论