编译原理词法分析
来源:互联网 发布:淘宝的卖家中心在哪里 编辑:程序博客网 时间:2024/05/21 16:23
1.题目描述
2.代码实现
(1)注意标识符和无符号整数的重复问题,本人采用map解决。
(2)cin >> ch自动忽略空白字符。
#include <iostream>#include <vector>#include <string>#include <map>using namespace std;struct pairs { int category; int rank; pairs(int c, int r) : category(c), rank(r) {}};int isBoundaries(char ch) { switch (ch) { case '(': return 0; case ')': return 1; case '{': return 2; case '}': return 3; case ',': return 4; case ';': return 5; } return -1;}int isOperators(char ch1) { if (ch1 == '+') { return 0; } if (ch1 == '*') { return 1; } if (ch1 == '=') return 2; return -1;}int isKeywords(string str) { if (str == "int") return 0; if (str == "main") return 1; if (str == "return") return 2; return -1;}vector<pairs> result;map<string,int> uInts;map<string,int> identifiers;void judgeStrs(string str) { if (str == "") return; int r = 0; if (isdigit((int)(str[0]))) { r = uInts.size(); auto it = uInts.find(str); if (it == uInts.end()) uInts.insert(pair<string, int>(str, r)); else r = it->second; pairs p(5, r); result.push_back(p); } else { r = isKeywords(str); // identifier if (r == -1) { r = identifiers.size(); auto it = identifiers.find(str); if (it == identifiers.end()) identifiers.insert(pair<string, int>(str, r)); else r = it->second; pairs p(4, r); result.push_back(p); } else { pairs p(1, r); result.push_back(p); } }}void printResult() { int n = result.size(); for (int i = 0; i < n; ++i) { cout << "<" << result[i].category << "," << result[i].rank << ">"; } cout << endl; cout << "identifieres:"; for (auto it = identifiers.begin(); it != identifiers.end(); ++it) { cout << it->first << " "; } cout << endl; cout << "Unsigned_integer:"; for (auto it = uInts.begin(); it != uInts.end(); ++it) { cout << it->first << " "; } cout << endl;}int main() { string tempStr = ""; char ch; int preOpe = 0; int tempR = 0; while (cin.get(ch) && (ch != '#')) { if (ch == ' ' || ch == '\n' || ch == '\t') { judgeStrs(tempStr); tempStr = ""; continue; } // 判断是不是操作符 if (isOperators(ch) != -1) { // 判断前面的tempStr judgeStrs(tempStr); // 判断操作符 if (preOpe == 0) { pairs temp(2, isOperators(ch)); result.push_back(temp); preOpe = 1; } else { pairs t = result.back(); result.pop_back(); tempStr = ""; if (t.rank == 0) { tempStr += '+'; tempR = 3; } if (t.rank == 1) { tempStr += '*'; tempR = 4; } tempStr += '='; pairs newOpe(t.category, tempR); result.push_back(newOpe); preOpe = 0; } tempStr = ""; } else if (isBoundaries(ch) != -1) { // 先判断tempStr judgeStrs(tempStr); // 判断分界符 pairs bound(3, isBoundaries(ch)); result.push_back(bound); tempStr = ""; } else { preOpe = 0; tempStr += ch; } } printResult();// system("pause"); return 0;}
3.小结
本题难度不太,分清楚各种类别的字符串并进行判断即可。
阅读全文
0 0
- 编译原理 词法分析
- 编译原理词法分析
- 编译原理 词法分析
- 编译原理词法分析
- 编译原理词法分析
- 编译原理词法分析
- 编译原理 词法分析
- 编译原理--词法分析
- 【编译原理】词法分析
- 编译原理-词法分析
- 编译原理词法分析
- 编译原理实验----词法分析
- 编译原理词法分析程序
- 编译原理:PL0词法分析
- 编译原理 之 词法分析
- 编译原理简单词法分析
- 编译原理之词法分析
- 编译原理之词法分析
- 欢迎使用CSDN-markdown编辑器
- NOIP 2003 Senior 3
- p43-3.4
- 网页静态化技术Freemarker
- 程序员心中的“女神”
- 编译原理词法分析
- vue基础动态路由,嵌套路由router-link切换
- 从今天开始写博客
- 怎么花钱能变得富有,除了读书还能这样
- Caused by: java.net.URISyntaxException: Illegal character in query at index , Target host is not sp
- 点击显示/隐藏密码
- POJ 2413 How many Fibs?(高精度暴力)
- Spring事务配置解惑
- java-mybatis generator-生成 mysql 数据库访问文件