求大神指点迷津,希望能够帮我改改代码,有一个‘a+b+’的式子一直过不去
输入:字符串或者文本文件
输出:“合法表达式”或者“非法表达式”
例如:输入a+b*c-b/d则显示或者输出“合法表达式”,输入aa++--c*则显示或者输出“非法表达式”
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>
#define nul 0
#define ident 1
#define plus 2
#define times 3
#define lparen 4
#define rparen 5
#define divide 6
#define sub 7
int sym; //当前的符号
char ch;
FILE* fin;
FILE* fout;
int getsym();
void E();
void T();
void F();
void A();
void B();
void V();
void main()
{
char filename[20];
printf("请输入分析的文件名:");
scanf("%s",filename);
if((fin=fopen(filename,"r"))==NULL)
{
printf("不能打开文件.\n");
return;
}
printf("请输入保存分析结果的文件名:");
scanf("%s",filename);
if((fout=fopen(filename,"w"))==NULL)
{
printf("不能打开文件.\n");
return;
}
getsym(); //读第一个单词,将单词类别放入sym中
E(); //开始按E->TA 分析
if(sym==0)
printf("合法表达式\n");
else printf("非法表达式\n");
fclose(fin);
fclose(fout);
}
/*
* 词法分析,获取一个符号
*/
int getsym()
{
ch=fgetc(fin);
while (ch==' ' || ch==10 || ch==13 || ch==9) /* 忽略空格、换行、回车和TAB */
ch=fgetc(fin);
if (ch==EOF) sym=0;
else if (ch>='a' && ch<='z')
sym = 1;
else if(ch == '+')
sym = 2;
else if (ch == '*')
sym = 3;
else if (ch == '/')
sym = 6;
else if (ch == '-')
sym = 7;
else if (ch == '(')
sym = 4;
else if (ch == ')')
sym = 5;
else {printf("--词法错\n");exit(0);}
return 0;
}
void E()//E-> TE’
{
T();
A();
}
void A()//E’-> +TE’|-TE’|ε
{
if(sym==2||sym==7)
{getsym();
T();
A();
}
else if(sym==0) return;
else if(sym==5) return;
else
{
printf("语法错3: 缺少运算符+或者-\n");
fprintf(fout,"语法错3: 缺少运算符+或者-\n");exit(0);}
}
void T()//T-> FT’
{
if (sym==1 ||sym==4)
{
F();
B();
}
else if(sym==0) return;
else
{
printf("语法错4: 缺少变量或者(\n");
fprintf(fout,"语法错4: 缺少变量或者(\n");exit(0);}
}
void B()//T’-> *FT’|/FT’|ε
{
if(sym==3||sym==6)
{getsym();
F();
B();
}
else if(sym==0) return;
else if(sym==2||sym==7||sym==5) return;
else
{
printf("语法错5: 缺少运算符*或者/\n");
fprintf(fout,"语法错5: 缺少运算符*或者/\n");exit(0);}
}
void F()//F-> V|(E)
{
if (sym==1)
V();
else
{getsym();
E();
if (sym==5)
getsym();
else
{
printf("语法错4: 缺少)\n");
fprintf(fout,"语法错4: 缺少)\n");exit(0);}}
}
/*
V->a|...|z
*/
void V()
{ if(sym==1)
getsym();
else
{
printf("语法错8: 缺变量\n ");
exit(0);}
}
求大神帮我改改代码,最好有注释,自己写的代码一直有问题