SNL编译器之词法分析器

这是什么

这是吉林大学编译原理的课程设计。想必来到这里的看客手头都应该有那本实验书,故背景就不多讲了。


词法分析如何做

一个语言规定好了该语言中都有那些词素,诸如保留字、特殊符号(+-之流)等。在我们做词法分析的时候应该提前了解这些,所幸实验书中给的信息已经十分详尽。
在书中有一个词法分析的状态机,列出了SNL语言所能识别的所有词素。故重点在于实现该状态机。状态机的实现书中给了两种方法,一种是状态转换表,一种使用ifwhile循环来处理,在这里我们选择后者实现。

这里以标识符为例,
这里写图片描述
当遇到字母时应前往右边这个状态,之后遇到无论是字母或数字都是绕一圈再回来,直到遇到其它标识符。故可按如下方法处理

if(ischar(lookhead)){
     string str;//用于存放id
     get_next_char(&lookhead)
         while(ischar(lookhead)||isnum(lookhead)){
             str.append(lookhead);
             get_next_char(&lookhead);
         }
         //注意,遇到了一个非字母或数字的字符,需要回退一个.
         put_back_char(lookhead);
         //注意标识符是否为保留字,当时保留字时,返回为该保留字的词素,
         //若不是则为正常的ID
         Token *t=lookup(str);

}

效果

这里写图片描述

代码见Gitee

  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值