資源簡介
語法分析 編譯原理作業 自己做的呵呵
代碼片段和文件信息
#include?
#include?
#include?
#include?
//定義全局變量
FILE?*fp*fp1;//指向有進行語法分析的文件
char?sym[20]={0};//類別
char?s[20]={0};//在涵數中做臨時變量數組
char?id[20]={0};//若為標志符,存放自身值
int?num;//若為整數,存放自身值
int?lineno;//行號
int?err;//標記何種錯誤的數字
int?count=0;//記錄錯誤出現的次數
int?l=0;//記錄調用的層次lev
int?iftrue=1;
//空格
void?nul(int?n)
{
int?i=0;
for(i=0;i<=n;i++)
printf(“??“);
}
void?fengexian(int?n)//修飾DOS界面的分隔線
{
int?i;
nul(l-1);
//printf(“||“);
for(i=0;i<=n;i++)
printf(“-“);
//printf(“||“);
printf(“\n“);
}
void?show()//界面的初始部分
{?
fengexian(50);
printf(“???????????編譯原理語法分析實驗!\n“);
printf(“???????????????????????作者姓名\n“);
fengexian(50);
}
FILE?*openfile(char?*mode)
{
???char?tmpfile[20];
???FILE?*reval=NULL;
???while(iftrue)
???????{
??????????
??????????//gets(tmpfile);
??????scanf(“%s“tmpfile);
??getchar();
??????????reval=fopen(tmpfilemode);
??????????if(reval!=NULL)?break;
??????????printf(“不能打開文件\“%s\“,請重新輸入:“tmpfile);
??????????iftrue=1;
????????}
return?reval;
}
void?get()//取文件中的一個單詞
{
?????char?ch;
?????char?str[10];
?????int?i=0;
?????ch=fgetc(fp);
?????while(ch==‘?‘||ch==‘\n‘)
?????????{
???????????ch=fgetc(fp);
?????????}
??????????str[i]=ch;
??????????i++;
??????????ch=fgetc(fp);
??????????while(ch!=‘?‘&&ch!=‘\n‘)
???????{
?????????????????str[i]=ch;
?????????????????i++;
?????????????????ch=fgetc(fp);
????????}
??????????str[i]=‘\0‘;
??????????i=0;
??????????strcpy(sstr);
}
void?getsym()//取文件中的一組單詞
{
????????get();
????????lineno=atoi(s);
????????//printf(“%d\n“lineno);
????????get();
????????if(strcmp(s“ident“)==0)
??????????{
??????????strcpy(syms);
??????????//printf(“%s\n“sym);
??????????get();
??????????strcpy(ids);
??????????//printf(“%s\n“id);
??????????}
????????else?if(strcmp(s“number“)==0)
???????????{
?????????????strcpy(syms);
?????????????//printf(“%s\n“sym);
?????????????get();
?????????????num=atoi(s);
?????????????//printf(“%d\n“num);
????????????}
????????else
????????????{
????????????strcpy(syms);
????????????//printf(“%s\n“sym);
????????????}
}
//錯誤處理
void?error(int?err)
{
count++;
nul(l);printf(“?%d次錯誤:“count);
switch(err)
{
case?1:printf(“%d行?1!-常量說明中\“=\“寫成\“:=\“.\n“lineno);break;
case?2:printf(“%d行?2!-常量說明中的\“=\“后應是數字.\n“lineno);break;
case?3:printf(“%d行?3!-常量說明中的標識符后應是\“=\“.\n“lineno);break;
case?4:printf(“%d行?4!-constvarprocedure后應為標識符.\n“lineno);break;
case?5:printf(“%d行?5!-漏掉了‘‘或‘;‘.\n“lineno);break;
????case?6:printf(“%d行?6!-過程說明后的符號不正確(應是語句開始符或過程定義符).\n“lineno);break;
????case?7:printf(“%d行?7!-應是語句開始符.\n“lineno);break;
????case?8:printf(“%d行?8!-程序體內語句部分的后跟符不正確.\n“lineno);break;
????case?9:printf(“%d行?9!-程序結尾丟了句號‘.‘.\n“lineno);?break;??
case?10:printf(“%d行?10!-語句之間漏了‘;‘.\n“lineno);break;???
case?11:printf(“%d行?11!-標識符未說明.\n“lineno);?break;??
case?12:printf(“%d行?12!-賦值語句中賦值號左部標識符屬性應是變量.\n“lineno);
- 上一篇:編譯原理語法分析—遞歸下降分析法
- 下一篇:winpcap抓包并進行協議解析
評論
共有 條評論