更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验
问题
词法规则:
<标识符>::=<字母>
<标识符>::=<标识符><字母>
<标识符>::=<标识符><数字>
<常量>::=<无符号整数>
<无符号整数>::=<数字序列>
<数字序列>::=<数字序列><数字>
<数字序列>::=<数字>
<字母>::=a|b|c|……|x|y|z
<数字>::=0|1|2|3|4|5|6|7|8|9
<加法运算符>::=+|-
<乘法运算符>::=*|/
<关系运算符>::=<|>|!=|>=|<=|==
<分界符>::=,|;|(|)|{|}
<保留字>::=main|int|if|else|while|do
符号表:
单词符号 | 种类码 | 单词符号 | 种类码 |
---|---|---|---|
标识符 | 0 | 整数 | 24 |
main | 1 | >= | 10 |
int | 2 | <= | 11 |
if | 3 | == | 12 |
else | 4 | , | 13 |
while | 5 | ; | 14 |
do | 6 | ) | 15 |
< | 7 | ( | 16 |
> | 8 | { | 17 |
!= | 9 | } | 18 |
+ | 19 | - | 20 |
* | 21 | / | 22 |
= | 23 |
根据词法规则和符号表,制作词法分析器
思路
- 利用两个
unordered_map
分别存储关键字和其他符号的映射规则 - 对于原程序中的空格符需要忽略
- 利用
std::ifstream
读入文件,std::istreambuf_iterator
来遍历 - 将字符拼接识,判断即可
代码
#include <iostream>
#include <fstream>
#include <string>
#include <unordered_map>
#include <cctype>
// 关键字和对应的种别码
std::unordered_map<std::string, int> keywords = {
{
"main", 1}, {
"int", 2}, {
"if", 3}, {
"else", 4}, {
"while", 5}