我正在尝试使用 Flex + Lemon 编写一个“玩具”解释器,它支持非常基本的“let”语法,其中变量 X 临时绑定到表达式。例如,“letx 3 + 4 in x + 8”应计算为 15。
本质上,我“喜欢”的规则是:
expr(E) ::= LETX expr(N) IN expr(O). {
environment->X = N;
E = O;
}
但这不起作用,因为在分配O
之前进行了评估。X = N
我知道通常的解决方案是中间规则行动。Lemon 没有明确支持这一点,但我在其他地方读到过无论如何都只是语法糖。
因此,我尝试制定一个中期规则行动,X = N
在解释之前完成我的任务O
:
midruleaction ::= /* mid rule */. { environment->X = N; }
expr(E) ::= LETX expr(N) IN midruleaction expr(O). { E = O; }
但这不起作用,因为midruleaction
规则无法访问N
,或者至少我在柠檬文档/示例中看不到。
我想我在这里遗漏了一些东西。我知道我可以建造一棵树,然后再走一遍。我可能最终会这样做,但我想先了解如何更直接地解决这个问题。
有什么建议么?