Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 快乐语法分析器规则顺序_Haskell_Happy - Fatal编程技术网

Haskell 快乐语法分析器规则顺序

Haskell 快乐语法分析器规则顺序,haskell,happy,Haskell,Happy,我遇到了一个使用Happy(Haskell解析包)的案例,其中看似独立的规则的顺序以一种奇怪的方式影响其行为 { module Parser where } %name constFoo %name constBar %tokentype { Token } %error { parseError } %token foo { Foo } bar { Bar } %% constFoo : foo { Foo } constBar : bar

我遇到了一个使用Happy(Haskell解析包)的案例,其中看似独立的规则的顺序以一种奇怪的方式影响其行为

{
module Parser where
}
%name constFoo
%name constBar
%tokentype { Token }
%error { parseError }
%token
    foo          { Foo }
    bar          { Bar }
%%
constFoo : foo { Foo }
constBar : bar { Bar }
{
parseError :: [Token] -> a
parseError _ = error "Parse error"
data Token = Bar | Foo deriving Show
}
正如我所理解的,Happy是如何工作的,解析
constFoo[Foo]
constBar[Bar]
都应该成功。但是,使用上述代码,
constFoo[Foo]
成功,但
constBar[Bar]
失败。如果我将规则的顺序交换为
constFoo
constBar
,后者成功,前者失败


Happy的语义是否有我不理解的地方?

已编辑-Happy的语法允许您使用name指令指定开始生产:

%name parser constFoo
这将创建一个名为parser的函数,并使用constFoo作为开始生成

如果您想同时使用constFoo和constBar的解析器,那么语法如下:

%name parser1 constFoo
%name parser2 constBar

我认为在您的原始版本中,两个命名的解析器函数(constFoo和constBar)都默认为语法中的第一个产品(constFoo)

Edited-Happy的语法允许您使用name指令指定开始生产:

%name parser constFoo
这将创建一个名为parser的函数,并使用constFoo作为开始生成

如果您想同时使用constFoo和constBar的解析器,那么语法如下:

%name parser1 constFoo
%name parser2 constBar

我认为在您的原始版本中,两个命名的解析器函数(constFoo和constBar)都默认为语法中的第一个产品(constFoo)

谢谢,但我不确定这是问题所在;如果我删除了
%name constFoo
,那么constBar会表现出同样奇怪的顺序依赖行为。嗨,犹大-我已经重新计算了我的答案,因为我错过了《快乐手册》。谢谢,但我不确定这是问题所在;如果我删除了
%name constFoo
,那么constBar也会表现出同样奇怪的顺序依赖行为。嗨,犹大-我已经重新计算了我的答案,因为我错过了《快乐手册》的阅读。