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

发布于 2024-10-31 06:16:00 字数 513 浏览 6 评论 0原文

我正在使用 F# 开发一个玩具编译器,即 FsLex 和 FsYacc 的组合。为了熟悉它们,我阅读了 Expert F# (v2) 一书(顺便说一句,一本好书)的 Lexer/Parser 章节。现在,我已经完成了推荐的 ocamlyacc 教程的一半,并停留在最后一个示例多功能计算器 mfcalc。 以下语句

%token <float->float> FNCT

特别是,解析器文件中的 在我的 F# 版本 中不断出现错误“error: parse error”。我是否在这里遗漏了任何内容,或者 F# 目前不支持此功能?

I'm working on a toy compiler using F#, i.e., the combo of FsLex and FsYacc. To get familiar with them, I've read the Lexer/Parser chapter of Expert F# (v2) book (a good book btw). Right now, I've half way through the well-recommended ocamlyacc tutorial, and stuck at the last example Multi-Function Calculator mfcalc. Particularly, the following statement

%token <float->float> FNCT

in the parser file keeps getting error "error: parse error" in my F# version. Am I missing anything here, or is this a feature currently not supported by F#?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

扎心 2024-11-07 06:16:00

这看起来像一个错误。添加括号没有帮助。我尝试了各种解决方法,但找不到干净的方法。你应该做一份错误报告。

如果你只有一个函数(就像教程中的例子),你应该在序言中定义一个类型:

type floatFunction = float -> float
...
%token <floatFunction> FNCT

如果你有很多函数,你也可以定义一个泛型类型:

type functionType<'a, 'b> = 'a -> 'b
...
%token < ('a, 'b) functionType > FNCT

类型中的任何尖括号都会导致解析错误(甚至functionType)。

This looks like a bug. Adding parens doesn't help. I have tried various workarounds, but I couldn't find a clean way. You should do a bug report.

If you have only one function (like in the tutorial example), you should define a type in the prelude:

type floatFunction = float -> float
...
%token <floatFunction> FNCT

If you have many functions, you could also define a generic type:

type functionType<'a, 'b> = 'a -> 'b
...
%token < ('a, 'b) functionType > FNCT

Any angle bracket in the type leads to a parse error (even functionType<float,float>).

一袭白衣梦中忆 2024-11-07 06:16:00

你可能需要加上括号,就像

%token <(float->float)> FNCT

我忘记的那样(我远离 F# 机器来检查)。

You might need to put parens, like

%token <(float->float)> FNCT

I forget (am away from an F# machine to check).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文