算符优先文法
- 格式:doc
- 大小:68.00 KB
- 文档页数:18
编译原理实验代码:
对于任意给定的文法,判断其是否是算符优先文法。
代码如下:
#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)