小C语言-词法分析程序

题目简介

题目思路

首题目给的条件是:

  • 关键字:main if else for while int
  • 自定义标识符:除关键字外的标识符
  • 整数:无符号整数
  • 界符:{ } ( ) , ;
  • 运算符:= + - * / < <= > >= == !=

当出现这些符号时,需要进行判断,来获取输出,输出的格式如以下所示:

  • 关键字:用keyword表示
  • 自定义标识符:用identifier表示
  • 整数:用integer表示
  • 界符:用boundary表示
  • 运算符:用operator表示

主程序中用一个temp字符串来存储非运算符、界符之外的字符。
以样例为例:
当跑main时,他会把main储存到temp字符串数组中,当跑到(时,他会判断temp中的字符,来判断其是不是关键字,如果是的话,进行输出,不是的话,输出其为自定义标识符。其他的也同理,最后判断输出temp。

注意注意

  1. 第一个错的地方,容易出现在判断 <= 这类,忘记i++
  2. 第二个错误的地方,容易出现在输出上面,经常性的会漏掉输出中个某个逗号或者其他的

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*

author:苦酒
QQ:1793929520
blog:huangliangshuai.com

*/

#include <iostream>
#include <string>

using namespace std;

string kind[5] = {"keyword","identifier","integer","boundary","operator"};
string keyword[6] = {"main","if","else","for","while","int"};
void decide(string s)
{
if(s[0] >= '0' && s[0] <= '9')//如果当前判断的第一个字符为数字的话,直接输出
{
cout<<"("<<kind[2]<<","<<s<<")"<<endl;
}
else
{
int f = 0;//此处作为标记
for(int i = 0; i < 6; i++)
{
if(s == keyword[i])//如果当前temp存储的字符串与关键字里面的字符串相等,则改变标记的数值,并且输出关键字,终止循环,节省时间
{
f = 1;
cout<<"("<<kind[0]<<","<<s<<")"<<endl;
break;
}
}
if(f == 0)//如果找不到关键字的话,则认为这是一个自定义标识符,进行输出
{
cout<<"("<<kind[1]<<","<<s<<")"<<endl;
}
}
}
int main()
{
string s;
while(cin>>s)
{
string temp;
temp = "";
int len = s.length();
for(int i = 0; i < len; i++)
{
if(s[i] == '=' || s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '<' || s[i] == '>' || s[i] == '!')//判断输入的是不是运算符
{
if(temp.length())
{
decide(temp);
}
temp = "";
if(i + 1 < len && s[i + 1] == '=')//判断输入的是不是<= >= == ,是的话就进行输出、
{
cout<<"("<<kind[4]<<","<<s[i]<<s[i+1]<<")"<<endl;
i++;
}
else
{
cout<<"("<<kind[4]<<","<<s[i]<<")"<<endl;//反之就输出单字符的运算符
}
}
else if(s[i] == '(' || s[i] == ')' || s[i] == '{' || s[i] == '}' || s[i] == ',' || s[i] == ';')//判断当前是不是界符
{
if(temp.length())
{
decide(temp);
}
temp = "";
cout<<"("<<kind[3]<<","<<s[i]<<")"<<endl;
}
else
{
temp = temp + s[i];//将全部不是的存储到temp里面
}
}
if(temp.length())
{
decide(temp);
}
}
return 0;
}


/***************************************************
User name: jk170631黄良帅
Result: Accepted
Take time: 0ms
Take Memory: 196KB
Submit time: 2019-11-18 21:33:32
****************************************************/
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2017-2020 苦酒
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信