解析器在快乐

时间:2010-06-24 17:22:26

标签: parsing haskell happy

我正在尝试用Happy(Haskell工具)做一个解析器但是我收到一条消息错误:“未使用的统治:11和未使用的终端:10”我不知道这意味着什么。另一方面,我真的不确定在规则的陈述中使用$ i参数,我认为我的错误就是因为这个。如果有人可以帮助我......

3 个答案:

答案 0 :(得分:4)

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

happy --info MyParser.y

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

答案 1 :(得分:3)

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

  

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

答案 2 :(得分:1)

未使用的规则和终端意味着您已经描述了在解析过程中无法达到的规则(非常类似于“if true then 1 else 2”,永远不会达到2分支)。 检查--info的输出以获取更多详细信息。

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

data TokenType = INT | SYM
data TokenLex = L TokenType String

其中TokenType用于区分有用的数据和关键字。

在解析器的操作中,您可以使用$$

提取String部分
%token INTEGER   {L INT $$ }
%token OTHER     {L _  $$}

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

在此规则中,$ 1表示“给我第一个INTEGER的内容”,$ 3表示“第二个INTEGER的内容”。 2美元的意思是“给我酒吧的内容(这可能是另一个复杂的规则)。

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