> ## Content Index
> Fetch the complete content index at: https://blog.hacking.pub/llms.txt
> Use this file to discover other available public pages before exploring further.

# 语言的流程控制
- URL: https://blog.hacking.pub/2017/06/14/yu-yan-de-liu-cheng-kong-zhi/
- Published: 2017-06-14T18:03:13.000Z
- Updated: 2018-08-07T05:20:34.000Z
- Author: chainhelen
- Tags: 编译器, 解释器, 语言, 控制流程

#### 问题

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

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

#### 图形结合

**没有图！！！**

![语言的流程控制.png](https://blog.hacking.pub/qiniu/%E8%AF%AD%E8%A8%80%E7%9A%84%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6/%E8%AF%AD%E8%A8%80%E7%9A%84%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6.png)

#### 题外话

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

[附件下载](http://imgqi.hacking.pub/%E8%AF%AD%E8%A8%80%E7%9A%84%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6/ctroller-flow.vsdx?ref=blog.hacking.pub)