【问题标题】:Parser in HappyHappy中的解析器
【发布时间】:2010-06-24 17:22:26
【问题描述】:

我正在尝试使用 Happy(Haskell 工具)进行解析,但我收到一条消息错误:“未使用的规则:11 和未使用的终端:10”,我不知道这意味着什么。另一方面,我真的不确定在规则语句中使用 $i 参数,我认为我的错误是因为这个。如果有任何可以帮助我...

【问题讨论】:

    标签: parsing haskell happy


    【解决方案1】:

    如果您收到这些消息,这不是错误,它只是意味着您的部分语法未使用,因为它无法从开始符号访问。要查看有关 Happy 如何理解您的语法的更多信息,请使用 --info 标记 Happy:

    happy --info MyParser.y
    

    除了通常的MyParser.hs之外,还会生成一个文件MyParser.info

    【讨论】:

    • 谢谢,我会尝试的:)
    【解决方案2】:

    如果我没记错的话,未使用的规则和终端是语法的一部分,无法从顶级解析语句中获得它们。要了解如何使用 $$ 参数,请阅读happy user guide

    $$ 符号是一个占位符 代表这个令牌的价值。 通常令牌的价值是 令牌本身,但通过使用 $$ 可以指定一些组件的符号 令牌对象的值。

    【讨论】:

    • 但是 $i 参数是什么意思?我正在阅读用户指南,但它所说的唯一内容是 $i 参数的“i”必须比产生式右侧的符号数短......但我已经看到了一些例子和什么我得到的是每个 $i 符号对应于一种对象或表达式
    • 所以你告诉我,当我编译 file.y 并显示未使用的规则消息时,可以吗?
    【解决方案3】:

    未使用的规则和终端意味着您已经描述了在解析期间无法到达的规则(很像“如果为真,则为 1,否则为 2”,永远不会到达 2 分支)。 查看 --info 的输出了解更多详情。

    对于 $$ 来说,它是一个数据提取器:假设您有一个生成令牌的词法分析器 属于以下类型:

    data TokenType = INT | SYM
    data TokenLex = L TokenType String
    

    这里 TokenType 用来区分有用的数据和关键字。

    在解析器的动作中,您可以使用 $$ 提取字符串部分

    %token INTEGER   {L INT $$ }
    %token OTHER     {L _  $$}
    
    foo : INTEGER bar INTEGER   { read $1 + read $3 }
      | ...
    

    在此规则中,$1 表示“给我第一个 INTEGER 的内容”,而 $3 表示“第二个 INTEGER 的内容”。 $2 的意思是“给我 bar 的内容(这可能是另一个复杂的规则)。

    感谢 $$,$1 和 $3 是真正的 Haskell 字符串,因为我们告诉 Happy “INTEGER 的内容是 TokenLex 的“字符串”部分”,而不是整个 Token。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多