?? 詞法分析1.cpp
字號:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <process.h>
//下面定義保留,為簡化程序,使用字符指針數組保存所有保留字。
//如果想增加保留字,可繼續添加,并修改保留字數目
#define keywordSum 13
char *keyword[keywordSum]={ "begin","if","end","else","then","for","while","to","do","and","not","or","write"};
//下面定義純單分界符,如需要可添加
char singleword[50]="+-*()[]{};,:=";
//下面定義雙分界符的首字符
char doubleword[10]="><!";
char Scanin[300], Scanout[300]; //用于接收輸入輸出文件名
FILE *fin,*fout; //用于指向輸入輸出文件的指針
void TESTscan()//詞法分析函數
{
char ch=' ',token[40]; //ch為每次讀入的字符,token用于保存識別出的單詞
int j,n; //j,n為臨時變量,控制組合單詞時的下標等
printf("請輸入源程序文件名:");
scanf("%s",Scanin);
printf("請輸入詞法分析輸出文件名:");
scanf("%s",Scanout);
if ((fin=fopen(Scanin,"r"))==NULL) //判斷輸入文件名是否正確
{
printf("\n打開詞法分析輸入文件出錯!\n");
}
if ((fout=fopen(Scanout,"w"))==NULL) //判斷輸出文件名是否正確
{
printf("\n創建詞法分析輸出文件出錯!\n");
}
fprintf(fout,"%c本程序規定:\n");
fprintf(fout,"%c輸出用KeyWord代表關鍵字\n");
fprintf(fout,"%c輸出用Word代表普通標識符\n");
fprintf(fout,"%c輸出用Digit代表阿拉伯數字\n");
fprintf(fout,"%c輸出用SingleWord代表單分界符\n");
fprintf(fout,"%c輸出用DoubleWord代表雙分界符\n");
fprintf(fout,"%c輸出用ERROR代表無法識別的字符\n");
ch=getc(fin);
while(ch!=EOF)
{
while (ch==' '||ch=='\n'||ch=='\t') ch=getc(fin);
if (ch==EOF) break;
if (isalpha(ch)) //如果是字母,則進行標識符處理
{
token[0]=ch; j=1;
ch=getc(fin);
while(isalnum(ch)) //如果是字母數字則組合標識符;如果不是則標識符組合結束
{
token[j++]=ch; //組合的標識符保存在token中
ch=getc(fin); //讀下一個字符
}
token[j]='\0'; //標識符組合結束
//查保留字
n=0;
while ((n<keywordSum) && strcmp(token,keyword[n])) n++;
if (n>=keywordSum) //不是保留字,輸出標識符
fprintf(fout,"%s\t\t\t%s\n","Word",token); //輸出標識符符號
else//是保留字,輸出保留字
fprintf(fout,"%s\t\t\t%s\n","KeyWord",token); //輸出保留字符號
} else if (isdigit(ch))//數字處理
{
token[0]=ch; j=1;
ch=getc(fin); //讀下一個字符
while (isdigit(ch)) //如果是數字則組合整數;如果不是則整數組合結束
{
token[j++]=ch; //組合整數保存在token中
ch=getc(fin); //讀下一個字符
}
token[j]='\0'; //整數組合結束
fprintf(fout,"%s\t\t\t%s\n","Digit",token); //輸出整數符號
} else if (strchr(singleword,ch)>0) //單分符處理
{
token[0]=ch; token[1]='\0';
ch=getc(fin);//讀下一個符號以便識別下一個單詞
fprintf(fout,"%s\t\t%s\n","SingleWord",token); //輸出單分界符符號
}else if (strchr(doubleword,ch)>0) //雙分界符處理
{
token[0]=ch;
ch=getc(fin); //讀下一個字符判斷是否為雙分界符
if (ch=='=') //如果是=,組合雙分界符
{
token[1]=ch;token[2]='\0'; //組合雙分界符結束
ch=getc(fin); //讀下一個符號以便識別下一個單詞
} else//不是=則為單分界符
token[1]='\0';
fprintf(fout,"%s\t\t%s\n","DoubleWord",token); //輸出單或雙分界符符號
} else if (ch=='/') //注釋處理
{
ch=getc(fin); //讀下一個字符
if (ch=='*') //如果是*,則開始處理注釋
{ char ch1;
ch1=getc(fin); //讀下一個字符
do
{ ch=ch1;ch1=getc(fin);} //刪除注釋
while ((ch!='*' || ch1!='/')&&ch1!=EOF); //直到遇到注釋結束符*/或文件尾
ch=getc(fin);//讀下一個符號以便識別下一個單詞
}
else if (ch=='/') //如果是/,則開始處理注釋
{ char ch1;
ch1=getc(fin); //讀下一個字符
do
{ ch=ch1;ch1=getc(fin);} //刪除注釋
while ((ch!='\n')); //直到本行注釋結束
fseek(fin,-1L,SEEK_CUR); /*輸入指針回退一個字符*/
ch=getc(fin);//讀下一個符號以便識別下一個單詞
}
else //不是*則處理單分界符/
{
token[0]='/'; token[1]='\0';
fprintf(fout,"%s\t\t%s\n","SingleWord",token); //輸出單分界符/
}
} else//錯誤處理
{
token[0]=ch;token[1]='\0';
ch=getc(fin); //讀下一個符號以便識別下一個單詞
fprintf(fout,"%s\t\t\t%s\n","ERROR",token); //輸出錯誤符號
}
}
fclose(fin);//關閉輸入輸出文件
fclose(fout);
}
//主程序
void main()
{
TESTscan();//調詞法分析
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -