购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3
模式匹配

如1.1节所述,编译器经常需要访问AST节点的各个部分。Racket提供了match特性来访问相关值的各个部分。考虑下面的例子:

在本例中,match形式检查(1.1)的AST是否为二元操作符,并将其部分绑定到三个模式变量op、child1和child2上。一般来说,match子句由 模式 子句体 组成。模式被递归地定义为一个模式变量,一个结构名后面跟着每个结构参数的模式,或者一个S-表达式(一个符号、列表等)。(参见《Racket指南》 第12章和《Racket参考》 第9章对match的完整描述。)match子句的子句体可以包含任意的Racket代码。模式变量可以在子句体的作用域中使用,例如op用于(print op)中。

match形式可以包含多个子句,如下面的函数leaf,它识别AST中的 L Int 节点何时为叶子节点。匹配按照子句的顺序进行,检查模式是否与输入的AST相匹配,执行第一个匹配子句的子句体。下面的右侧显示了leaf对几个AST产生的输出:

在构造match表达式时,我们参考语法定义来确定我们希望匹配哪个非终结符,然后确保该非终结符的每个选项都有一个子句,每个子句中的模式对应相关语法规则的右侧。对于leaf函数中的匹配,我们参考图1.2中所示的 L Int 语言语法。 exp 非终结符有四个候选项,因此match有四个子句。每个子句中的模式对应于语法规则的右侧。例如,模式(Prim '+(list e1 e2))对应于右侧(Prim '+(exp exp))。在将语法转换为模式时,将 exp 等非终结符替换为所选择的模式变量(例如e1和e2)。 t+C286KMPxvBXm/7fg2CyG5Zw0vtMjYhUv6Q/Z9GgC1tWYYGQ0vaSt6fssv6t4Qs

点击中间区域
呼出菜单
上一章
目录
下一章
×