Happy 中的解析器
我正在尝试使用 Happy (Haskell Tool)做一个解析器,但我收到一条消息错误:“未使用的规则:11 和未使用的终端:10”,我不知道这意味着什么。另一方面,我真的不确定规则语句中 $i 参数的使用,我认为我的错误就是因为这个。如果有的话可以帮助我...
I'm trying to do a parser with Happy (Haskell Tool) But I'm getting a message error: "unused ruled: 11 and unused terminals: 10" and I don't know what this means. In other hand I'm really not sure about the use of $i parameters in the statements of the rules, I think my error is because of that. If any can help me...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您收到这些消息,这并不是一个错误,它只是意味着您的语法的一部分未使用,因为它无法从起始符号访问。要查看有关 Happy 如何理解语法的更多信息,请使用 Happy 的
--info
标志:除了通常的
MyParser 之外,它还会生成一个文件
。MyParser.info
.hsIt's not an error if you get these messages, it just means that part of your grammar is unused because it is not reachable from the start symbol. To see more information about how Happy understands your grammar, use the
--info
flag to Happy:which generates a file
MyParser.info
in addition to the usualMyParser.hs
.如果我没记错的话,未使用的规则和终端是语法的一部分,无法从顶级解析语句到达它们。要了解如何使用 $$ 参数,请阅读快乐用户指南。
Unused rules and terminals are parts of your grammar for which there is no way to reach from the top level parse statements, if I recall correctly. To see how to use the $$ parameters, read the happy user guide.
未使用的规则和终端意味着您描述了在解析期间无法到达的规则(非常类似于“if true then 1 else 2”,永远不会到达 2 分支)。
检查 --info 的输出以获取更多详细信息。
对于 $$ 事物,它是一个数据提取器:假设您有一个生成令牌的词法分析器
以下类型:
其中 TokenType 在这里用于区分有用数据和关键字。
在解析器的操作中,您可以使用 $$ 提取字符串部分。
在此规则中,$1 表示“给我第一个 INTEGER 的内容”,$3 表示“第二个 INTEGER 的内容”。 $2 表示“给我 bar 的内容(这可能是另一个复杂的规则)。
感谢 $$,$1 和 $3 是天才的 Haskell 字符串,因为我们告诉 Happy “INTEGER 的内容是 TokenLex 的“字符串”部分”,而不是整个令牌。
Unused rules and terminals means you have described rules that can't be reached during parsing (pretty much like "if true then 1 else 2", the 2 branch will never be reached).
Check the output of --info for more details.
For the $$ thing, it is a data extractor: let's say you have a lexer that produces token
of the following type:
where TokenType is here to distinguish usefull data and keywords.
In the action of your parser, you can extract the String part by using $$
In this rule, $1 means "give me the content of the first INTEGER" and $3 "the content of the second INTEGER". $2 means "give me the content of bar (which may be another complex rule).
Thanks to $$, $1 and $3 are geniune Haskell String because we told Happy that "the content of an INTEGER is the "String" part of the TokenLex", not the whole Token.