⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 词法分析器.txt

📁 词法分析器 对输入一个函数
💻 TXT
字号:
#include<iostream>
#include<stdio.h>  
#include<string>
using namespace std;
char* rsvdwd[8]={"if","int","for","while","do","return","break","continue"};
char* rsvdop[10]={"+","-","*","/","=",">","<",">=","<=","!=" };
int oprt[8]={'+','-','*','/','=','>','<','!' };
char sprt[6]={',',';','{','}','(',')'};
FILE *fp;
char ch;

bool isrsvdwd(char* str) //判断字符串是否为保留字
{
int i;
for(i=0;i<8;i++)
if(!strcmp(str,rsvdwd[i]))
return 1;
return 0;
}

char letterword(char ch,FILE *fp)//以字母开头的字符串,判断是否为保留字或者标识符
{
int i=-1;
char str[20];
bool isidt=0;
while(isalnum(ch)||(ch=='_'))
{
if((ch=='_')||(isdigit(ch)))
isidt=1;
str[++i]=ch;
ch=fgetc(fp);
}
str[++i]='\0';
if(!isidt||isrsvdwd(str))
cout<<"(1,\""<<str<<"\")"<<endl;
else 
cout<<"(2,\""<<str<<"\")"<<endl;
return (ch);
}

char numberword(char ch,FILE* fp)//数字
{
int i=-1;
char str[16];
while(isdigit(ch))
{
str[++i]=ch;
ch=fgetc(fp);
}
if(isalpha(ch))
{
str[++i]=ch;
str[++i]='\0';
cout<<"(error,\""<<str<<"\")"<<endl;
return(ch=fgetc(fp));
}
else
{
str[++i]='\0';
cout<<"(3,\""<<str<<"\")"<<endl;
return ch;
}
}

bool isoprt(char ch) //判断某单个字符是否为操作符(或者操作符的头一个字符,如>=的头一个字符为>)
{
for(int i=0;i<8;i++)
if(ch==oprt[i])
return true;
return false;
}

char oprtword(char ch,FILE* fp)//判断字符串是否为操作符
{
int i=-1;
char temp,str[8];
while(isoprt(ch))
{
if(ch=='>'||ch=='<')
{
if((temp=fgetc(fp))!='=')
{
cout<<"(4,\""<<ch<<"\")"<<endl;  //是>或者<,而不是>=或者<= 
return temp;
}
else
cout<<"(4,\""<<ch<<"=\")"<<endl;//是>=或者<=
return fgetc(fp);
}
else     //不是>=或者<=
{
str[++i]=ch;
ch=fgetc(fp);
}
}
str[++i]='\0';
for(int j=0;j<10;j++)
if(!strcmp(rsvdop[j],str))
{
cout<<"(4,\""<<str<<"\")"<<endl;
break;
}

return ch;
}

bool issprt(char ch) //判断是否为分隔符
{
for(int i=0;i<6;i++)
if(ch==sprt[i])
return true;
return false;
}

void main()
{
cout<<"词法分析"<<endl;
if((fp=fopen("源文件.txt","r"))==NULL)
cout<<"源文件无法打开"<<endl;
else
{
ch=fgetc(fp);
while(ch!=EOF)
{
if(isspace(ch))
ch=fgetc(fp);
else if(isalpha(ch))
ch=letterword(ch,fp);
else if(isdigit(ch))
ch=numberword(ch,fp);
else if(isoprt(ch))
ch=oprtword(ch,fp);
else if(issprt(ch))
{
cout<<"(5,\""<<ch<<"\")"<<endl;
ch=fgetc(fp);
}
}
}
cout<<"按任意键退出"<<endl;
ch=getchar();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -