语言的流程控制
问题
最近在写一个解释器,碰到一个关于控制流程问题,有感而发
起初我按照bnf范式写了一堆生成抽象语法树的代码,在eval.java
中准备从tree root
出发进行遍历计算每一个表达式(解释语句)。其中有一个核心函数recursionEvalAstNode
每次递归传入每个节点(的子节点)。所以函数这个参数就是树上的节点parentAstNode
。那么问题来了
包含一些控制流程的语句(break
、continue
、return
,但if
不是很明显)
比如说的return statement
,一旦执行到这里,就应该退回wrap-function
执行的地方,并把返回节点interpret result
(可能是含有子节点的expression节点)存储在栈
或者寄存器
里"带出去",另一方面上叙采用的是用递归计算方式,return statment
的同级 next sibling node
还在上一层的递归里面呢,怎么告诉上一层它不用算了
图形结合
没有图!!!
题外话
这里可以看到,我在设计recursionEvalAstNode
其实只想到了context-free-grammer
,然而到了interpret
层面,语言怎么可能是context-free-grammer
,一定是context-sensitive-grammer
,所以单纯只传入参数parentAstNode
而没有带入上下文关系,一定是有问题的
从这点上来看,其实栈
或者寄存器
某种意义上也可以看做是上下文的一部分
另外,context
和scope
的区别,我觉得最主要的是前者强调文法(grammer
),后者强调语义(semantics
)