简易C语言词法分析程序

更好的阅读体验 \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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪漫主义狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值