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

📄 词法分析器(文件).cpp

📁 可以打开任意位置和名称的原文件进行词法分析
💻 CPP
字号:
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<string>

using namespace std;
ofstream fout1("token.txt");
ofstream fout2("number.txt");
ofstream fout3("string.txt");
//ifstream fin("source.txt");
void scan();
int judge(char ch);//判断输入字符的类型
void out1(char ch);//写入token.txt
void out2(char ch,string word);//写入number.txt
void out3(char ch,string word);//写入string.txt
FILE *fp;//文件source.txt
int wordcount;//标志符计数
int numcount;//整型常数计数
int err;//标志词法分析结果正确或错误
void main()
{
	wordcount=0;
	numcount=0;
	err=0;
	scan();
	if(err==0)
		cout<<"词法分析正确完成!"<<endl;
	cout<<endl;
	system("pause");
}

void scan()
{
	char ch;
	string word;
	char document[50];
	int flag=0;
	cout<<"请输入源文件路径及名称:";
	cin>>document;
	cout<<endl;
	if((fp=fopen(document,"rt"))==NULL)
	{
		err=1;
		cout<<"无法找到该文件!"<<endl;
		return;
	}
	while(!feof(fp))
	{
		word="";
		ch=fgetc(fp);
		flag=judge(ch);
		if(flag==1)
			out1(ch);
		else if(flag==2)
			out2(ch,word);
		else if(flag==3)
			out3(ch,word);
		else if(flag==4 || flag==5 ||flag==6)
			continue;
		else
		{
			cout<<"错误:非法字符!  "<<ch<<endl;
			err=1;
		}
	}
	fclose(fp);
}

int judge(char ch)
{
	int flag=0;
	if(ch=='=' || ch=='+' || ch=='*' || ch=='(' || ch==')' || ch=='<' || ch==';' || ch=='{' || ch=='}')
		flag=1;//符号
	else if('0'<=ch && ch<='9')
		flag=2;//数字
	else if(('a'<=ch && ch<='z') || ('A'<=ch && ch<='Z'))
		flag=3;//字母
	else if(ch==' ')
		flag=4;//空格
	else if(feof(fp))
		flag=5;//结束
	else if(ch=='\n')
		flag=6;//换行
	else
		flag=0;//非法字符
	return(flag);
}
void out1(char ch)
{
	int id;
	switch(ch)
	{
	case '=' : id=1;break;
	case '+' : id=2;break;
	case '*' : id=3;break;
	case '(' : id=4;break;
	case ')' : id=5;break;
	case '<' : id=6;break;
	case ';' : id=10;break;
	case '{' : id=11;break;
	case '}' : id=12;break;
	default : id=0;
	}
	fout1<<id<<endl;
	return;
}

void out2(char ch,string word)
{
	int flag=0;
	word=word+ch;
	ch=fgetc(fp);
	flag=judge(ch);
	if(flag==1)
	{
		numcount++;
		fout1<<"26"<<"   "<<numcount<<endl;
		fout2<<numcount<<"   "<<"26"<<"   "<<word<<endl;
		out1(ch);
	}
	else if(flag==2)
		out2(ch,word);
	else if(flag==3)
	{
		err=1;
		cout<<"错误:数字后面跟字母!"<<endl;
		return;
	}
	else if(flag==4 || flag==5 || flag==6)
	{
		numcount++;
		fout1<<"26"<<"   "<<numcount<<endl;
		fout2<<numcount<<"   "<<"26"<<"   "<<word<<endl;
		return;
	}
	else
	{
		err=1;
		cout<<"错误:非法字符!  "<<ch<<endl;
		return;
	}
}
void out3(char ch,string word)
{
	int flag=0;
	word=word+ch;
	ch=fgetc(fp);
	flag=judge(ch);
	if(flag==1 || flag==4 || flag==5 || flag==6)
	{
		if(word=="and" || word=="if" || word=="while" || word=="int" || word=="true" || word=="false")
		{
			if(word=="and")
				fout1<<"7"<<endl;
			else if(word=="if")
				fout1<<"8"<<endl;
			else if(word=="while")
				fout1<<"9"<<endl;
			else if(word=="int")
				fout1<<"13"<<endl;
			else if(word=="true")
				fout1<<"14"<<endl;
			else if(word=="false")
				fout1<<"15"<<endl;
			if(flag==1)
				out1(ch);
			else if(flag==4 || flag==5 || flag==6)
				return;
		}
		else if(flag==1)
		{
			wordcount++;
			fout1<<"25"<<"   "<<wordcount<<endl;
			fout3<<wordcount<<"   "<<"25"<<"   "<<word<<endl;
			out1(ch);
		}
		else if(flag==4 || flag==5 || flag==6)
		{
			wordcount++;
			fout1<<"25"<<"   "<<wordcount<<endl;
			fout3<<wordcount<<"   "<<"25"<<"   "<<word<<endl;
		}
		return;
	}
	else if(flag==2 || flag==3)
		out3(ch,word);
	else
	{
		err=1;
		cout<<"错误:非法字符!  "<<ch<<endl;
		return;
	}
}

⌨️ 快捷键说明

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