秋来冬风的博客

乘法还是解引用

目录

乘法还是解引用

U语言项目 中 ,实现了一个基于分隔符的词法分析器,文档在 词法分析器设计文档 ,当前 * 将被分析为乘号,在没有指针时,这样没有问题。现在准备给这个项目增加指针,如果按其他语言一样使用 * 解引用,有两种方案

  1. 在构建抽象语法树时处理 * 既可以是乘号又可以解引用的二义性

  2. 在词法分析节点处理 * 既可以是乘号又可以解引用的二义性

如何解决 * 二义性

当编译器看到 一个 * 处理既可以是乘号又可以解引用的二义性,首先没有直接解释为乘号或解引用一种语义的方法,枚举证明

  • 如果直接解释为 乘号 ,对于 *ptr=1 的 *ptr是解引用ptr指针,现在被错误的解释成乘ptr
  • 如果直接解释为 解引用 , 对于 c =a*b 的 *b是乘b,现在被错误的解释成解引用b

所以需要根据不同情况解释 * ,对于 *

  • 如果在开头,因为乘法需要两个操作数,在开头表示左边没有操作数,所以可以解释为解引用
  • 如果不在开头,如果 * 前面不是符号,比如 a+*ptr,因为左边不是操作数,所以可以解释为解引用
  • 如果不在开头,如果 * 是符号,比如 a*b,因为左边是操作数,所以可以解释为乘号

上述处理方法在词法分析或构建抽象语法树,都可以,但是在词法分析的时候通过一个布尔变量,在发现乘号时设置为true,在末尾判断如果布尔变量为true则按上述方法处理乘号,对于没有乘号的部分只增加一次判断的开销。

更简单的办法

如果* 有二义性,除了处理二义性还可以找一个没有二义性的符号,比如@,然后编译器看到@就可以直接的识别为解引用,只不过这样和主流做法有区别,可能增加学习成本

Tags: