语言的流程控制

问题

最近在写一个解释器,碰到一个关于控制流程问题,有感而发
起初我按照bnf范式写了一堆生成抽象语法树的代码,在eval.java中准备从tree root出发进行遍历计算每一个表达式(解释语句)。其中有一个核心函数recursionEvalAstNode每次递归传入每个节点(的子节点)。所以函数这个参数就是树上的节点parentAstNode。那么问题来了

包含一些控制流程的语句(breakcontinuereturn,但if不是很明显)
比如说的return statement,一旦执行到这里,就应该退回wrap-function执行的地方,并把返回节点interpret result(可能是含有子节点的expression节点)存储在或者寄存器里"带出去",另一方面上叙采用的是用递归计算方式,return statment的同级 next sibling node还在上一层的递归里面呢,怎么告诉上一层它不用算了

图形结合

没有图!!!

语言的流程控制.png

题外话

这里可以看到,我在设计recursionEvalAstNode其实只想到了context-free-grammer,然而到了interpret层面,语言怎么可能是context-free-grammer,一定是context-sensitive-grammer,所以单纯只传入参数parentAstNode而没有带入上下文关系,一定是有问题的
从这点上来看,其实或者寄存器某种意义上也可以看做是上下文的一部分
另外,contextscope的区别,我觉得最主要的是前者强调文法(grammer),后者强调语义(semantics

附件下载