我正在尝试实现一个具有扩展解析功能的库。我决定使用 fsyacc 因为我从大学就知道它。不幸的是我遇到了以下问题。
我为我的语法头部定义了一个类(Head)并将其实现放在一个文件中。然后我将解析器定义为:
...
%start head
%type <Head> head
...
Fsyacc 生成分离的模块(Parser)。为了成功,必须按以下顺序编译:Head.fs
Parser.fs
为了使这个库类似于您在 .NET 中可以找到的库,我想添加一个静态Parse方法Head。不幸的是我需要使用以下方法Parser module.
我知道这样的类型依赖可以用 ' 解决and' 运算符,但它仅适用于一个文件中定义的类型。
是否有其他方法可以创建相互依赖的类型,即使它们位于单独的文件中?我一直在寻找类似于 C/C++ 中的声明/实现分离机制,但我找不到任何东西。
简短的回答:不。 F# 2.0 中无法跨多个文件执行相互递归实体。 (这是我们计划在该语言的下一版本中解决的问题。)
您可以通过多种方式解决此问题,通常使用间接点和突变点。例如,您的 Head 类型可能有一个静态“InitializeParser”方法,该方法将函数值放入可变全局变量中,然后 Head 中定义的静态 Parse 方法可以通过该可变全局调用,并且在实际定义解析器之后,它可以去调用InitializeParser来插入值。(如果这没有意义,我可以更详细地拼写出来。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)