Menhir上的语义操作

问题描述:

我正在为分配语言构建一个小型编译器。Menhir上的语义操作

考虑以下规则:

var_block : 
    | LPAREN var_decl+ RPAREN { var_scope := var_scope + 1 }; 

是当var_block最初识别语义动作触发,或者它触发一次生产结束时达到(在这种情况下,RPAREN)?

读取整个生产后触发。

+0

感谢您的回复。跟踪包含在不同块和不同存储属性中的对象的声明之间的上下文更改的最佳方式是什么? –

+0

这取决于你正在尝试做什么。一件容易的事情就是将每个产品的语义值作为一个语法树,然后'var_block'产品就会将其子节点列表包装到另一个树节点中,这个树节点标志着范围。 –

你的问题正是你为什么不应该这样做。

不要做生产规则中的顺序敏感的副作用。生产规则应该用来建立一个代表你程序的数据结构。一旦完成,你可以分析/执行/不管它。

+0

谢谢。这个评论在重新思考超越特定问题的方法时非常有用。 –