Compiler construction 如何跟踪编译器环境

Compiler construction 如何跟踪编译器环境,compiler-construction,f#,Compiler Construction,F#,我没有太多的编译器经验,但我最终不得不写一个。我正在使用FParsec作为解析器,现在正在使用计算器。我(我认为)采取了一种相当典型的方法。我有一个eval函数,它接受一个环境和一个AST节点。环境是一种持久类型,因为它因范围而异。这需要eval,它的助手返回env*node,所有传递的环境都开始变得笨拙 处理这个问题的标准方法是什么?我开始认为拥有一个由每个作用域变异的共享环境会更干净,但如果可能的话,我希望避免这种情况。您可以使用状态单子,作为使用副作用的替代方案,为了避免大多数语法管道。你

我没有太多的编译器经验,但我最终不得不写一个。我正在使用FParsec作为解析器,现在正在使用计算器。我(我认为)采取了一种相当典型的方法。我有一个
eval
函数,它接受一个环境和一个AST节点。环境是一种持久类型,因为它因范围而异。这需要
eval
,它的助手返回
env*node
,所有传递的环境都开始变得笨拙


处理这个问题的标准方法是什么?我开始认为拥有一个由每个作用域变异的共享环境会更干净,但如果可能的话,我希望避免这种情况。

您可以使用状态单子,作为使用副作用的替代方案,为了避免大多数语法管道。

你认为这会简化编译器中的事情吗?我没有足够的经验尝试这两种方法来获得强烈的意见。我认为工作流有一些语法限制,但不记得它们是什么。