Sicily1000. 词法分析
来源:互联网 发布:小米主题 windows xp 编辑:程序博客网 时间:2024/06/15 02:24
Sicily1000. 词法分析程序设计 **
题目
设一语言的关键词、运算符、分界符的个数与单词如下:
struct { int number; string str[10]; } keywords={3,”int”,”main”,”return”} ; //关键词
struct { int number; string str[10]; } operators ={5,”+”,”“,”=”,”+=”,”=”}; //运算符
struct { int number; string str[10]; } boundaries ={6,”(“,”)”,”{“,”}”,”,”,”;”} ; //分界符
struct { int number; string str[100];} identifieres={0}; //标识符
struct { int number; string str[100];} Unsigned_integer={0}; //无符号整数
以上类号分别为1~5,序号从0开始;
标识符是字母开头的字母数字串;常量为无符号整数;
用C++设计一程序实现词法分析。Input
输入一程序,结束符用”#”;Output
输出单词数对:<类号,序号>。 输出标识符表,用空格分隔; 输出无符号整数表,用空格分隔;输入样例
main()
{ int a=2,b=3;
return 2*b+a;
}#输出样例
<1,1><3,0><3,1><3,2><1,0><4,0><2,2><5,0><3,4><4,1><2,2><5,1><3,5><1,2><5,0><2,1><4,1><2,0><4,0><3,5><3,3>
identifieres:a b
Unsigned_integer:2 3
解题分析
题目要求我们输入程序,输出对应的单词数对。通过样例我们不难发现,这道题的难点在于标识符和无符号整数变量的判断;因为如果输入相同的变量,那么输出的单词数对也应该相同。下面我们简单来分析一下这道题的解题思路。
我们从最容易判断的分界符开始来看。当分界符为其中的一个时,直接输出<3,分界符位置>即可。
再来看看运算符的判断。如果当前字符为加号或乘号,就要额外判断下一个字符是否为=,因为运算符中有+=和*=这两个运算符;其它的运算符和上面分界符的处理一样。
无符号整数的判断稍微困难一些,因为还要额外判断该整数是否在前面已判断的串中出现过。如果出现过,就直接输出之前的单词数对;如果没有出现过,就输出<5,无符号整数个数>。
标识符的判断是最难的,因为除了要判断该标识符是否已出现过以外,还牵扯到关键字的判断。标识符结束的判断我们可以通过判断下一个字符是否为字母来实现。在一个标识符结束之后,我们首先判断其是否为关键字,如果是关键字,输出<1,关键字位置>;如果不是关键字,跟前面无符号整数的判断一样,额外判断该标识符是否出现过,在此不再赘述。
把所有这5种情况判断完,问题就顺利解决了。
源代码
#include<iostream>#include<string>using namespace std;struct { int number; string str[10]; } keywords = { 3,"int","main","return" }; //关键词struct { int number; string str[10]; } operators = { 5,"+","*","=","+=","*=" }; //运算符struct { int number; string str[10]; } boundaries = { 6,"(",")","{","}",",",";" }; //分界符struct { int number; string str[100]; } identifieres = { 0 }; //标识符struct { int number; string str[100]; } Unsigned_integer = { 0 }; //无符号整数void scan(string s) { string result =""; int i, index = 0; for (i = 0; i < s.size(); i++) { for (int j = 0; j < boundaries.number; j++) { if (s[i] == boundaries.str[j][0]) { cout << "<3," << j << ">"; break; } } for (int j = 0; j < 2; j++) { if (s[i] == operators.str[j][0]) { if (s[i + 1] == '=') { cout << "<2," << j + 3 << ">"; break; } else { cout << "<2," << j << ">"; break; } } } if (s[i] == '=') { cout << "<2,2>"; continue; } if (s[i] == ' ' || s[i] == '\n') { continue; } if (s[i] >= '0' && s[i] <= '9') { result += s[i]; if (s[i + 1] < '0'|| s[i + 1] > '9') { int k, flag = 1; for (k = 0; k < Unsigned_integer.number; k++) { if (result == Unsigned_integer.str[k]) { flag = 0; break; } } if (flag) { cout << "<5," << Unsigned_integer.number << ">"; Unsigned_integer.str[Unsigned_integer.number] = result; Unsigned_integer.number++; result = ""; continue; } else { cout << "<5," << k << ">"; result = ""; continue; } } } if (isalpha(s[i])) { result += s[i]; int bflag = 1; for (int j = 0; j < 3; j++) { if (result == keywords.str[j]) { cout << "<1," << j << ">"; result = ""; bflag = 0; break; } } if (bflag) { if (!isalpha(s[i + 1])) { int flag = 1; for (int j = 0; j < 3; j++) { if (result == keywords.str[j]) { cout << "<1," << j << ">"; result = ""; flag = 0; break; } } for (int k = 0; k < identifieres.number; k++) { if (result == identifieres.str[k]) { cout << "<4," << k << ">"; result = ""; flag = 0; break; } } if (flag) { identifieres.str[identifieres.number++] = result; cout << "<4," << identifieres.number - 1 << ">"; result = ""; continue; } } } } } cout << "\nidentifieres:"; for (int i = 0; i < identifieres.number - 1; i++) { cout << identifieres.str[i] << " "; } if(identifieres.number) { cout << identifieres.str[identifieres.number - 1]; } cout << endl << "Unsigned_integer:"; for (int i = 0; i < Unsigned_integer.number - 1; i++) { cout << Unsigned_integer.str[i] << " "; } if (Unsigned_integer.number) { cout << Unsigned_integer.str[Unsigned_integer.number - 1]; } cout << endl;}int main() { char c; string s; while (cin >> c&&c != '#') { s += c; } scan(s); system("pause");}
以上是我对这道问题的一些想法,有问题还请在评论区讨论留言~
- sicily1000. 词法分析程序设计 **
- Sicily1000. 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 词法分析
- 3-8·Linux源码包管理、脚本安装包
- REUSEADDR,服务器连接多个客户端,点对点聊天程序
- xmos_helloworld
- java字符串所有组合,字符串全组合--递归
- 数据结构实验之排序四:寻找大富翁
- Sicily1000. 词法分析
- VMware中centOS配置静态IP
- Python基础-多进程-线程池Pool-进程间通信
- Echarts实现可视化世界地图——Vue
- 史上最强屏幕适配方案,傻瓜式集成,一步到位---不服来辩!
- ECharts官方教程(八)【数据的视觉映射】
- 每日一练
- 整理下.net分布式系统架构的思路
- Python基础-多线程与Lock锁