【问题标题】:What is the fsyacc equivalent for the following ocamlyacc code?以下 ocamlyacc 代码的 fsycc 等效项是什么?
【发布时间】:2011-04-08 21:05:41
【问题描述】:

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

%token <float->float> FNCT

解析器文件在我的F# version 中不断收到错误“错误:解析错误”。我是否在这里遗漏了什么,或者这是 F# 目前不支持的功能?

【问题讨论】:

    标签: f# fsyacc


    【解决方案1】:

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

    如果你只有一个函数(如教程示例中),你应该在前奏中定义一个类型:

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

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

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

    类型中的任何尖括号都会导致解析错误(甚至functionType&lt;float,float&gt;)。

    【讨论】:

    • 我按照您的建议尝试了该方法。它解决了这个问题。谢谢。顺便说一句,在这种情况下,我仍然考虑使用 ocamlyacc 语法,看起来更干净、更自然。
    • 刚刚向 F# 团队发送了错误报告。
    • @Cygwin98 他们修复了这个错误吗?
    【解决方案2】:

    你可能需要放括号,比如

    %token <(float->float)> FNCT
    

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

    【讨论】:

    • 嗨,Brian,我添加了括号,现在错误更改为 Parser.fsy(11,21): error: Unexpected character ')'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多