我试图用Happy (Haskell工具)做一个解析器,但我得到了一个消息错误:“未使用的规则: 11和未使用的终端: 10”,我不知道这是什么意思。另一方面,我真的不确定在规则的语句中是否使用$i参数,我想我的错误就是因为这个原因。如果有什么能帮到我的话。
发布于 2010-06-26 03:59:54
如果你收到这些消息,这并不是一个错误,它只是意味着你的语法的一部分没有被使用,因为它不能从开始符号到达。要查看有关Happy如何理解您的语法的更多信息,请使用--info标记Happy:
happy --info MyParser.y除了通常的MyParser.hs之外,它还会生成一个文件MyParser.info。
发布于 2010-06-25 01:38:06
未使用的规则和终端是语法的一部分,如果我没记错的话,无法从顶层解析语句中找到它们。要了解如何使用$$参数,请阅读happy user guide。
$$符号是表示此标记的值的占位符。通常,令牌的值就是令牌本身,但是通过使用$$符号,您可以指定令牌对象的某个组件作为该值。
发布于 2010-07-28 16:07:56
未使用的规则和终端意味着您已经描述了在解析过程中无法达到的规则(非常类似于“如果为真,则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表示“给我第一个整数的内容”,$3表示“第二个整数的内容”。$2意味着“给我bar的内容(这可能是另一个复杂的规则)。
感谢$$,$1和$3是通用的Haskell字符串,因为我们告诉Happy“整数的内容是”字符串“TokenLex的一部分”,而不是整个令牌。
https://stackoverflow.com/questions/3112314
复制相似问题