#include <iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
string ba[5]= {"while","if","else","switch","case"};//关键字表
int hash1[305]= {};
string str,str1;
int len;
char ch;
void start()//初始化符号和数字表
{
int i,j;
//初始化运算符、界符
hash1['+']=8;
hash1['-']=9;
hash1['*']=10;
hash1[';']=13;
hash1['<']=11;
hash1['=']=12;
//初始化数字和字母
for(i=49,j=97; i<=57||j<=122; j++)
{
if(i<=57)
{
hash1[i]=7;
i++;
}
hash1[j]=-1;
}
}
void print()//打印关键字,标识符、或数字(不包括运算符、界符)
{
if(hash1[str1[0]]==7)//打印数字
{
cout<<"("<<str1<<","<<"num)"<<endl;
}
else//打印关键字,标识符
{
int i;
for(i=0; i<5; i++)
{
if(str1==ba[i])//打印关键字
{
cout<<"("<<str1<<","<<i+1<<")"<<endl;
break;
}
}
if(i==5)//打印标识符
{
cout<<"("<<str1<<","<<"id)"<<endl;
}
}
}
void clean()//字符串表初始化
{
if(str1!="")
{
print();
str1="";
}
}
int main()
{
// freopen("C:\\Users\\Administrator\\Desktop\\888.txt","r",stdin);
start();
while(cin>>str)//多组输入,忽略空格
{
len=str.size();//获取字符串长度
ch=str[0];//获取首字符,用于判断该字符串是数字串还是字母串
str1="";//字符串表初始化
for(int i=0; i<len; i++)
{
if(!hash1[str[i]])//识别非法字符并输出,不影响后续输入
{
clean();
cout<<"("<<str[i]<<",error)"<<endl;
continue;
}
if(i<len-1)
{
if(hash1[str[i]]>=8&&hash1[str[i]]<=13)//识别运算符及界符
{
clean();
if(hash1[str[i+1]]>=8&&hash1[str[i+1]]<=13)//识别运算符及界符,+,-,*,=.
{
if((str[i]=='='||str[i]=='<')&&str[i+1]=='=')//打印运算符"==","<="
{
cout<<"("<<str[i]<<str[i+1]<<","<<"11)"<<endl;
}
else//打印运算符或界符
{
cout<<"("<<str[i]<<","<<hash1[str[i]]<<")"<<endl;
cout<<"("<<str[i+1]<<","<<hash1[str[i+1]]<<")"<<endl;
}
i++;
}
else//打印识别运算符或界符
{
cout<<"("<<str[i]<<","<<hash1[str[i]]<<")"<<endl;
}
if(i<len-1&&(hash1[str[i+1]]==-1||hash1[str[i+1]]==7))
{
ch=str[i+1];//获取子串首字符,用于判断该字符串是数字串还是字母串
}
}
else//识别字母和数字
{
if(hash1[ch]==7&&hash1[str[i]]==-1)//如果首字符是数字,而后续字符是字母,则属于非法字符
{
cout<<"("<<str[i]<<",error)"<<endl;
}
else//将合法字符加入字符串表
{
str1=str1+str[i];
}
}
}
else//将合法字符加入字符串表
{
str1=str1+str[i];
print();
}
}
}
return 0;
}
输入:
运行结果:
该程序用到的:
运算符:+,-,*,<=,<,=,==
界符:;
关键字:while,if,else,switch,case
最重要的是,这段代码执行前,要建立一个文本文件,将要输入的放进去!有不了解c++ freopen的可以到网上自行查阅,这里就不做过多叙述了。
这个词法分析器只是给大家提供一个思路,还有很多可以扩展的地方,有兴趣的可以做一做。