Happy 中的解析器

发布于 2024-09-07 02:10:03 字数 140 浏览 12 评论 0原文

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

I'm trying to do a parser with Happy (Haskell Tool) But I'm getting a message error: "unused ruled: 11 and unused terminals: 10" and I don't know what this means. In other hand I'm really not sure about the use of $i parameters in the statements of the rules, I think my error is because of that. If any can help me...

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

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

发布评论

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

评论(3

千仐 2024-09-14 02:10:03

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

happy --info MyParser.y

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

It's not an error if you get these messages, it just means that part of your grammar is unused because it is not reachable from the start symbol. To see more information about how Happy understands your grammar, use the --info flag to Happy:

happy --info MyParser.y

which generates a file MyParser.info in addition to the usual MyParser.hs.

_蜘蛛 2024-09-14 02:10:03

如果我没记错的话,未使用的规则和终端是语法的一部分,无法从顶级解析语句到达它们。要了解如何使用 $$ 参数,请阅读快乐用户指南

$$ 符号是一个占位符
代表这个代币的价值。
通常,令牌的值是
令牌本身,但通过使用 $$
您可以指定某些组件的符号
令牌对象的值作为值。

Unused rules and terminals are parts of your grammar for which there is no way to reach from the top level parse statements, if I recall correctly. To see how to use the $$ parameters, read the happy user guide.

The $$ symbol is a placeholder that
represents the value of this token.
Normally the value of a token is the
token itself, but by using the $$
symbol you can specify some component
of the token object to be the value.

甜心 2024-09-14 02:10:03

未使用的规则和终端意味着您描述了在解析期间无法到达的规则(非常类似于“if true then 1 else 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 表示“给我第一个 INTEGER 的内容”,$3 表示“第二个 INTEGER 的内容”。 $2 表示“给我 bar 的内容(这可能是另一个复杂的规则)。

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

Unused rules and terminals means you have described rules that can't be reached during parsing (pretty much like "if true then 1 else 2", the 2 branch will never be reached).
Check the output of --info for more details.

For the $$ thing, it is a data extractor: let's say you have a lexer that produces token
of the following type:

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

where TokenType is here to distinguish usefull data and keywords.

In the action of your parser, you can extract the String part by using $$

%token INTEGER   {L INT $ }
%token OTHER     {L _  $}

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

In this rule, $1 means "give me the content of the first INTEGER" and $3 "the content of the second INTEGER". $2 means "give me the content of bar (which may be another complex rule).

Thanks to $$, $1 and $3 are geniune Haskell String because we told Happy that "the content of an INTEGER is the "String" part of the TokenLex", not the whole Token.

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