c语言 - 为什么某些前缀和中缀运算符不包含在"Crafting Interpreters"解析器的解析规则表中?



在Bob Nystrom的Crafting Interpreters中,作者使用函数指针表创建他的解析器,其中主解析函数parsePrecedence()表中查找特定规则并调用表中的函数。这对于一元算术运算符(如否定(或二进制算术运算符(如加法和乘法(是有意义的。但是,一旦全局变量混合在一起,我就不再理解了。例如,为什么函数varDeclaration()不放在表中的TOKEN_VAR槽中?它不算前缀运算符吗?为什么赋值运算符没有插入到表中并被视为中缀运算符?

Nystrom 解释了(在你引用的页面中(赋值运算符在他的解析器中是特殊情况的原因:

我们的字节码 VM 使用单通道编译器。它动态解析和生成字节码,无需任何中间 AST。一旦它识别出一段语法,它就会发出代码。

如果解析器将 AST 构建为中间表示形式,则以相同的泛型方式解析所有运算符不会有问题。但是由于他需要在检测到赋值后立即发出正确的字节码,因此他不能使用通用框架,因为这将发出代码来查找赋值运算符左侧事物的值,并且所需的代码是设置该值的代码。

至于变量声明(以及其他以关键字开头的语句(,可以使用运算符优先级技术来解析它们,但由于关键字后面的语法通常不是表达式,并且由于关键字通常不能用作表达式中的值,因此运算符优先级解析器需要大量特殊大小写才能生成正确的解析。尽管如此,还是有一些语言解析器对所有内容都使用运算符优先级解析,所以这是可能的。但这不一定是最方便的。

最新更新