📄 by3.cpp
字号:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdarg.h>
#include<stdlib.h>
#define ID 0
#define PLUS 1
#define MINUS 2
#define TIMES 3
#define DIV 4
#define LP 5
#define RP 6
#define ED 7 //#
#define E 8
#define E1 9
#define T 10
#define T1 11
#define F 12
#define A 13
#define M 14
// i,+,-,*,/,(,),#
int martrix[7][8]={{1,0,0,0,0,1,0,0},
{0,2,2,0,0,0,11,11},{3,0,0,0,0,3,0,0,},
{0,11,11,4,4,0,11,11},{6,0,0,0,0,5,0,0},
{0,7,8,0,0,0,0,0},{0,0,0,9,10,0,0,0}
};//E,E',T,T',F,A,M,数字代表表达式编号,0出错,epsilon11
int exp[11][4]={{10,9,20,20},{13,10,9,20},{12,11,20,20},
{14,12,11,20},{5,8,6,20},{0,20,20,20},{1,20,20,20},
{2,20,20,20},{3,20,20,20},{4,20,20,20},{20,20,20,20}
};//数字代表非终结符符号编码,20为空,有VN,有VT
int top=-1;
int stack[20];
int remain; //
int error_flag=0; //
char ch;
FILE *fp;
void push(int i){ //入栈
top++;
stack[top]=i;
}
void pop(){ //出栈
top--;
}
void printcur(){ //打印分析栈中的内容
int m;
m=0;
int alph;
while(m<=top){
alph=stack[m];
switch(alph)
{
case 0:printf("i");break;
case 1:printf("+");break;
case 2:printf("-");break;
case 3:printf("*");break;
case 4:printf("/");break;
case 5:printf("(");break;
case 6:printf(")");break;
case 7:printf("#");break;
case 8:printf("E");break;
case 9:printf("E'");break;
case 10:printf("T");break;
case 11:printf("T'");break;
case 12:printf("F");break;
case 13:printf("A");break;
case 14:printf("M");break;
}
m++;
}
printf("\n");
}
int advance(){
char t[2];
int i=0;
int bianma;
ch=fgetc(fp);
while((ch!='(')&&(ch!=EOF))
ch=fgetc(fp);
ch=fgetc(fp);
if(ch!=EOF)
{
t[0]=ch;
i++;
}
t[i]='\0';
bianma=atoi(t); //将一个文件转化为数字
return bianma;
}//取二元式中的数字
void check(){
int t;
int i1=0;
int expbm;
int j=0;
int n;
char fir[2];
push(ED);
push(E);
printcur();
ch=fgetc(fp);
while((ch!='(')&&(ch!=EOF))
ch=fgetc(fp);
ch=fgetc(fp);
if(ch!=EOF)
{
fir[0]=ch;
i1++;
}
fir[i1]='\0';
remain=atoi(fir);
while(ch!=EOF){
if((remain==7)&&(stack[top]==7)){
error_flag=0;
return;
}
else if((stack[top]>=8)&&(stack[top]<=14)) //非终结
{
t=stack[top]-8;
expbm=martrix[t][remain];
if(expbm==0) //出错
{
printf("不能匹配\n");
error_flag=1;
return;
}
else{
pop();
while(exp[expbm-1][j]!=20)
j++;
j--;//此处j为产生式的长度
for(n=j;n>=0;n--)
push(exp[expbm-1][n]); //从Yk-Y1压栈
}
printcur();
j=0;
}
else //终结符
{
if(stack[top]==remain){
pop();
remain=advance();
}
else
{
printf("不能匹配\n");
error_flag=1;
return;
}
printcur();
}
}//while
}
void main(){
fp=fopen("test.txt","r");
if(fp==NULL)
printf("cannot open file\n");
else check();
if(error_flag==0)
printf("匹配成功\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -