📄 词法分析.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int j,k,flag,number,status;
char ch;
char words[50];//临时存放字符串
FILE *fp;
void Scan();//从文件中读取字符并检查词法
void main()
{
int i=0;
if ((fp=fopen("input.txt","r"))==NULL) //以只读方式打开文件
cout << "找不到文件input.txt,请创建文件并输入程序:" << endl;
else
{
Scan();
fclose(fp); //关闭文件
}
}
void Scan()//从文件中读取字符并检查词法
{
char *keywords[13] = {"void","main","if","then","break","int",
"char","float","include","for","while","printf",
"scanf"}; //存储关键字
number = 0; //临时存储数字
status = 0; //标记状态
j = 0;
while((ch=fgetc(fp))!=EOF)
{
if(ch==' '||ch=='\n'||ch=='\t')continue;//跳过空格或换行或制表符
if ((ch >= 'A') && (ch <= 'z' ))//如果是字母
{
while ((ch >= 'A') && (ch <= 'z' ))//将连续的字符存储为字符串
{
words[j++]=ch;
ch=fgetc(fp);
}
fseek(fp,-1L,1);//回退一个字符
words[j]='\0'; //字符串结束
for (k = 0; k < 13; k++)
if (strcmp (words,keywords[k]) == 0)//判断是否为关键字
switch(k)
{
case 0:{
flag = 1;
status = 1;
break;
}
case 1:{
flag = 2;
status = 1;
break;
}
case 2:{
flag = 3;
status = 1;
break;
}
case 3:{
flag = 4;
status = 1;
break;
}
case 4:{
flag = 5;
status = 1;
break;
}
case 5:{
flag = 6;
status = 1;
break;
}
case 6:{
flag = 7;
status = 1;
break;
}
case 7:{
flag = 8;
status = 1;
break;
}
case 8:{
flag = 9;
status = 1;
break;
}
case 9:{
flag = 10;
status = 1;
break;
}
case 10:{
flag = 11;
status = 1;
break;
}
case 11:{
flag = 12;
status = 1;
break;
}
case 12:{
flag = 13;
status = 1;
break;
}
if (status==0)//若不是关键字,则为普通字符串
flag = 100;
}
}
else if ((ch >= '0') && (ch <= '9'))//如果是数字
{
number = 0;
while ((ch >= '0' ) && (ch <= '9' ))//将连续的数字用一个整数number存储
{
number = number*10+(ch-'0');
ch = fgetc(fp);
}
flag = 200;
fseek(fp,-1L,1);//回退一个字符
}
else switch (ch)//若是符号
{
case '=':{
words[j++] = ch;
words[j] = '\0';
ch = fgetc(fp);//读取下一个字符
if (ch == '=')//判断是否是==
{
words[j++] = ch;
words[j] = '\0';
flag = 401;
}
else
{
fseek(fp,-1L,1);//回退一个字符
flag = 402;
}
break;
}
case'>':{
words[j++] = ch;
words[j] = '\0';
ch = fgetc(fp);
if (ch == '=')//判断是否是>=
{
words[j++] = ch;
words[j] = '\0';
flag = 403;
}
else
{
fseek(fp,-1L,1);
flag = 404;
}
break;
}
case'<':{
words[j++] = ch;
words[j] = '\0';
ch = fgetc(fp);
if (ch == '=')//判断是否是<=
{
words[j++] = ch;
words[j] = '\0';
flag = 405;
}
else
{
fseek(fp,-1L,1);
flag = 406;
}
break;
}
case'!':{
words[j++] = ch;
words[j] = '\0';
ch = fgetc(fp);
if (ch == '=')//判断是否是!=
{
words[j++] = ch;
words[j] = '\0';
flag = 407;
}
else
{
fseek(fp,-1L,1);
flag = 408;
}
break;
}
case'+':{
words[j++] = ch;
words[j] = '\0';
ch = fgetc(fp);
if (ch == '=')//判断是否是+=
{
words[j++] = ch;
words[j] = '\0';
flag = 409;
}
else if (ch == '+')//判断是否是++
{
words[j++] = ch;
words[j] = '\0';
flag = 410;
}
else
{
fseek(fp,-1L,1);
flag = 411;
}
break;
}
case'-':{
words[j++] = ch;
words[j] = '\0';
ch = fgetc(fp);
if (ch == '=')//判断是否是-=
{
words[j++] = ch;
words[j] = '\0';
flag = 412;
}
else if( ch == '-')//判断是否是--
{
words[j++] = ch;
words[j] = '\0';
flag = 413;
}
else
{
fseek(fp,-1L,1);
flag = 414;
}
break;
}
case'*':{
words[j++] = ch;
words[j] = '\0';
ch = fgetc(fp);
if (ch == '=')//判断是否是*=
{
words[j++] = ch;
words[j] = '\0';
flag = 415;
}
else
{
fseek(fp,-1L,1);
flag = 416;
}
break;
}
case'/':{
words[j++] = ch;
words[j] = '\0';
ch = fgetc(fp);
if (ch == '=')//判断是否是/=
{
words[j++] = ch;
words[j] = '\0';
flag = 417;
}
else
{
fseek(fp,-1L,1);
flag = 418;
}
break;
}
case';':{
words[j] = ch;
words[j+1] = '\0';
flag = 501;
break;
}
case'(':{
words[j] = ch;
words[j+1] = '\0';
flag = 502;
break;
}
case')':{
words[j] = ch;
words[j+1] = '\0';
flag = 503;
break;
}
case'[':{
words[j] = ch;
words[j+1] = '\0';
flag = 504;
break;
}
case']':{
words[j] = ch;
words[j+1] = '\0';
flag = 505;
break;
}
case'{':{
words[j] = ch;
words[j+1] = '\0';
flag = 506;
break;
}
case'}':{
words[j] = ch;
words[j+1] = '\0';
flag = 507;
break;
}
case':':{
words[j] = ch;
words[j+1] = '\0';
flag = 508;
break;
}
case'"':{
words[j] = ch;
words[j+1] = '\0';
flag = 509;
break;
}
case'%':{
words[j++] = ch;
words[j] = '\0';
ch = fgetc(fp);
if (ch == '=')//判断是否是%=
{
words[j++] = ch;
words[j] = '\0';
flag = 510;
}
else
{
fseek(fp,-1L,1);
flag = 511;
}
break;
}
case',':{
words[j] = ch;
words[j+1] = '\0';
flag = 512;
break;
}
case'#':{
words[j] = ch;
words[j+1] = '\0';
flag = 513;
break;
}
case'@':{
words[j] = '@';
words[j+1] = '\0';
flag = 514;
break;
}
default:{
flag = -1;
break;
}
}
j=0;
if(flag<100)//输出关键字
cout<<"(关键字"<<","<<words<<")"<<endl;
else if(flag==100)//输出字符或字符串
cout<<"(标示符"<<","<<words<<")"<<endl;
else if(flag==200)//输出数字
cout<<"(数字"<<","<<number<<")"<<endl;
else if(flag<500)//输出字符或字符串
cout<<"(运算符"<<","<<words<<")"<<endl;
else if(flag<600)//输出字符或字符串
cout<<"(界符"<<","<<words<<")"<<endl;
else if(flag==-1)
cout<<"(Error"<<","<<flag<<")"<<endl;//输出错误信息
else
cout<<"("<<flag<<","<<words<<")"<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -