跟踪编译器中 AST 节点的源位置 (ocaml)

2024-02-15

我正在使用 ocamllex/yacc 在 ocaml 中编写编译器。一切进展顺利,但我遇到了设计问题。对于我创建的每个 AST 节点,最好能获得有关源代码中该节点的行/字符位置的信息。这对于稍后向用户提供错误消息很有用。

现在,我可以向我的节点添加某种元类型:

type node = Node1 of ... * meta | Node2 of ... * meta

但这似乎是多余的。稍后,当我验证完 AST 后,我必须写

match n with 
| NodeX(..., _) -> ...

在每一个match这是浪费空间。

解决这个问题的最佳方法是什么?


解决这个问题的通常方法是使用记录来保存元信息和节点表达式:

type node_exp = Node1 of ... | Node2 of ...
and node = { exp: node_exp; meta: meta }

进而:

match n.exp with
  | NodeX ... -> ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跟踪编译器中 AST 节点的源位置 (ocaml) 的相关文章

随机推荐