算符优先文法

  • 格式:doc
  • 大小:68.00 KB
  • 文档页数:18

下载文档原格式

  / 18
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理实验代码:

对于任意给定的文法,判断其是否是算符优先文法。

代码如下:

#include

#include

#include

#define row 50

#define col 50

#define SIZE 50

using namespace std;

//两个重要结构体的定义

//FIRSTVT表或LASTVT表中一个表项(A,a)结构体的初始化typedef struct

{

char nonterm; //非终结符

char term; //终结符

}StackElement;

//存放(A,a)的栈的初始化

typedef struct

{

StackElement *top;

StackElement *bottom;

int stacksize;

}stack;

//初始化(A,a)栈

void InitStack(stack &S)

{

S.bottom = new StackElement[SIZE];

if(!S.bottom)

cout<<"存储空间分配失败!"<

S.top = S.bottom;

S.stacksize = SIZE;

}

//判断(A,a)栈是否为空

bool ifEmpty(stack S)

{

if(S.top==S.bottom) return true; //如果栈为空,则返回true else return false; //否则不为空,返回false

}

//插入栈顶(A,a)元素

void Insert(stack &S,StackElement e)

{

if(S.top-S.bottom>=S.stacksize)

cout<<"栈已满,无法插入!"<

else

{

S.top->nonterm=e.nonterm;

S.top->term=e.term;

S.top++;

}

}

//弹出栈顶(A,a)元素

StackElement Pop(stack &S)

{

StackElement e;

e.nonterm = '\0';

e.term = '\0';

if(S.top==S.bottom)

{

cout<<"栈为空,无法进行删除操作!"<

return e;

}

else

{

S.top--;

e.nonterm=S.top->nonterm;

e.term=S.top->term;

return e;

}

}

//终结符与非终结符的判断函数(布尔类型)

bool TerminalJud(char c)

{

if(c>='A'&&c<='Z') return false; //非终结符返回false //else if(c>='a'&&c<='z') return false;

else return true; //终结符返回true

}

//判断非终结符在first表中是否已存在

bool ItemJud(char first[][col],int frist_len,char C)

{

for(int i=0;i

{

if(first[i][0]==C)

return true; //如果first表中已存在此非终结符,则返回true }

return false;

}

//读文件函数

int readfile(char sen[][col])

{

char addr[50];

cout<<"请输入要读文件的地址(\\用\\\\表示):"<

cin>>addr;

ifstream fin;

fin.open(addr,ios::in);

if(!fin)

{

cout<<"Cannot open file!\n"<

}

int i,mm,l,z,k,j;

char D[100][100];

for(i=0;!fin.eof();i++)

{

fin>>D[i];

cout<

}

k=0;

//cout<

//cout<

//for(j=0;j

//cout<

for(z=0;z

{

mm=0;

l=0;

for(j=0;j<=strlen(D[z]);j++)

{

if(D[z][j]=='|')

{

sen[k][l]='\0';

mm=1;

k++;

sen[k][0]=D[z][0];

sen[k][1]='-';

sen[k][2]='>';

l=3;

j++;

}

if(mm==0)

{

sen[k][l]=D[z][j];

l++ ;

}

if(mm==1)

{

sen[k][l]=D[z][j];

l++ ;

}

}

k++;

}

//cout<

//for(i=0;i

//cout<

return k;

}

//FIRSTVT表和LASTVT表中表项(非终结符)的初始化

void ItemInit(char sen[][col],char first[][col],char last[][col],int sen_len,int &frist_len)