簡單的語法分析編寫一個語法分析程序,能夠查找C語言源程序中的基本語法錯誤,如圓括號、方括號、花括號的不匹配;如單引號和雙
題目:
簡單的語法分析
編寫一個語法分析程序,能夠查找C語言源程序中的基本語法錯誤,如圓括號、方括號、花括號的不匹配;如單引號和雙引號;如單詞拼寫錯誤if寫成iff;僅一個if卻有兩個else等.要求能夠顯示錯誤信息,並指出錯誤行數.C語言源程序保存在一個寫字板或記事本文件中.
要求:(1)對任意C語言輸入的程序均能識別出其中的詞法和語法錯誤;
(2)注意數據結構的選擇,實物演示時要求講出程序原理.
(3)除了以上所列之外,能夠識別儘量多的詞法和語法錯誤;
(4)能夠提供良好的圖形用戶界面.
(5)利用SWITCH…CASE語句完成.
解答:
幫你找了一個,感覺還不錯:
#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);
}
添加新評論