在实现真实世界(TM)语言时,我经常会遇到这样的情况:
(* language Foo *)
type A = ... (* parsed by parse_A *)
type B = ... (* parsed by parse_B *)
type collection = { as : A list ; bs : B list }
(* parser ParseFoo.mly *)
parseA : ... { A ( ... ) }
parseB : ... { B ( ... ) }
parseCollectionElement : parseA { .. } | parseB { .. }
parseCollection : nonempty_list (parseCollectionElement) { ... }
显然(以函数式风格),最好将部分解析的collection
记录传递给 和 的语义操作的每次调用,parseA
并parseB
相应地更新列表元素。
这甚至可以使用menhir,还是必须使用使用可变全局变量的丑陋技巧?