【发布时间】:2010-06-24 17:22:26
【问题描述】:
我正在尝试使用 Happy(Haskell 工具)进行解析,但我收到一条消息错误:“未使用的规则:11 和未使用的终端:10”,我不知道这意味着什么。另一方面,我真的不确定在规则语句中使用 $i 参数,我认为我的错误是因为这个。如果有任何可以帮助我...
【问题讨论】:
我正在尝试使用 Happy(Haskell 工具)进行解析,但我收到一条消息错误:“未使用的规则:11 和未使用的终端:10”,我不知道这意味着什么。另一方面,我真的不确定在规则语句中使用 $i 参数,我认为我的错误是因为这个。如果有任何可以帮助我...
【问题讨论】:
如果您收到这些消息,这不是错误,它只是意味着您的部分语法未使用,因为它无法从开始符号访问。要查看有关 Happy 如何理解您的语法的更多信息,请使用 --info 标记 Happy:
happy --info MyParser.y
除了通常的MyParser.hs之外,还会生成一个文件MyParser.info。
【讨论】:
如果我没记错的话,未使用的规则和终端是语法的一部分,无法从顶级解析语句中获得它们。要了解如何使用 $$ 参数,请阅读happy user guide。
$$ 符号是一个占位符 代表这个令牌的价值。 通常令牌的价值是 令牌本身,但通过使用 $$ 可以指定一些组件的符号 令牌对象的值。
【讨论】:
未使用的规则和终端意味着您已经描述了在解析期间无法到达的规则(很像“如果为真,则为 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。
【讨论】: