📄 zz.txt
字号:
go_to[25][2]=32;
go_to[25][3]=10;
go_to[26][2]=33;
go_to[26][3]=10;
go_to[31][5]=34;
go_to[35][4]=36;
go_to[36][1]=37;
stack_count=0;
stack_count_word=0;
stack[stack_count].num=0;
stack[stack_count_word].word[1]='#';
//printf("%d,%d,%c\n",stack[stack_count].num,stack_count,stack[stack_count_word].word[1]);
}
int chartoint(char ch)/*按go_to表给非终结符编号*/
{
int j;
j=-1;
if(ch=='i') j=0; /* if查找 */
if(ch=='(') j=1;
if(ch==')') j=2;
if(ch=='e') j=3; /*else 查找*/
if(ch=='=') j=4;
if(ch=='&') j=5;
if(ch=='|') j=6;
if(ch=='!') j=7;
if(ch=='<'||ch=='>') j=8; /*relop*/
if(ch=='+') j=9;
if(ch=='*') j=10;
if(ch=='-') j=11;
if(ch=='a'||ch=='b'||ch=='c'||ch=='d'||ch=='m') j=12;
if(ch=='#') j=13;
return(j);
}
int chartoint_fzj(char ch)/*按go_to表给非终结符编号*/
{
int j;
j=-1;
if(ch=='P') j=0; /* if查找 */
if(ch=='S') j=1;
if(ch=='B') j=2;
if(ch=='E') j=3; /*else 查找*/
if(ch=='M') j=4;
if(ch=='N') j=5;
return(j);
}
void cifa()
{
char str;
int zong_i=-1;
if ((fp=fopen("源程序.txt","r"))==NULL)
printf("源程序无法打开!\n");
else
{ str =fgetc(fp);
while (str!=EOF)
{ if(str!=' ') ++zong_i;
else {str=fgetc(fp);continue;}
if (str=='>'||str=='<'||str=='+'||str=='-'||str=='='||str=='*'||str=='('||str==')')
{ int i=-1;
zong[zong_i].zifu[++i]=str;
zong[zong_i].zifu[i+1]='\0';
/* printf("%s,%d\n",zong[zong_i].zifu,zong_i); */
str=fgetc(fp);
}
else
{ if(isalpha(str)!=0) /* 字符的处理 */
{ int i=-1;
while (isalnum(str)!=0)
{
zong[zong_i].zifu[++i]=str;
str=fgetc(fp);
}
zong[zong_i].zifu[i+1]='\0';
/* printf("%s,%d\n",zong[zong_i].zifu,zong_i); */
}
else /* 数字处理 */
{ int i=-1;
while (isdigit(str)!=0)
{
zong[zong_i].zifu[++i]=str;
str=fgetc(fp);
}
zong[zong_i].zifu[i+1]='\0';
/* printf("%s,%d\n",zong[zong_i].zifu,zong_i); */
}
}
}
}
zong[++zong_i].zifu[0]='#';
zong[zong_i].zifu[1]='\0';
}
char action_cha(int stack_i,int action_i)
{
return action[stack_i][action_i].sr;
}
int goto_cha(int stack_i,int goto_i)
{
return go_to[stack_i][goto_i];
}
void yiji(int i)
{
if(zong[i].zifu[0]=='a'||zong[i].zifu[0]=='b'||zong[i].zifu[0]=='c'||zong[i].zifu[0]=='d'||zong[i].zifu[0]=='m')
{
stack[++stack_count_word].word[0]='i';
//printf("%s,%s\n",stack[stack_count_word].word,zong[i].zifu);
stack[++stack_count].num=action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state;
//printf("%d\n",stack[stack_count].num);
}
else if(zong[i].zifu[0]=='>'||zong[i].zifu[0]=='<')
{
stack[++stack_count_word].word[0]='r';
printf("%s,%s\n",stack[stack_count_word].word,zong[i].zifu);
stack[++stack_count].num=action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state;
printf("%d\n",stack[stack_count].num);
}
else
{ strcpy(stack[++stack_count_word].word,zong[i].zifu);
printf("%s,%s\n",stack[stack_count_word].word,zong[i].zifu);
stack[++stack_count].num=action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state;
printf("%d\n",stack[stack_count].num);
}
}
int guiyue(int i)
{
if(ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].len==1)
{
if(0==memcmp("$",ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].right,1)||0==memcmp(stack[stack_count_word].word,ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].right,1))
{
if(ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].right[0]=='$')
{
stack[++stack_count_word].word[0]=ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].left;
stack[++stack_count].num=goto_cha(stack[stack_count].num,chartoint_fzj(stack[stack_count_word].word[0]));
return 1;
}
else
{
printf("%d\n",action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state);
stack[stack_count_word-ge[stack[stack_count].num].len+1].word[0]=ge[stack[stack_count].num].left;
printf("%c\n", stack[stack_count_word-ge[stack[stack_count].num].len].word[0]);
stack_count_word=stack_count_word-ge[stack[stack_count].num].len+1;
printf("%d\n", stack_count_word);
stack[stack_count].num=goto_cha(stack[stack_count-1].num,chartoint_fzj(stack[stack_count_word-ge[stack[stack_count].num].len+1].word[0]));
printf("%d\n", stack[stack_count].num);
return 1;
}
}
else return 0;
}
else
{ int fanhui,j,f;
int test1=action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state;
int zifuchangdu=ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].len;
char test[20];
for(j=zifuchangdu,f=0;j>0;j--,f++)
{
test[f]=stack[stack_count_word+1-j].word[0];
printf("%c",test[f]);
}
if(0==memcmp(test,ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].right,zifuchangdu))
{
int test=stack_count_word-ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].len;
stack[test+1].word[0]=ge[test1].left;
stack_count_word=stack_count-ge[action[stack[stack_count].num][chartoint(zong[i].zifu[0])].state].len+1;
stack[stack_count-zifuchangdu+1].num=goto_cha(stack[stack_count-zifuchangdu].num,chartoint_fzj(stack[stack_count-zifuchangdu+1].word[0]));
stack_count= stack_count-zifuchangdu+1;
fanhui=1 ;
}
else {printf("语法错误!\n"); fanhui=0 ;}
return fanhui;
}
}
void yufa()
{
/*int j=chartoint(zong[0].zifu[0]);
printf("%d,%d,%d\n",j,stack[stack_count].num,stack_count); */
for(int i=0;i<20;i++)
{ if('#'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
{
printf("succes\n");
}
else if('s'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
{
yiji(i);
}
else if('r'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
{
int panduan=guiyue(i);
if(panduan==1)
{
if('s'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
yiji(i);
else
{
guiyue(i);
if('s'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
yiji(i);
else
{
guiyue(i);
if('s'==action_cha(stack[stack_count].num,chartoint(zong[i].zifu[0])))
yiji(i);
else guiyue(i);
}
}
}
else break;
}
else
{
printf("语法错误!"); break;
}
}
}
void main()
{
creatTable();
cifa();
yufa();
for(int i=0;i<20;i++)
{
printf("%s\n",zong[i].zifu);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -