资源简介

编译原理语法分析中的算符优先编译原理语法分析中的算符优先编译原理语法分析中的算符优先编译原理语法分析中的算符优先编译原理语法分析中的算符优先编译原理语法分析中的算符优先编译原理语法分析中的算符优先编译原理语法分析中的算符优先编译原理语法分析中的算符优先编译原理语法分析中的算符优先

资源截图

代码片段和文件信息

/*	对于书证p110页例6.3中的文法
 * 该文法服从算符优先文法的定义
 * 该文法多对应的算符优先关系系数关系表在书中p111页
 * 该算法在书中117页
 */

#include “stdio.h“
#include “string.h“
#include “malloc.h“
#define maxsize 128


FILE *fp;
char check (char a[])
{
 if(strcmp(a“E+E“)==0)
 return ‘E‘;
 else if(strcmp(a“E-E“)==0)
 return ‘E‘;
 else if(strcmp(a“E*E“)==0)
 return ‘E‘;
 else if(strcmp(a“E/E“)==0)
 return ‘E‘;
 else if(strcmp(a“E^E“)==0)
 return ‘E‘;
 else if(strcmp(a“(E)“)==0)
 return ‘E‘;
 else if(strcmp(a“i“)==0)
 return ‘E‘;
 else return ‘G‘; //错误控制
}

typedef struct node 
{
char data[maxsize];
int top;
}seqstack;

void setnull(seqstack *s) //置空栈
{
s->top=-1;
}

seqstack * push (seqstack *schar x) //进栈
{
if(s->top==maxsize-1)
{
printf(“overflow!\n“);
return NULL;
}
else
{
s->top++;
s->data[s->top]=x;
return s;
}
}

void pop (seqstack *s) //出栈
{
if(s->top<0)
printf(“underflow!\n“);
else
s->top--;
}

char top(seqstack *s) //取栈顶元素
{
if(s->top==-1)
{
printf(“stack is empty!\n“);
return NULL;
}
else
return (s->data[s->top]);
}


int myequal (char a)
{
if(a==‘+‘)
return 0;
else if(a==‘-‘)
return 1;
else if(a==‘*‘)
return 2;
else if(a==‘/‘)
return 3;
else if(a==‘^‘)
return 4;
else if(a==‘(‘)
return 5;
else if(a==‘)‘)
return 6;
else if(a==‘i‘)
return 7;
else if(a==‘#‘)
return 8;
else
return -1;
}

void printseqstack(seqstack *s) //打印出路径
{
int temp;
temp=s->top;
while (temp>=0)
{
printf(“%c“s->data[temp]);
fputc(s->data[temp]fp);
temp--;
}
}

int isvt(char a[]int nchar x)
{
int i;
for(i=0;i {
if(x==a[i])
break;
}
if(i>=n)
return 0; //不是该集合中的元素
else
return 1; //是该集合中的元素
}
void main(void)
{

if((fp=fopen(“sign-frist.txt““w“))==NULL)
{
printf(“File open fail!\n“);
return;
}
printf(“\t\t**************算符优先关系矩阵*****************\n“);
fputs(“\t\t**************算符优先关系矩阵*****************\n“fp);
int ijsum=0ktempa[9][9]={{11-1-1-1-11-11}{11-1-1-1-11-11}{1111-1-11-11}{1111-1-11-11}{1111-1-11-11}{-1-1-1-1-1-10-12}{111112121}{111112121}{-1-1-1-1-1-12-10}};
char input[maxsize]ch1ch2VT[9]={‘+‘‘-‘‘*‘‘/‘‘^‘‘(‘‘)‘‘i‘‘#‘}Q;
char V[10]={‘+‘‘-‘‘*‘‘/‘‘^‘‘(‘‘)‘‘i‘‘#‘‘E‘}; //定义所有的终结符和非终结符的集合
seqstack *s1*s2;
for (i=0;i<9;i++)
{
printf(“\t“);
fputs(“\t“fp);
for (j=0;j<9;j++)
{
if(a[i][j]==2)
{
printf (“\t“);
fputs(“\t“fp);
}
else if(a[i][j]==0)
{
fputs(“=\t“fp);
printf(“=\t“);
}
else if(a[i][j]==-1)
{
printf(“<\t“);
fputs(“<\t“fp);
}
else if(a[i][j]==1)
{
printf(“>\t“);
fputs(“>\t“fp);
}
}
printf(“\n“);
fputs(“\n“fp);
}
printf(“Please input the string that you want to check:\n“);
gets(i

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4937  2010-04-23 19:43  sign_frist.cpp

----------- ---------  ---------- -----  ----

                 4937                    1


评论

共有 条评论