



程序本质上是递归的。例如,一个表达式通常由更小的表达式组成。因此,处理整个程序的自然方法是使用递归函数。作为递归函数的第一个例子,我们定义函数is_exp,如图1.3所示,该函数取任意一个值并判断它是否是
L
Int
中的表达式。如果函数是使用与语法匹配情形相对应的序列定义的,并且每个case用例的主体对每个子节点进行递归调用,那么我们就说函数是通过
结构化递归
定义的。
我们定义了第二个名为is_stmt的函数,该函数用于识别值是否为一个
L
Int
中的语句。最后,在图1.3中包含了is_Lint的定义,它判定AST是否为
L
Int
语言的程序。一般来说,我们可以编写一个递归函数来处理语法中的每个非终结符。在图底部的两个例子中,第一个是
L
Int
中的语句,第二个不是。
图1.3 L Int 语言递归函数示例,这些函数识别AST是否在 L Int 中