求大佬看一下为什么实现不了分界符的识别
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
using namespace std;
const int max = 66;
string id[max] = { "do","end","for","if","printf","scanf","then","while" }; //关键字
string s[max] = { ",",";","(",")","[","]", "+","-","*","/", "<","<=","=",">",">=","<>" }; //分界符表,算术运算符表,关系运算符表,都存入s表中
string k[max]; //标识符
string ci[max]; //常数
int fenpointer = 5; //分界符表尾
int mathpointer = 9; //算数运算符表尾
int cipointer = 0; //常数表尾
int idpointer = 0;//关键字表尾
int kpointer = 0; //标识符表尾
int outkey = 0;//打印控制字,0表示数字之后由字母
int fen; //判断分界符,0代表是,1代表不是
int row = 1;//输入的行数
int line = 1;//输入的列数
void searchs(int i, string m) //根据首字母识别字符串
{
int x; //输入字符串
if (i == 0) //首字母为关键字
{
for (x = 0; x < max; x++)
{
if (id[x] == m)
{
cout << "(1," << id[x] << ") " << "关键字(" << row << "," << line << ")" << endl;
break;
}
}
if (x == max)//不再是关键字则判断是否为标识符
{
for (x = 0; x < max; x++)
{
if (k[x] == m)
{
cout << "(6," << m << ") " << "标识符(" << row << "," << line << ")" << endl;
break;
}
}
if (x == max) //标识符表中不含有此标识符的时候,插入标识符
{
cout << "(6," << m << ") " << "标识符(" << row << "," << line << ")" << endl;
k[kpointer] = m;
kpointer++;
}
}
}
if (i == 1) //常数
{
for (x = 0; x < max; x++)
{
if (ci[x] == m)
{
cout << "(5," << x << ")" << endl;
break;
}
}
if (x == max) //常数表中不含有此标识符的时候,插入常数
{
cout << "(5," << m << ") " << "常数(" << row << "," << line << ")" << endl;
ci[cipointer] = m;
cipointer++;
}
}
if (i == 2)//分界符,算数运算符,关系运算符
{
for (x = 0; x < max; x++)
{
if (s[x] == m)
break;
} //x递减
if (x < 6)
{
fen = 1;//s数组中,0~5为分界符n
}
if (x > 5 && x < 10) //s表中,第六到九中的数为算数运算符
{
if (outkey == 1)
{
cout << "(3," << s[x] << ") " << "算数运算符(" << row << "," << line << ")" << endl;
outkey = 0;
}
fen = 0;
}
if (x > 9 && x < max - 1)
{
if (outkey == 1)
{
cout << "(4," << s[x] << ") " << "关系运算符(" << row << "," << line << ")" << endl;
outkey = 0;
}
fen = 0;
}
if (x == max)
{
if (outkey == 1)
{
cout << "Error Error (" << row << "," << line << ")" << endl;
outkey = 0;
}
fen = 0;
}
}
};
void wordlook(char t, string sn)//识别首字符,分类识别字符串
{
if (t >= '0'&&t <= '9') //判断首字符是否为数字0~9
searchs(1, sn);//关键字
else
{
if ((t > 'A'&&t <= 'Z') || (t >= 'a'&&t <= 'z'))
searchs(0, sn);
else
searchs(2, sn);//分界符
}
};
void split(string s)//分割字符串
{
string now[max];
string sn;
int nowpointer = 0;
int i = 0;
int x;
int sign = 2;//非法数字
int dian = 0;//数中点的个数
for(x=0;x< s.length();x++)
{
if ((s[x] >= 'A'&&s[x] <= 'Z')
|| (s[x] >= 'a'&&s[x] <= 'z')
|| (s[x] >= '0'&&s[x] <= '9')
|| (x > 0 && s[x] == '.'&&sign == 1))//判断数字之后有字母还是字母之后有数字
{
if (i == 0)
{
if (s[x] >= '0'&&s[x] <= '9')
sign = 1;
else
sign = 2;//数字不为0~9则非法,sign=2
}
else
{
if (sign == 1)//数字之后仍为数字
{
if (s[x] >= '0'&&s[x] <= '9' || s[x] == '.')//判断数字之后是有没有点
{
if (s[x] == '.')
{
if (dian == 0)
dian++;
else sign = 0;
}//判断是否为小数
}
else sign = 0;
}
}
i++;//继续判断之后的内容
if (x == (s.length() - 1))//到达最后一位
{
sn = s.substr(x - i + 1, i);
if (i > 0)
{
cout << sn << " ";
if (sign == 0)//数字之后有字母,应当报错r
cout << "Error Error (" << row << "," << line << ")" << endl;
else //字母开头
{
wordlook(sn[0], sn);
line++;//列数加一
}
}
}
}
else //找列数
{
if (x > 0 && (s[x - 1] >= 'A'&&s[x - 1] <= 'Z') ||
(s[x - 1] >= 'a'&&s[x - 1] <= 'z') ||
(s[x - 1] >= '0'&&s[x - 1] <= '9'))//分界符运算,分界符前面是数字或者字母
{
sn = s.substr(x - i, i);
if (i > 0)
{
cout << sn << " ";
if (sign == 0)
cout << "Error Error (" << row << "," << line << ")" << endl;
else
{
wordlook(sn[0], sn);
line++;
}
}
i = 0;
}
string y = s.substr(x, 1);//判断分界符还是运算符
wordlook(s[x], y);
if (fen == 0)//运算符
{
i++;
if ((s[x + 1] >= 'A'&&s[x + 1] <= 'Z') ||
(s[x + 1] >= 'a'&&s[x + 1] <= 'z') ||
(s[x + 1] >= '0'&&s[x + 1] <= '9'))//后面为数字或者字母
{
sn = s.substr(x - i + 1, i);
cout << sn << " ";
outkey = 1;
wordlook(sn[0], sn);
line++;
i = 0;
}
}
if (fen == 1)//分界符
{
if ((s[x - 1] >= 'A'&&s[x - 1] <= 'Z') ||
(s[x - 1] >= 'a'&&s[x - 1] <= 'z') ||
(s[x - 1] >= '0'&&s[x - 1] <= '9')) //前面为数字或者字母
{ //不用管
}
else if (i > 0)
{
sn = s.substr(x - i, i);
cout << sn << " ";
outkey = 1;
wordlook(sn[0], sn);
line++;
i = 0;
}
cout << s[x]<<" (2," << s[x] << ") " << "分界符(" << row << "," << line << ")" << endl;
row++;
}
}
}
}
int main()
{
string instring;//读入一行
string sn;
ifstream file1;
file1.open("d:\\c++文件\\project1\\salaryfile.txt");
if (!file1)
{
cout << "no file" << endl;
}
string q;
while (!file1.eof())
{
getline(file1, q);
istringstream istr(q);
string qword;
while (istr >> qword)//分割字符串
{
split(qword);
}
row++;
line=1;
}
return 0;
}