简单的语法分析编写一个语法分析程序,能够查找C语言源程序中的基本语法错误,如圆括号、方括号、花括号的不匹配;如单引号和双

问题描述:

简单的语法分析
编写一个语法分析程序,能够查找C语言源程序中的基本语法错误,如圆括号、方括号、花括号的不匹配;如单引号和双引号;如单词拼写错误if写成iff;仅一个if却有两个else等.要求能够显示错误信息,并指出错误行数.C语言源程序保存在一个写字板或记事本文件中.
要求:(1)对任意C语言输入的程序均能识别出其中的词法和语法错误;
(2)注意数据结构的选择,实物演示时要求讲出程序原理.
(3)除了以上所列之外,能够识别尽量多的词法和语法错误;
(4)能够提供良好的图形用户界面.
(5)利用SWITCH…CASE语句完成.
1个回答 分类:综合 2014-10-18

问题解答:

我来补答
帮你找了一个,感觉还不错:
#include
#include
#define size 100
typedef char E;
typedef struct{
int top;
E *base;
int Ssize;
}Stack;
void Init(Stack *S){
S->base=(E *)malloc(size*sizeof(E));
S->top=0;
S->Ssize=size;
}int Len(Stack S){
return(S.top);
}int Top(Stack S,E *e){
if(!S.top)return(0);
*e=S.base[S.top-1];
return(1);
}int Push(Stack *S,E e){
if(S->top>=S->Ssize){
S->base=(E *)realloc(S->base,(S->Ssize+1)*sizeof(E));
if(!S->base)return(0);
S->Ssize++;
}S->base[S->top++]=e;
return(1);
}int Pop(Stack *S,E *e){
if(!S->top)return(0);
*e=S->base[--S->top];
return(1);
}int isEmpty(Stack S){
if(!S.top)return(1);return(0);
}void main(){
FILE *in;
Stack S;
long l=1,k=0;
char i[100],ch;
E t;
Init(&S);
printf("文件名:");
scanf("%s",i);
in=fopen(i,"r");
for(;;){
ch=fgetc(in);
if(ch==-1)break;
else if(ch=='\\'){ch=fgetc(in);continue;}
else if(ch!='\''||ch!='\"'&&!Top(S,&t)&&t=='\''||t=='\"')continue;
else if(ch=='('||ch=='['||ch=='{')Push(&S,ch);
else if(ch==')'){
if(!Top(S,&t)){k++;printf("第%ld行多\')\'\n");}
else if(t!='('&&t!='\''&&t!='\"'){k++;printf("第%ld行\')\'用法错误\n",l);}
else if(t=='(')Pop(&S,&t);
}else if(ch==']'){
if(!Top(S,&t)){k++;printf("第%ld行多\']\'\n");}
else if(t!='['&&t!='\''&&t!='\"'){k++;printf("第%ld行\']\'用法错误\n",l);}
else if(t=='[')Pop(&S,&t);
}else if(ch=='}'){
if(!Top(S,&t)){k++;printf("第%ld行多\'}\'\n");}
else if(t!='{'&&t!='\''&&t!='\"'){k++;printf("第%ld行\'}\'用法错误\n",l);}
else if(t=='{')Pop(&S,&t);
}else if(ch=='\''||ch=='\"'){
if(!Top(S,&t)||t!=ch)Push(&S,ch);
else Pop(&S,&t);
}else if(ch=='\n')l++;
}if(!isEmpty(S)){k++;printf("第%ld行发现未知错误\n",l);}
if(k)printf("共%ld个错误\n",k);
else printf("无错误\n");
fclose(in);
}
 
 
展开全文阅读
剩余:2000