快乐的解析器规则顺序

发布于 2024-10-20 05:45:55 字数 615 浏览 8 评论 0原文

我遇到了一个使用 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 的语义是否有某些方面我不理解?

I ran into a case using Happy (a Haskell parsing package) where the order of seemingly independent rules affects its behavior in a strange way.

{
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
}

As I understand how Happy works, both of the parses constFoo [Foo] and constBar [Bar] should succeed. However, with the above code, constFoo [Foo] succeeds but constBar [Bar] fails. If I swap the order of the rules for constFoo and constBar, the latter succeeds and the former fails.

Is there some aspect to Happy's semantics that I'm not understanding?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

波浪屿的海角声 2024-10-27 05:45:55

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

%name parser constFoo

这将创建一个名为 parser 的函数,并使用 constFoo 作为开始产生式。

如果您想要 constFoo 和 constBar 的解析器,这似乎是语法:

%name parser1 constFoo
%name parser2 constBar

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

Edited - Happy's syntax allows you to specify the start production with the name directive:

%name parser constFoo

This creates a function called parser and it uses constFoo as the start production.

If you want parsers for both constFoo and constBar, this seems to be the syntax:

%name parser1 constFoo
%name parser2 constBar

I think in your original, both named parser functions (constFoo and constBar) defaulted to the first production in the grammar (constFoo).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文