以下是ocamlyacc代码的fsyacc等效代码是什么?

3
我正在使用F#制作一个玩具编译器,即FsLex和FsYacc的组合。为了熟悉它们,我已经阅读了Expert F# (v2)书籍中的Lexer/Parser章节(顺便说一句,这是一本好书)。现在,我已经完成了备受推荐的ocamlyacc教程的一半,并卡在了最后一个例子Multi-Function Calculator mfcalc。特别是以下语句。
%token <float->float> FNCT

在我的F#版本中,解析器文件一直出现“错误:解析错误”的错误。我有什么遗漏了吗?还是这是F#当前不支持的功能?
2个回答

4
这似乎是一个bug。加括号也没有帮助。我尝试了各种解决方法,但没有找到干净的方法。你应该提交一个错误报告。
如果您只有一个函数(就像教程示例中一样),您应该在预定义中定义一个类型:
type floatFunction = float -> float
...
%token <floatFunction> FNCT

如果您有许多功能,您也可以定义一个通用类型:
type functionType<'a, 'b> = 'a -> 'b
...
%token < ('a, 'b) functionType > FNCT

任何类型中的尖括号都会导致解析错误(即使是functionType<float,float>)。

我尝试了你建议的方法,问题得到了解决。谢谢。顺便说一句,在这种情况下,我仍然认为ocamlyacc语法更加清晰自然。 - Cygwin98
刚刚向 F# 团队发送了一个错误报告。 - Cygwin98
@Cygwin98 他们修复了这个 bug 吗? - J D

0
你可能需要加上圆括号,例如
%token <(float->float)> FNCT

我忘记了(离开了F#机器无法检查)。


嗨,Brian,我添加了括号,现在错误变成了Parser.fsy(11,21):错误:意外字符“)”。 - Cygwin98

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接