📄 by4.cpp
字号:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdarg.h>
#include<stdlib.h>
#define PLUS 0
#define MINUS 1
#define TIMES 2
#define DIV 3
#define LP 4
#define RP 5
#define ID 6
#define ED 7 //#
#define E 8
#define T 9
#define F 10
FILE *fp;
int inputline[10];
int stack[20];
int top=-1;
int count=0;
/* -------------------------------- */
/* + - * / ( ) i # */
/* + > > < < < > < > */
/* - > > < < < > < > */
/* * > > > > < > < > */
/* / > > > > < > < > */
/* ( < < < < < = < ? */
/* ) > > > > ? > ? > */
/* i > > > > ? > ? > */
/* # < < < < < ? < = */
/* -------------------------------- */
/****************************************/
int table[8][8]={{1,1,-1,-1,-1,1,-1,1},
{1,1,-1,-1,-1,1,-1,1},
{1,1,1,1,-1,1,-1,1},
{1,1,1,1,-1,1,-1,1},
{-1,-1,-1,-1,-1,0,-1,1},
{1,1,1,1,0,1,0,1},
{1,1,1,1,0,1,0,1},
{-1,-1,-1,-1,-1,-1,-1,0}}; /*存储算符优先关系表,大于为1,小于是-1,等于或表示出错为0*/
int exp[8][3]={{8,0,9},{8,1,9},{9,20,20},
{9,2,10},{9,3,10},{10,20,20},
{4,8,5},{6,20,20}
};
int explen[8]={3,3,1,3,3,1,3,1};
void readFF(){ //将字符编码转换为数字,存储在inputline[]中
char ch;
char t[4];
int i=0;
int j=0;
int bianma;
ch=fgetc(fp);
while(ch!=EOF){
i=0;
while((ch!='(')&&(ch!=EOF))
ch=fgetc(fp);
if(ch!=EOF)
ch=fgetc(fp);
while((ch!=',')&&(ch!=EOF))
{
t[i]=ch;
i++;
ch=fgetc(fp);
}
t[i]='\0';
bianma=atoi(t);
if(ch!=EOF){
inputline[j]=bianma;
j++;}
ch=fgetc(fp);
}
j=0;
while(inputline[j]!=7){
printf("%d ",inputline[j]);
j++;
}
printf("\n");
}
void push(int i){ //入栈
top++;
stack[top]=i;
}
void pop(){ //出栈
top--;
}
int isVt(int a){
if((a>=0)&&(a<=7))
return 1; //是Vt
else return 0;
}
int isHigherThan(int a,int b){
if(table[a][b]==1)
return 1; //a>b
else return 0;
}
int isLowerThan(int a,int b){
if(table[a][b]==-1)
return 1; //a<b
else return 0;
}
int isEqualTo(int a,int b){
if(table[a][b]==0)
return 1; //a=b
else return 0;
}
int reduce(int begin,int end,int len){
int temp;
int Vn;
int i;
//count++;
//printf("%d\n",count);
if(len==3){
temp=stack[begin+1];
switch(temp){
case 0:Vn=8;break;
case 1:Vn=8;break;
case 2:Vn=9;break;
case 3:Vn=9;break;
case 8:{
if((stack[begin]==4)&&(stack[end]==5))
Vn=10;
else printf("err1\n");
break;
}
default:printf("err2\n");
}
}
else if(len==1)
{temp=stack[begin];
switch(temp){
case 9:Vn=8;break;
case 10:Vn=9;break;
case 6:Vn=10;break;
default:printf("err3\n");
}
}
else printf("err4\n");
for(i=0;i<len;i++)
pop();
return Vn;
}
void printcur(){ //打印分析栈中的内容
int m;
m=0;
int alph;
while(m<=top){
alph=stack[m];
switch(alph)
{
case 0:printf("+");break;
case 1:printf("-");break;
case 2:printf("*");break;
case 3:printf("/");break;
case 4:printf("(");break;
case 5:printf(")");break;
case 6:printf("i");break;
case 7:printf("#");break;
case 8:printf("E");break;
case 9:printf("T");break;
case 10:printf("F");break;
}
m++;
}
printf("\n");
}
int parser(){
int m,n,r,newVn;
int tt;
m=0;
push(7); //#
do{
n=top;
int j;
r=inputline[m++];
if(isVt(stack[n])) j=n; else j=n-1;
// t1=j;
while(isHigherThan(stack[j],r))
{
int q;
n=top;
do
{q=stack[j];
if(isVt(stack[j-1])) j--; else j=j-2;
}while(!isLowerThan(stack[j],q));
newVn=reduce(j+1,n,n-j);
push(newVn);
printcur();
/*tt=r;
do{
printf("%d ",tt);
}while(tt!=7);
printf("\n");*/
// j=top;
}//while
if(isLowerThan(stack[j],r)||isEqualTo(stack[j],r))
push(r);
else return 0;
}while(r!=7);
if((stack[0]==7)&&((stack[1]==8)||(stack[1]==9)||(stack[1]==10))&&(stack[2]==7))
return 1;
else return 0;
}
void main(){
fp=fopen("test.txt","r");
if(fp==NULL)
printf("cannot open file\n");
else {
readFF();
if(parser())
printf("success\n");
else printf("error\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -