首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Happy中的解析器

Happy中的解析器
EN

Stack Overflow用户
提问于 2010-06-25 01:22:26
回答 3查看 1.7K关注 0票数 3

我试图用Happy (Haskell工具)做一个解析器,但我得到了一个消息错误:“未使用的规则: 11和未使用的终端: 10”,我不知道这是什么意思。另一方面,我真的不确定在规则的语句中是否使用$i参数,我想我的错误就是因为这个原因。如果有什么能帮到我的话。

EN

回答 3

Stack Overflow用户

发布于 2010-06-26 03:59:54

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

代码语言:javascript
复制
happy --info MyParser.y

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

票数 4
EN

Stack Overflow用户

发布于 2010-06-25 01:38:06

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

$$符号是表示此标记的值的占位符。通常,令牌的值就是令牌本身,但是通过使用$$符号,您可以指定令牌对象的某个组件作为该值。

票数 3
EN

Stack Overflow用户

发布于 2010-07-28 16:07:56

未使用的规则和终端意味着您已经描述了在解析过程中无法达到的规则(非常类似于“如果为真,则1或2",则永远不会达到2分支)。有关更多详细信息,请查看--info的输出。

对于词法分析器,它是一个数据提取器:假设你有一个词法分析器,它产生以下类型的$$:

代码语言:javascript
复制
data TokenType = INT | SYM
data TokenLex = L TokenType String

这里的TokenType是用来区分完整数据和关键字的。

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

代码语言:javascript
复制
%token INTEGER   {L INT $$ }
%token OTHER     {L _  $$}

foo : INTEGER bar INTEGER   { read $1 + read $3 }
  | ...

在这条规则中,$1表示“给我第一个整数的内容”,$3表示“第二个整数的内容”。$2意味着“给我bar的内容(这可能是另一个复杂的规则)。

感谢$$,$1和$3是通用的Haskell字符串,因为我们告诉Happy“整数的内容是”字符串“TokenLex的一部分”,而不是整个令牌。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3112314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档