2 手写词法分析器

2 手写词法分析器

image-20221120173533584

要实现的词法分析器需要识别的词法单元

  1. (红色)关键字,如 if 等自成一个词法单元

  2. (绿色)关系运算符,relop = relation operation,考虑 6 种

  3. (蓝色)标识符 id:由字母和数字组成,且以字母开头

  4. 数字:整型、浮点型(是否为指数形式)

image-20221120174710291

对于 3.14 不会匹配成 3 为一个 REAL,因为匹配是贪婪的,而是会把 3.14 整体匹配成 REAL

image-20221120175442376

Antlr 在不能匹配很长的数字的时候,会返回它能匹配的最长的前缀

比如这里的 123.45E+xyz,先发现 123,匹配整数,又发现 .45,匹配浮点数,再发现 E 匹配带指数的浮点数,但发现 + 后面不是数字,那么会回退到最长能匹配的 123.45,然后继续扫描后面的 E

image-20221120180121624

image-20221120180311263

image-20221120180404210


对所有的词法单元进行分组

G0:

image-20221120180804408

G1:只需要看一个字符就能知道应该去比较哪个词法单元的规则,因为 ID 和 INT 的开头第一个字符是不一样的(ID :由字母和数字组成,且以字母开头

image-20221120180824011

G2:需要看两个字符才能确定,比如看到 <,不能确定是 < 还是 <=

image-20221120181002229

G3:需要向前看任意多个字符才能确定是属于哪个类型

image-20221120181156683

image-20221120200158451

image-20221120200220260

image-20221120201337636

image-20221120201346107

当状态转移复杂时,直接使用 if-else 会导致多层嵌套以及重复的代码,采用下面这种 switch case 状态来处理会更好

image-20221120201414961

在上图的状态图中,14、16、17没有其他的状态转移,如果在 14 遇到一个不是数字的字符,没有状态转移,因此不完整

image-20221122120103508

对于这样的式子,在语法上是错误的,但是对于当前的词法分析,只是会最长识别出 123.45,然后把后面的 E 当作 ID。语法上的报错是交给语法分析来做的

image-20221122132028095

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
  • Copyrights © 2022-2024 zzb
  • RZ
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信