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

📄 词法分析器.txt

📁 ① 使用自动机技术实现一个词法分析程序; ② 使用算符优先分析方法实现其语法分析程序; 需要先在运行目录下建立一个input.txt文件
💻 TXT
字号:
////////////////////////////////////////////////////////////////
//                 Author:huchubin                            //
//                 Date:2008.4.6                              // 
//                 Time:0:46:30                               //
////////////////////////////////////////////////////////////////

/*
A:编号规定:
1:整数
2:实数
3:标识符
4:运算符
5:界符

B:变量规定:
passage[]:存储要进行的串

C:函数意义:
见注释
*/
#include<iostream>
#include<fstream>
using namespace std;

char passage[50000000];//要处理的串
ofstream outfile;
ifstream infile;

void state0(int ,int );//状态0: 初始状态
void state1(int ,int );//状态1: 仅有一个字母的标识符,终态
void state2(int ,int );//状态2: 整数,终态
void state3(int ,int );//状态3: 一个运算符,终态
void state4(int ,int );//状态4: 标识符,终态
void state5(int ,int );//状态5: 整数后接受到一个小数点,中间态
void state6(int ,int );//状态6: 实数,终态
void state7(int ,int );//状态7: 一个界符,终态
void state8(int ,int );//状态8: 当前接受到一个斜杠,有可能为除号,也有可能为注释
void state9(int ,int );//状态9: 接受到斜杠后,又接受到一个星号
void state10(int ,int);//状态10: 接受到斜杠后,又接受到一个斜杠
void state11(int ,int);//状态11: 接受到星号后,又接受到一个星号




bool iscal(char ch)//判断一个字符是否为运算符
{
	if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='=')	return true;
	return false;
}

bool isbound(char ch)
{
	if(ch=='('||ch==')') return true;
	return false;
}

bool isuseful(char ch)//判断一个字符是否为有意义字符
{
	if(iscal(ch)||isdigit(ch)||isalpha(ch)||isbound(ch))return true;
	return false;
}

void state0(int i,int j)
{
	char ch;
	if(passage[j]=='\0')return;
	{while(!isuseful(passage[j]))j++;if(passage[j]=='\0')return;}
	ch=passage[j];
	if(isdigit(ch))	{state2(i,j+1);return;}
	if(isalpha(ch)) 
	{state1(i,j+1);return;}
	if(iscal(ch)) 
	{state3(i,j+1);return;}
	if(isbound(ch)) {state7(i,j+1);return;}
	if(ch=='/') {state8(i,j+1);return;}
	state0(i,j);
}
void state1(int i,int j)
{
	char ch;
	int k;
	ch=passage[j];
	if(isdigit(ch)||isalpha(ch)) 
	{state4(i,j+1);return;}
	outfile<<"{"<<3<<",";
	for(k=i;k<j;k++) if(isuseful(passage[k])) outfile<<passage[k];
	outfile<<"}"<<endl;
	state0(j,j);
}
void state2(int i,int j)
{
	char ch;int k;
	ch=passage[j];
	if(ch=='.') {state5(i,j+1);return;}
	if(isdigit(ch)) {state2(i,j+1);return;}
	outfile<<"{"<<1<<",";
	for(k=i;k<j;k++)  if(isuseful(passage[k])) outfile<<passage[k];
	outfile<<"}"<<endl;
	state0(j,j);
}
void state3(int i,int j)
{
	char ch;
	ch=passage[j-1];
	if(ch=='/')
	{state8(i,j);return;}
	outfile<<"{"<<4<<","<<ch<<"}"<<endl;
	state0(j,j);
}
void state4(int i,int j)
{
	char ch;int k;
	ch=passage[j];
	if(isdigit(ch)||isalpha(ch)){state4(i,j+1);return;}
	outfile<<"{"<<3<<",";
	for(k=i;k<j;k++)  if(isuseful(passage[k])) outfile<<passage[k];
	outfile<<"}"<<endl;
	state0(j,j);
}
void state5(int i,int j)
{
	char ch;int k;
	ch=passage[j];
	if(isdigit(ch)){state6(i,j+1);return;}
	outfile<<"{"<<2<<",";
	for(k=i;k<j-1;k++)  if(isuseful(passage[k])) outfile<<passage[k];
	outfile<<"}"<<endl;
	state0(j,j);
}
void state6(int i,int j)
{
	char ch;int k;
	ch=passage[j];
	if(isdigit(ch)){state6(i,j+1);return;}
	outfile<<"{"<<2<<",";
	for(k=i;k<j;k++)  if(isuseful(passage[k])||passage[k]=='.') outfile<<passage[k];
	outfile<<"}"<<endl;
	state0(j,j);
}
void state7(int i,int j)
{
	char ch;
	ch=passage[j-1];
	outfile<<"{"<<5<<","<<ch<<"}"<<endl;
	state0(j,j);
}
void state8(int i,int j)
{
	char ch;
	ch=passage[j];
	if(ch=='/') {state10(i,j+1);return;}
	if(ch=='*') 
	{state9(i,j+1);return;}
	outfile<<"{"<<4<<",/"<<"}"<<endl;
	state0(i+1,i+1);
}
void state9(int i,int j)
{
	char ch;ch=passage[j];
	while(ch!='*')
	{
		j++;ch=passage[j];
		if(ch=='\0') 
			return;
	}
	if(ch=='\0') {outfile<<"{"<<4<<",/"<<"}"<<endl;state0(i+2,i+2);return;}
	state11(i,j+1);
}
void state10(int i,int j)
{
	char ch;
	ch=passage[j];
	if(ch=='\n') {state0(j+1,j+1);return;}
	state10(i,j+1);
}
void state11(int i,int j)
{
	char ch;
	ch=passage[j];
	if(ch=='/') 
	{state0(j+1,j+1);return;}
	state9(j+1,j+1);
}
void show()
{
	outfile<<"A:编号规定:";
	outfile<<"1:整型数  ";
	outfile<<"2:实型数  ";
	outfile<<"3:标识符  ";
	outfile<<"4:运算符  ";
	outfile<<"5:界符"<<endl;
}
int main()
{
	char ch;int i=0;
	outfile.open("output.txt",ios::out);//文件输出
	infile.open("input.txt",ios::in);//文件输入
	if(!outfile)
	{
		cerr<<"open error!"<<endl;
		exit(1);
	}
	if(!infile)
	{
		cerr<<"open error!"<<endl;
		exit(1);
	}
	show();/*显示编号提示*/
	while(infile.get(ch)) passage[i++]=ch;
	passage[i]='\0';
	state0(0,0);
	outfile.close();
	infile.close();
	return 0;
}
/*
sample
input
max3=(a+b)*5.5
output
{3,max3}
{4,=}
{4,(}
{3,a}
{4,+}
{3,b}
{4,)}
{4,*}
{2,5.5}
*/

⌨️ 快捷键说明

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