テストプログラム:
//头文件
#include <iostream>
#include <map>
#include <algorithm>
#include <string>
#include<stdio.h>
#include<time.h>
using namespace std;
string instr;//输入符号串
int index;//当前输入符号读入字符的位置
char character;//全局变量字符,存放最新读入的字符
string token;//字符数组,存放已读入的字符序列
map<string, int> Symbol;//标识符集
map<string, int> Digit;//常数集
map<string, int> other;//other
map<string, int>::iterator ite;
const int len = 100;
string Reserve[len];//保留字表
void init_Reserve() //构造保留字表的函数
{
Reserve[1] = "begin";
Reserve[2] = "end";
Reserve[3] = "if";
Reserve[4] = "then";
Reserve[5] = "while";
Reserve[6] = "do";
Reserve[7] = "const";
Reserve[8] = "var";
Reserve[9] = "call";
Reserve[10] = "procedure";
}
void getChar() //读入一个字符
{
character = instr[index++];
}
void getnbc() //读入非空白字符
{
while (character == ' ')
{
getChar();
}
}
void concat() //连接字符串
{
token = token + character;
}
bool letter() //判断是否为字母
{
if ((character >= 'A'&&character <= 'Z') || (character >= 'a'&&character <= 'z'))
return true;
return false;
}
bool digit() //判断是否为数字
{
if (character >= '0'&&character <= '9')
return true;
return false;
}
void retract() //回退字符的函数
{
// character = ' ';
index--;
}
int reserve() //匹配保留字符
{
for (int i = 0; i < len; i++)
if (Reserve[i] == token)
return i;
return -1;
}
string symbol()
{
ite = Symbol.find(token);
if (ite != Symbol.end())
{
return ite->first;
}
else
{
Symbol[token] = Symbol.size();
return token;
}
}
string constant()
{
ite = Digit.find(token);
if (ite != Digit.end())
{
return ite->first;
}
else
{
Digit[token] = Digit.size();
return token;
}
}
string Three()
{
ite = other.find(token);
if (ite != other.end())
{
return ite->first;
}
else
{
other[token] = other.size();
return token;
}
}
void error()
{
cout << token << "\t-->\t该单词不存在" << endl;
}
//词法分析函数,逐个识别单词
void LexAnalyze()
{
token = "";
getChar();
getnbc();
string val;
// int num = -1;
if(character>='a'&&character<='z' || character>='A'&&character<='Z')
{
while (letter() || digit()) //为字母或数字
{
concat();//追加到token末尾
if(token=="odd")
{
getChar();
Three();
return ;
}
getChar();//读取下一个字符
}
retract();//回退一个字符
{
val = symbol();//查看标识符表
}
}
else if(character>='0' && character<='9')
{
int flag=0;
while (character!=' ') //为数字
{
concat();
if(character>='a' && character<='z' || character>='A' && character <='Z')
{
flag=1;
}
getChar();
}
if(flag==1)
{
return error();
}
retract();
val = constant();//查看常数表
}
else if(character=='<')
{
concat();
getChar();
if (character == '=')
{
concat();
Three();
//返回<=符号
}
else if(character=='>')
{
concat();
Three();
}
else
{
retract();
Three();
//返回<符号
}
}
else if(character=='>')
{
concat();
getChar();
if (character == '=')
{
concat();
Three();
//返回>=符号
}
else
{
retract();
Three();
//返回>符号
}
}
else if(character=='=')
{
concat();
getChar();
if (character == '=')
{
concat();
Three();
//返回==符号
}
else
{
retract();
Three();
//返回=符号
}
}
else if(character==':')
{
concat();
getChar();
if (character == '=')
{
concat();
Three();
}
else
{
cout<<token<<endl;
return error();
};
}
else if(character=='+')
{
concat();
Three();
}
else if(character=='-')
{
concat();
Three();
}
else if(character=='*')
{
concat();
Three();
}
else if(character=='/')
{
concat();
Three();
}
else if(character=='(')
{
concat();
Three();
}
else if(character==')')
{
concat();
Three();
}
else if(character==',')
{
concat();
Three();
}
else if(character=='.')
{
concat();
Three();
}
else if(character==';')
{
concat();
Three();
}
else
{
return error();
};
}
void show_table()
{
cout << "\n==================" << "标识符" << "==================" << endl;
// cout << "标识符\t\t类别编码\t表中位置" << endl;
for (ite=Symbol.begin(); ite != Symbol.end(); ite++)
{
int flag=0;
for (int i = 0; i < len; i++)
{
// cout<<Reserve[i]<<endl;
if (Reserve[i] == ite->first)
{
cout<<ite->first<<"是保留字"<<" ";
cout << "("<<ite->first <<","<<ite->second<<")" << endl;
flag=1;
break;
}
}
if(flag==0)
cout << "("<<ite->first <<","<<ite->second<<")" << endl;
}
cout << "\n==================" << "常数表" << "==================" << endl;
// cout << "常量值\t\t类别编码\t表中位置" << endl;
for (ite = Digit.begin(); ite != Digit.end(); ite++)
{
cout << "("<<ite->first <<","<<ite->second<<")" << endl;
}
cout << "\n==================" << "算符、界符" << "==================" << endl;
for (ite = other.begin(); ite != other.end(); ite++)
{
cout << "("<<ite->first <<","<<ite->second<<")" << endl;
}
}
int main()
{
// clock_t start,finish;
// double totaltime;
// start=clock();
init_Reserve();//保留字表初始化
Symbol.clear();//标识符集初始化
Digit.clear();//常数集初始化
index = 0;
character = ' ';
token = "";
cout << "请输入待词法分析的源程序代码:输入@代表结束输入\n" << endl;
//源程序代码输入处理
string in;
while (cin >> in&&in != "@")
{
instr = instr + " " + in;
}
//识别二元组初始化
while (index < instr.size())
{
LexAnalyze();
}
//展示构造的各种词汇表
show_table();
// finish=clock();
// totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
// cout<<totaltime<<endl;
// //system("pause");
return 0;
}
試験結果: