?? 11.cpp
字號:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int IsLetter(char ch) /*判斷是否是字母,是則返回 1,否則返回 0 */
{
return ((ch >= 'a' && ch <= 'z') || ( ch >= 'A' && ch <= 'Z'));
}
int IsDigit(char ch) /*判斷是否為數字,是則返回 1,否則返回 0 */
{
if( ch >= '0' && ch <= '9' )
{
return 1;
}
return 0;
}
int IsSpace(char ch) /*判斷是否為空白符(空格、換行、制表符等),是則返回 1,否則返回 0*/
{
if(isspace(ch)) return 1;
return 0;
}
int judge(char ch) //判斷文件是否輸入結束
{
if (ch != EOF) return 1;
else return 0;
}
void GetBC(FILE *fp,char *ch) /*如果是空白則繼續讀下一個,直到不是空白*/
{
do
{
*ch = fgetc(fp);
}while( IsSpace(*ch) && (*ch != EOF) );
}
char compare(char *str) //返回關鍵字的編碼
{
if(strcmp(str,"void") == 0) return '1';
if(strcmp(str,"main") == 0) return '2';
if(strcmp(str,"int") == 0) return '3';
return '0';
}
//******************************************詞法分析子程序******************************************
int lexSubFunc(FILE *fp)
{
char ch,code;
int i;
int a;
char tem[10]; //臨時存放讀入的字符串
//跳過文件中開頭的空格 回車 制表符
GetBC(fp,&ch);
i = 0;
do
{
if(ch == EOF)
{
printf("There is nothing!");
return 0;
} //如果文件為空 直接跳出
else if ( IsLetter(ch) ) //假如輸入的第一個字符是字母,則接下來可能輸入字母或數字形成關鍵字或標示符
{
for(i = 0; i < 10; i ++) tem[i] = '\0';
i = 0;
while ( IsLetter(ch) || IsDigit(ch) )
{
tem[i] = ch;
i ++;
ch = getc(fp);
}
a = i; //記錄共有多少個字符
code = compare(tem);//
if (code == '1')
{
printf("關鍵字:void\n");
}
else if(code == '2')
{
printf("關鍵字:main\n");
}
else if(code == '3')
{
printf("關鍵字:int\n");
}
else if(code == '0')
{
printf("標示符:");//輸出標示符
for(i = 0; i<a; i++ )
{
printf("%c",tem[i]);
}
printf("\n");
}
// for(i = 0;i < 10; i++) s[i] = '0';//將字符數組重新全部置零
//數組下標置零
}
else if( IsDigit (ch) ) //如果輸入的第一個字符是數字,則接下來只可能是數字,
{
for(i = 0; i < 10; i ++) tem[i] = '\0';
i = 0;
while ( IsDigit(ch) == 1 ) //如果接下來是數字,則將這個字符與上個字符歸為同一個標示符的組成元素
{
tem[i] = ch;
i++;
ch = getc(fp);
}
a = i;
printf("數字:");
for(i = 0; i<a; i++ )
{
printf("%c",tem[i]);
}
printf("\n");
}
//接下來是其他各種雜情況,如文件分隔符,操作符
if (ch == '=')
{
printf("操作符:=\n");
}
else if (ch == '+')
{
printf("操作符:+\n");
}
else if (ch == '-')
{
printf("操作符:-\n");
}
else if (ch == '*')
{
printf("操作符:*\n");
}
else if (ch == '/')
{
printf("操作符:/\n");
}
else if (ch == ';')
{
printf("分隔符: ;\n");
}
else if (ch == '(')
{
printf("分隔符: (\n");
}
else if (ch == ')')
{
printf("分隔符: )\n");
}
else if (ch == '{')
{
printf("分隔符: {\n");
}
else if (ch == '}')
{
printf("分隔符: }\n");
}
ch = getc(fp);
}while(judge(ch)) ;
return 1;
}
//***********************************主程序***********************************************
int main()
{
FILE *fp;
//open a file
if((fp = fopen("1.txt","r")) == NULL )
{
printf("cannot open this file\n");
return 0;
}
lexSubFunc(fp);
fclose(fp);
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -