求大佬看一下为什么实现不了分界符的识别

qq_42533789 2019-06-03 03:31:08
#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; }
...全文
65 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gouyanfen 2019-06-03
  • 打赏
  • 举报
回复
太长了,没细看,全局变量string s[]数组;void split(string s)//分割字符串是string s 虽然string 重载了[]符号,我不确定你在函数中用s[x]的话编译器会解释成全局的string s[]的成员还是你局部string s的at(n)
gouyanfen 2019-06-03
  • 打赏
  • 举报
回复
string 不等与 char *,你的string s;s[x]取不到你想要的结果

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧