语法分析器构造_第1页
语法分析器构造_第2页
语法分析器构造_第3页
语法分析器构造_第4页
语法分析器构造_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、编译原理实验报告实验题目:语法分析器构造指导教师: 姓名:班级:学号:实验成绩:实验题目语法分析器构造实验目的和要求借助于词法分析程序提供的分析结果,编写一个算符优先语法分析程序,程序能进行语法结构分析和错误检查并产生相应的归约信息。同时给出出错信息和错误类型,从而加深对语法分析的理解。设计思想与框架main函数:算术表达式函数:算符优先算法:核心算法主要数据结构说明:符号栈:stackN栈顶指针:top记录归约步骤号:NoN输入字符串:stringsN算术表达式:old_stringsN记录下一个输入符号:a可归约字符串:*word6手动生成的算符优先表:x99查找算符表达式:express

2、ion(char *str)入栈:push(char ch)出栈:pop(char ch)根据算符优先分析表设置读入优先次序:rank(char ch1,char ch2)判断是否为终结符:isVT(char ch)算符优先分析函数:analysis()算符优先分析算法算法采用一个符号栈的数据结构,既用它存放终结符,也用它存放非终结符。设K为符号栈使用深度,其参考算法如下: K:=1; StackK:= '#' Repeat 把下一个输入符号读进a中; If StackKVT then j:=K else j:=K-1; while Stackj优先级比a高 do Begin

3、Repeat Q:=Stackj; If Stackj-1VT then j:=j-1 else j:=j-2 Until Stackj比Q优先级低; 把Stackj+1StackK归约为某个N;记录归约产生式序号; K:=j+1; StackK:=N end of while If Stackj比a优先级低 OR Stackj与a优先级相同 then Begin K:=K+1; StackK:=a end else ERROR 查表打印出错信息 Until a='#'源程序及注释#include<stdio.h>#include<string.h>#i

4、nclude<conio.h>#include<stdlib.h>#define N 100char stackN,stringsN,old_stringsN;int top=-1;int k=0;/k输入字符串数字strings即将被读的字符位置标识int NoN,id=1,sr=0,step=1,n=0;char a;/用于传递即将读入的字符char x99=' ','+','-','*','/','(',')','i','#

5、9;, '+','>','>','<','<','<','>','<','>', '-','>','>','<','<','<','>','<','>', '*','>',

6、9;>','>','>','<','>','<','>', '/','>','>','>','>','<','>','<','>', '(','<','<','<','&l

7、t;','<','=','<',' ', ')','>','>','>','>',' ','>',' ','>', 'i','>','>','>','>',' ','>',' '

8、,'>', '#','<','<','<','<','<',' ','<','='char *word6="N+N","N-N","N*N","N/N",")N(","i"/可归约字符串FILE *fp;int isletter(char ch)if(ch>'a&

9、#39;&&ch<'z'|ch>'A'&&ch<'Z')return 1;return 0;int isdigit(char ch)if(ch>='0'&&ch<='9')return 1;return 0;void expression(char *str) int i=sr,j=0,m=0;if(stri!='#')while(stri!='='&&stri!='#')/

10、查找赋值号'='的位置i+;if(stri-1='>'|stri-1='<'|stri-1='='|stri-1='!')|stri-1='=')i+;i+;while(stri!='0'&&stri!=' '&&stri!='#')/将赋值号'='后面的语句读入old_strings 中old_stringsj+=stri+;sr=i;/记录预处理中字符串读到的位置old_stringsj=

11、'0'j=0;/将算符表达式中的数字与字母转换为'i'if(isletter(old_stringsj)|isdigit(old_stringsj)stringsm+='i'elsestringsm+=old_stringsj;j+;while(old_stringsj!='0')if(isletter(old_stringsj)|isdigit(old_stringsj)if(isletter(old_stringsj-1)=0&&isdigit(old_stringsj-1)=0)stringsm+='

12、i'elsestringsm+=old_stringsj;j+;stringsm='#'stringsm+1='0'void push(char ch)/入栈stack+top=ch;char pop()/出栈char a;a=stacktop-;stacktop+1='0'return a;int rank(char ch1,char ch2)/根据算符优先分析矩阵设置读入优先次序/0表示等于,1表示大于,-1表示小于,2表示没有int i=0,j=0;if(isdigit(ch1)ch1='i'if(isdigit(c

13、h2)ch2='i'switch (ch1)case '+':i=1;break;case '-':i=2;break;case '*':i=3;break;case '/':i=4;break;case '(':i=5;break;case ')':i=6;break;case 'i':i=7;break;case '#':i=8;break;default:break;switch (ch2)case '+':j=1;break;c

14、ase '-':j=2;break;case '*':j=3;break;case '/':j=4;break;case '(':j=5;break;case ')':j=6;break;case 'i':j=7;break;case '#':j=8;break;default:break;if(xij='>')return 1;else if(xij='<')return -1;else if(xij='=')return

15、 0;elsereturn 2;void print(int t,int m)printf("n%-8d%-10s",step+,stack);if(m=1)printf("%-8c",'>');else if(m=0)printf("%-8c",'=');elseprintf("%-8c",'<');printf("%-10c",a);printf("%-10s",&stringsk);if(t)print

16、f("%-8s","归约");Non+=step-1;elseprintf("%-8s","移进");int isVT(char ch)if(ch='N') return 0; else return 1;void analysis()int i,j=-1,m;char ch20,str;push('#');print(0,-1);a=strings0;while(a!='0')if(stacktop='N'&&k=(strlen(st

17、rings)a=stringsk-1;elsea=stringsk;k+;if(isVT(stacktop)j=top;elsej=top-1;while(isVT(a)&&rank(stackj,a)=1)/判断是否满足规约的条件memset(ch,0,sizeof(ch);int h;doh=j;/h记录要规约的位置if(isVT(stackj-1)j=j-1;elsej=j-2;while(rank(stackj,stackh)!=-1);i=-1;while(top-j)!=0)ch+i=pop();chi+1='0'for (m=0;m<=5;m

18、+)/把字符数组ch规约成'N'if(strcmp(wordm,ch)=0)str='N'push(str);/将规约后的N压入stack栈中/k+;print(1,1);if(rank(stackj,a)=-1)push(a);/k+;print(0,-1);else if(rank(stackj,a)=0)push(a);/k+;print(0,0);else if(a!='0')printf("出错!");printf("错误为第%d个字符%cn",k+1,stringsk);exit(1);int

19、main()printf("*算符优先语法分析程序*n");printf(" E->E+T|E-T|Tn");printf(" T->T*F|T/F|Fn");printf(" F->(E)|in");printf(" E表示算术表达式.T表示项.F表示因子.i表示变量或常数.n");printf(" 优先表n");printf(" + - * / ( ) i #n");printf(" + > > < <

20、; < > < >n"); printf(" - > > < < < > < >n");printf(" * > > > > < > < >n");printf(" / > > > > < > < >n");printf(" ( < < < < < = < e1n");printf(" ) &g

21、t; > > > e2 > e2 >n");printf(" i > > > > e2 > e2 >n");printf(" # < < < < < e3 < =n");if(fp=fopen("预处理.txt","r")=NULL)printf("文件打开失败!");exit(0);char ch4048='0'int i=0,j=0;ch0=fgetc(fp);while(chi!='#')/将预处理文件的内容读入至数组ch中ch+i=fgetc(fp);ch+i='0'fclose(fp);i=0;while(chi!='#')memset(strings,0,sizeof(strings);/输入表达式strings初始化mem

温馨提示

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

评论

0/150

提交评论