好文档 - 专业文书写作范文服务资料分享网站

算符优先分析程序及报告

天下 分享 时间: 加入收藏 我要投稿 点赞

实验总结

在算符优先程序设计过程中,程序比较复杂,其中在优先关系矩阵的构造时遇到了非常大的困难,由于最初对程序的总体流程不是十分清晰,而且实验中因本人马虎将优先关系矩阵输入错误,造成了设计与调试的困难。但经过自己的努力,通过多次调试,最终构造出优先关系矩阵并调试成功。

通过本次实验一定程度上提高了软件开发能力,对编译原理这一门课程也有了比较深刻的了解。最后,由于所学知识不够全面,实验在很多方面还有待完善,在以后的学习过程中,会掌握更多知识,力求做到更好。

代码

#include #include #include #include

using namespace std;

const int maxsize=100; //为数组str[]、in[]分配的最大存储空间 const int length=100;//为数组array[]分配的最大存储空间

class stack {

private:

int size;//size为当前数组array[]的大小 char array[length];//用于存储读入的字符 public: stack() {

size=0;//数组array[]的初始长度为0 }

void push(char ch) {

if(size

array[size]=ch; size++; }

else//若数组已满,则给出出错信息 cout<<\ }

int pop(char ch[],int len)//弹出字符准备规约

word精品文档,可编辑,欢迎下载

{

if(size-len>=0) {

for(int i=0;i

ch[i]=array[size-len+i]; size-=len; return len; } else {

cout<<\参数错误!\ return 0; } }

char saomiao(int pos)//判断大小是否合法 {

if(pos>=0&&pos

void saomiaosuoyou()//输出当前数组中的字符 {

for(int i=0;i

int getsize()//返回当前数组大小 {

return size; } };

char guiyue(char ch[])//规约为'M' {

return 'M'; }

int isnumch(char ch)//判断ch是不是数字或小写字母 {

return (ch>='0'&&ch<='9'||ch>='a'&&ch<='z'); }

int getrank(char ch1,char ch2)//根据算符优先分析矩阵设置读入优先次序

{ //0表示等于,1表示大于,-1表示小于,2表示没有优先关系

if(isnumch(ch1)) ch1='i';

word精品文档,可编辑,欢迎下载

if(isnumch(ch2)) ch2='i';

if(ch1=='+'||ch1=='-') {

if(ch2=='+'||ch2=='#'||ch2==')'||ch2=='-') return 1; else

return -1; }

if(ch1=='*'||ch1=='/') {

if(ch2=='('||ch2=='i') return -1; else

return 1; }

if(ch1=='(') {

if(ch2==')') return 0;

else if(ch2=='#') return 2; else

} if(ch1=='i'||ch1==')') {

if(ch2=='i'||ch2=='(') return 2; else

return 1; } if(ch1=='#') {

if(ch2=='#') return 0; else

if(ch2==')')

word精品文档,可编辑,欢迎下载 return -1;

return 2; else

return -1; }

return 2; }

int isvt(char ch)//区别参加规约的资格 {

if(ch>='a'&&ch<='z') return 1;

if(ch>='('&&ch<='+') return 1; if(ch=='#') return 1; if(ch=='/') return 1; if(ch=='-') return 1;

if(ch>='0'&&ch<='9') return 1; return 0; }

/****************主函数**************/ void main() {

char juzhen[9][9]={' ','+','-','*','/','(',')','i','#', '+','>','>','<','<','<','>','<','>', '-','>','>','<','<','<','>','<','>', '*','>','>','>','>','<','>','<','>', '/','>','>','>','>','<','>','<','>', '(','<','<','<','<','<','=','<',' ', ')','>','>','>','>',' ','>',' ','>', 'i','>','>','>','>',' ','>',' ','>', '#','<','<','<','<','<',' ','<','=', }; cout<<\此文法的算符优先矩阵如下所示*******\ for(int i=0;i<=8;i++) //输出算符优先矩阵 {

for(int j=0;j<=8;j++) {

cout<

cout<

word精品文档,可编辑,欢迎下载

}

char in[maxsize]; //用于接收输入文件名 char str[maxsize];

FILE *fin; //用于指向输入文件的指针

cout<<\请输入源程序文件名(例如1.txt):\ cin>>in;

if ((fin=fopen(in,\判断输入文件名是否正确 {

cout<

int m=0;

char ch1='a';

while (ch1!='#')//从文件中读入一串字符 {

ch1=getc(fin); str[m++]=ch1; }

str[m]='#';//将'#'赋给字符串尾 stack s;//定义stack类的变量s int len;

len=int(strlen(str));//取出输入字符串的长度 s.push('#');//先把'#'压入数组array[]

int k=s.getsize()-1,t=0,j;//k为当前数组array[]读入已读入字符的位置标识, //t为输入字符串数组str[]即将被读的字符位置标识,

//j用于记录当前数组array[]中的最后一个非终结符的位置

char a=str[0];//a用于传递即将读入的字符

while(a!='#')//如果a不等于'#',则继续读入操作或规约操作 {

a=str[t];

if(isvt(s.saomiao(k))) j=k; else

j=k-1;

while(isvt(a)&&getrank(s.saomiao(j),a)==1)//判断是否满足规约的条件

{ int h=j,low=j-1;//h记录要规约的位置,low记录规约后数组array[]中的最后一个非终结符的位置

if(!isvt(s.saomiao(low))) low--;

word精品文档,可编辑,欢迎下载

算符优先分析程序及报告

实验总结在算符优先程序设计过程中,程序比较复杂,其中在优先关系矩阵的构造时遇到了非常大的困难,由于最初对程序的总体流程不是十分清晰,而且实验中因本人马虎将优先关系矩阵输入错误,造成了设计与调试的困难。但经过自己的努力,通过多次调试,最终构造出优先关系矩阵并调试成功。通过本次实验一定程度上提高了软件开发能力,对编译原理这一门课程也有了比较深刻的了解。最后,由于所
推荐度:
点击下载文档文档为doc格式
614j804183553973044s2xc786b4hd00yxb
领取福利

微信扫码领取福利

微信扫码分享