📄 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 + -