实验总结
在算符优先程序设计过程中,程序比较复杂,其中在优先关系矩阵的构造时遇到了非常大的困难,由于最初对程序的总体流程不是十分清晰,而且实验中因本人马虎将优先关系矩阵输入错误,造成了设计与调试的困难。但经过自己的努力,通过多次调试,最终构造出优先关系矩阵并调试成功。
通过本次实验一定程度上提高了软件开发能力,对编译原理这一门课程也有了比较深刻的了解。最后,由于所学知识不够全面,实验在很多方面还有待完善,在以后的学习过程中,会掌握更多知识,力求做到更好。
代码
#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精品文档,可编辑,欢迎下载