2

我正在尝试使用 flex 和 bison 编写自己的脚本语言。我有一个基本的解析器,我想添加一个与 C 语言 for 语句非常相似的 for 语句。我不清楚如何编写与 for 语句关联的操作

假设我对“for”语句有以下产生式:

forStatement: FOR '(' expr ';' expr ';' expr ')' statements END; {}

我不清楚在与此制作相关的动作中要做什么。

直觉上我明白我应该做一些事情,在与前一个语句相关的动作中,例如:

evaluate($3);
while(evaluate($5)) { execute($9); evaluate($7); }
evaluate($7);

其中评估和执行是两个 C 函数。

所以我有两个问题(假设为与语法产生相关的动作编写 C 代码):

  1. “评估”的任务是什么。我的意思是,考虑到表达式的值在循环的每一步都可能发生变化,我如何在每个循环中评估表达式?
  2. “执行”的任务是什么。我的意思是,考虑到每个语句在循环的每一步都有不同的结果,我如何评估 for 循环中的语句。

三个表达式 'expr' 的值在运行时会发生变化,对于 for 主体内的语句也是如此。

4

2 回答 2

2

查看您的两个问题,您似乎错过了需要执行引擎(一种软件 CPU)。该引擎需要记住变量的状态,返回循环的“地址”,......(取决于选择的实现方法)。

所以解析只是第一步。考虑为每个语句和表达式创建一个数据结构,并让这些由该引擎执行。

看看基于堆栈的系统

于 2013-09-30T06:58:50.163 回答
1

这是一个常见问题解答,不仅在 SO 中,而且在 Bison 中。请阅读文档:http ://www.gnu.org/software/bison/manual/html_node/Implementing-Gotos_002fLoops.html

于 2013-03-25T06:13:11.600 回答