📄 词法分析器.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 + -