问题标签 [happy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
138 浏览

parsing - 模棱两可的语法和可能的修复

所以我有这种语言的语法,语法肯定包含一些歧义,但是我发现修复这个语法有点异常困难。下面是该语言的 BNF 语法,下面是我快乐的解析器文件的那部分。

提议语言的 BNF:

解析器

编辑:我在 BNF 格式中添加了箭头,显示了我认为导致语法歧义的原因。

0 投票
1 回答
68 浏览

haskell - Haskell:在 GHC 7.10.3 中使用 Happy 1.19.5 时出现问题

最新版本的 Happy 使用 GHC 7.10.4 给出以下错误消息

没有由实例声明的超类产生的 (Applicative HappyIdentity) 实例

我想我不应该搞砸Happy,但是我该如何解决我的问题呢?

0 投票
0 回答
200 浏览

parsing - 快乐优先函数定义和变量

今天,我一直在努力从解析器中删除所有 s/r 冲突。我设法删除了所有这些,但只有一个。

我的语言的语法应该是类似 haskell 的。而不是 a main,我有一个顶级表达式,即条目。

解析器如下所示。我还添加了 Happy 生成的文件的摘录Parser.info,其中描述了 shift/reduce 冲突。

据我所知,问题是一旦解析器遇到varname一个函数定义,它可能需要两个分支。它可以假设还有更多varname的 s,因为它当前正在解析一个函数定义(它有一个或多个参数),或者它可以停止将其解析为变量表达式。之后的可能varname只是另一种表达方式。

我玩过%prec规则,但似乎没有任何帮助。

我的第一个理由是,鉴于解析器想要转换函数定义,我可以赋予该规则优先级。我还尝试为=运算符(用于函数定义)添加优先级,以便我可以将其置于函数定义的优先级之下,但这也不起作用。我的猜测是我不完全理解解析器是如何工作的。非常感谢任何指针。

一个小的旁注,默认行为 - 我认为因此是一种转变 - 也是所需的行为。

解析器

0 投票
2 回答
289 浏览

parsing - Haskell Happy 解析器不会更进一步

我正在为类似于 Oberon 的语言实现解析器。我已经使用 Alex 成功编写了词法分析器,因为我可以看到词法分析器返回的标记列表是正确的。

当我将标记列表提供给解析器时,它会在第一个标记处停止。

这是我的解析器:

这是我给解析器的测试代码:

这是词法分析器返回的令牌列表:

解析器没有给出任何错误,但它坚持我的 ProcedureDeclaration 规则,只打印 C。

这是输出的样子:

知道为什么吗?


更新:

我已经迈出了第一步,我能够解析之前给出的测试输入。现在我更改了解析器以识别同一级别上的多个过程的声明。为此,我的新解析如下所示:

问题是,它无法编译给我这个错误:

我确定这是由我的ProcedureDeclarationsList规则的第二个元素引起的,但我不明白为什么。

0 投票
1 回答
428 浏览

haskell - Haskell Happy 解析器错误不匹配类型和无限类型

0 投票
1 回答
373 浏览

parsing - 在解析 Happy Haskell 时显示自定义错误

我正在使用 Haskell 中的 Alex 和 Happy 编写一个单子解析器。

我的错误函数定义如下:

如何在解析期间发送自定义错误(例如尝试将字符串添加到数字时的类型不正确)?


更新

解析器不需要进行类型检查,我在生产中进行检查,因为我跟踪操作数类型。正如评论中所说,我不能使用parseError,那么有没有办法打印错误并停止解析器?

0 投票
2 回答
512 浏览

haskell - 语法快乐解析器含义

我在快乐的解析器中有这个语法部分,在快乐的官方网站上给出,但我需要更深入地解释括号中规则的含义。这是令牌定义

这里是语法部分

我的理解是,在文件下面定义的词法分析器应该只生成定义类型的标记,然后使用语法构建解析树。但是“{Let $2 $4 $6}”到底是什么意思?我知道 $2 指的是第二个规则参数,依此类推,但如果有人能给我一个规则的“人工阅读版本”,我会非常高兴。希望我已经清楚了。

提前致谢。

0 投票
1 回答
79 浏览

grammar - 如何从函数调用中删除逗号和括号

在使用快乐解析器编写的函数式语言编译器中,这与 yacc/bison 非常相似,我实现了列表和列表一些核心函数mapconcat并且filter,使用以下规则:

这很好用,但在大多数函数式语言中没有括号或逗号,所以map(myfun, [1,2,3])我宁愿写map myfun [1,2,3]. 语法中明显的修改如下:

但是这个修改包含很多reduce-reduce 冲突。如何在没有逗号和括号的情况下实现函数调用的解析?

我能提取的最小的冲突语法是这样的:

它产生 4 个减少/减少冲突。删除任何规则也会导致冲突。如果您有兴趣,这里是完整的语法。

0 投票
2 回答
232 浏览

haskell - 在 Happy 和 Alex 中推回令牌

我正在解析一种同时具有<和的语言<<。在我的亚历克斯定义中,我有一些包含类似的东西

所以每当我遇到 时<<,它都会被标记为左移而不是小于。这通常是一件好事,因为我最终在标记化后丢弃了空格并想要区分1 < < 21 << 2。然而,还有其他时候我希望<<被读为两个<。例如,我有类似的东西

我想读

显然,我可以尝试调整我的 Happy 解析器规则以适应额外的情况,但这扩展性很差。在其他命令式解析器生成器中,我可能会尝试执行诸如推回令牌的“部分”之类的操作(例如push_back("<")当我遇到<<但我只需要时<)。

有没有其他人遇到过这样的问题,如果有,您是如何处理的?兴欣中是否有“推回”代币的方法?我是否应该尝试保留一个空格标记(我实际上倾向于最后一种选择 - 尽管这是一个非常令人头疼的问题,但它会让我<<通过确保两者之间没有空格来处理<)。

0 投票
1 回答
452 浏览

parsing - 快乐的上下文相关运算符优先级

我这里有两段 Happy 代码,一段使用普通优先规则,另一段使用上下文相关的优先规则(两者都在此处描述)。

普通的:

上下文相关:

给定输入:

普通版给出:

而上下文相关的版本给出:

这两者不应该给出相同的输出吗?我在这里做错了什么导致它们生成不同的解析树?