体验版,仅提供简单的思路,考虑的情况不多
#include<bits/stdc++.h>
using namespace std;
map<string,string> word;//应用map数据结构形成一个string->string的对应
std::map<string,string>::iterator it;//用来遍历整个对应关系的迭代器
void map_init(){//对应关系进行初始化
word["begin"]="beginsym";
word["call"]="callsym";
word["const"]="constsym";
word["do"]="dosym";
word["end"]="endsym";
word["if"]="ifsym";
word["odd"]="oddsym";
word["procedure"]="proceduresym";
word["read"]="readsym";
word["then"]="thensym";
word["var"]="varsym";
word["while"]="whilesym";
word["write"]="writesym";
word["+"]="plus";
word["-"]="minus";
word["*"]="times";
word["/"]="slash";
word["="]="eql";
word["<>"]="neq";
word["<"]="lss";
word["<="]="leq";
word[">"]="gtr";
word[">="]="geq";
word[":="]="becomes";
word["("]="lparen";
word[")"]="rparen";
word["{"]="界符";
word["}"]="界符";
word[","]="comma";
word[";"]="semicolon";
word["."]="period";
word["int"]="key";
word["string"]="key";
}
int main(){
map_init();//初始化
char ch;
string str;//string变量进行字符识别
string wordtest;
ifstream infile("E:\\桌面\\新建文本文档.txt");//文件输入流
ostringstream buf;
while(buf&&infile.get(ch)) buf.put(ch);//将文件中的字符读出来
str= buf.str();//将得到的字符储存到string类型变量中
int csize=str.length();
int state;
int p;
int i = 0;
int lockp;
bool debug = false;
while(i<csize){
while(str[i]==' '||str[i]=='\n') i++;
wordtest = "";
//自动机
state = 0;
if(debug)cout<<"view:1;i:"<<i<<";p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
while(state != -1){
p = i;
if(debug)cout<<"view:2;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
switch(state){
//id判断
case (0):{
if(debug)cout<<"view:3;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
state = 1;
p = i;
while(state != 4 && state != -1){//跳转下一个自动机
switch(state){
case (1):{
if(debug)cout<<"view:4;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
if(isalpha(str[p])){
wordtest=str[p];
p++;
state = 2;
}
else{
state = 4;//跳转下一个自动机
}
break;
}
case (2):{
if(debug)cout<<"view:5;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
if(!isalpha(str[p]) && !isdigit(str[p])){
state = 3;
lockp = p;
}
else{
wordtest+=str[p];
p++;
}
break;
}
case (3):{
if(debug)cout<<"view:6;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
it=word.find(wordtest);
if(it!=word.end())//判断是不是基本字,若为基本字则进行输出
{
cout<<"<"<<wordtest<<","<<word[wordtest]<<">"<<endl;
}
else//否则直接输出
{
cout<<"<"<<wordtest<<","<<"ident"<<">"<<endl;//判断是不是变量名
}
state = -1;//跳转下一个自动机
i = lockp - 1;
if(debug)cout<<"view:7;i:"<<i<<";p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
break;
}
}
}
break;
}
//数字自动机
case (4):{
if(debug)cout<<"view:8;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
state = 5;
p = i;
while(state != 13 && state != -1){//跳转下一个自动机
switch(state){
case (5):{
if(debug)cout<<"view:9;str[p]:"<<str[p]<<";p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
if(isdigit(str[p])){
wordtest = str[p];
p++;
state = 6;
}
else{
state = 13;//跳转下一个自动机
}
break;
}
case (6):{//第一次非数字
if(debug)cout<<"view:10;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
if(!isdigit(str[p])){
if(str[p] == '.'){
wordtest += str[p];
p++;
state = 7;
}
else if(str[p] == 'E'){
wordtest += str[p];
p++;
state = 9;
}
else{
state = 11;
lockp = p;
}
}
else{
wordtest += str[p];
p++;
}
break;
}
case (7):{//包含小数点的数
if(debug)cout<<"view:11;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
if(!isdigit(str[p])){//小数点后不是数字
state = 12;//错误
}
else{
wordtest += str[p];
p++;
state = 8;
}
break;
}
case (8):{
if(debug)cout<<"view:12;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
if(!isdigit(str[p])){
if(str[p] == '.'){
state = 12;//错误
}
else if(str[p] == 'E'){
wordtest += str[p];
p++;
state = 9;
}
else{
lockp = p;
state = 11;
}
}
else{
wordtest += str[p];
p++;
}
break;
}
case (9):{
if(debug)cout<<"view:13;str[p]:"<<str[p]<<";p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
if(str[p] == '+' || str[p] == '-'){
wordtest += str[p];
p++;
state = 10;
}
else{
state = 12;//错误
}
break;
}
case (10):{
if(debug)cout<<"view:14;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
if(!isdigit(str[p])){
lockp = p;
state = 11;
}
else{
wordtest += str[p];
p++;
}
break;
}
case(11):{
if(debug)cout<<"view:15;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
if(isalpha(str[p]) || str[p] == '.' || str[p] == ':'){
state = 12;//出错
cout<<"error";
}
else{
i = lockp - 1;
state = -1;
cout<<"<"<<wordtest<<","<<"num"<<">"<<endl;//判断是不是变量名
}
break;
}
case(12):{
if(debug)cout<<"view:16;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
state = -1;
while(isalpha(str[p])||isdigit(str[p])||str[p]=='E'||str[p]=='+'||str[p]=='-')p++;
i = p;
break;
}
}
}
break;
}
case (13):{
p = i;
state = 14;
while(state != 18 && state != -1){
switch(state){
case (14):{
if(!isalpha(str[p]) && !isdigit(str[p])){
state = 15;
wordtest = str[p];
p++;
}
break;
}
case (15):{
it=word.find(wordtest);
if(it == word.end()){
state = 16;
lockp = p;
}
else{
while(word.find(wordtest + str[p])!=word.end()){
wordtest += str[p];
p++;
}
state = 16;
lockp = p;
}
break;
}
case (16):{
it=word.find(wordtest);
if(it!=word.end())//判断是不是基本字,若为基本字则进行输出
{
cout<<"<"<<wordtest<<","<<word[wordtest]<<">"<<endl;
}
else//否则直接输出
{
cout<<"error"<<endl;//判断是不是变量名
}
state = -1;//跳转下一个自动机
i = lockp - 1;
break;
}
}
}
if(debug)cout<<"view:17;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
break;
}
default:
state = -1;
break;
}
}
i++;
}
infile.close();
return 0;
}