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