问题标签 [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.
parsing - 模棱两可的语法和可能的修复
所以我有这种语言的语法,语法肯定包含一些歧义,但是我发现修复这个语法有点异常困难。下面是该语言的 BNF 语法,下面是我快乐的解析器文件的那部分。
提议语言的 BNF:
解析器
编辑:我在 BNF 格式中添加了箭头,显示了我认为导致语法歧义的原因。
haskell - Haskell:在 GHC 7.10.3 中使用 Happy 1.19.5 时出现问题
最新版本的 Happy 使用 GHC 7.10.4 给出以下错误消息
没有由实例声明的超类产生的 (Applicative HappyIdentity) 实例
我想我不应该搞砸Happy,但是我该如何解决我的问题呢?
parsing - 快乐优先函数定义和变量
今天,我一直在努力从解析器中删除所有 s/r 冲突。我设法删除了所有这些,但只有一个。
我的语言的语法应该是类似 haskell 的。而不是 a main
,我有一个顶级表达式,即条目。
解析器如下所示。我还添加了 Happy 生成的文件的摘录Parser.info
,其中描述了 shift/reduce 冲突。
据我所知,问题是一旦解析器遇到varname
一个函数定义,它可能需要两个分支。它可以假设还有更多varname
的 s,因为它当前正在解析一个函数定义(它有一个或多个参数),或者它可以停止将其解析为变量表达式。之后的可能varname
只是另一种表达方式。
我玩过%prec
规则,但似乎没有任何帮助。
我的第一个理由是,鉴于解析器想要转换函数定义,我可以赋予该规则优先级。我还尝试为=
运算符(用于函数定义)添加优先级,以便我可以将其置于函数定义的优先级之下,但这也不起作用。我的猜测是我不完全理解解析器是如何工作的。非常感谢任何指针。
一个小的旁注,默认行为 - 我认为因此是一种转变 - 也是所需的行为。
解析器
parsing - Haskell Happy 解析器不会更进一步
我正在为类似于 Oberon 的语言实现解析器。我已经使用 Alex 成功编写了词法分析器,因为我可以看到词法分析器返回的标记列表是正确的。
当我将标记列表提供给解析器时,它会在第一个标记处停止。
这是我的解析器:
这是我给解析器的测试代码:
这是词法分析器返回的令牌列表:
解析器没有给出任何错误,但它坚持我的 ProcedureDeclaration 规则,只打印 C。
这是输出的样子:
知道为什么吗?
更新:
我已经迈出了第一步,我能够解析之前给出的测试输入。现在我更改了解析器以识别同一级别上的多个过程的声明。为此,我的新解析如下所示:
问题是,它无法编译给我这个错误:
我确定这是由我的ProcedureDeclarationsList
规则的第二个元素引起的,但我不明白为什么。
parsing - 在解析 Happy Haskell 时显示自定义错误
我正在使用 Haskell 中的 Alex 和 Happy 编写一个单子解析器。
我的错误函数定义如下:
如何在解析期间发送自定义错误(例如尝试将字符串添加到数字时的类型不正确)?
更新
解析器不需要进行类型检查,我在生产中进行检查,因为我跟踪操作数类型。正如评论中所说,我不能使用parseError
,那么有没有办法打印错误并停止解析器?
haskell - 语法快乐解析器含义
我在快乐的解析器中有这个语法部分,在快乐的官方网站上给出,但我需要更深入地解释括号中规则的含义。这是令牌定义
这里是语法部分
我的理解是,在文件下面定义的词法分析器应该只生成定义类型的标记,然后使用语法构建解析树。但是“{Let $2 $4 $6}”到底是什么意思?我知道 $2 指的是第二个规则参数,依此类推,但如果有人能给我一个规则的“人工阅读版本”,我会非常高兴。希望我已经清楚了。
提前致谢。
grammar - 如何从函数调用中删除逗号和括号
在使用快乐解析器编写的函数式语言编译器中,这与 yacc/bison 非常相似,我实现了列表和列表一些核心函数map
,concat
并且filter
,使用以下规则:
这很好用,但在大多数函数式语言中没有括号或逗号,所以map(myfun, [1,2,3])
我宁愿写map myfun [1,2,3]
. 语法中明显的修改如下:
但是这个修改包含很多reduce-reduce 冲突。如何在没有逗号和括号的情况下实现函数调用的解析?
我能提取的最小的冲突语法是这样的:
它产生 4 个减少/减少冲突。删除任何规则也会导致冲突。如果您有兴趣,这里是完整的语法。
haskell - 在 Happy 和 Alex 中推回令牌
我正在解析一种同时具有<
和的语言<<
。在我的亚历克斯定义中,我有一些包含类似的东西
所以每当我遇到 时<<
,它都会被标记为左移而不是小于。这通常是一件好事,因为我最终在标记化后丢弃了空格并想要区分1 < < 2
和1 << 2
。然而,还有其他时候我希望<<
被读为两个<
。例如,我有类似的东西
我想读
显然,我可以尝试调整我的 Happy 解析器规则以适应额外的情况,但这扩展性很差。在其他命令式解析器生成器中,我可能会尝试执行诸如推回令牌的“部分”之类的操作(例如push_back("<")
当我遇到<<
但我只需要时<
)。
有没有其他人遇到过这样的问题,如果有,您是如何处理的?兴欣中是否有“推回”代币的方法?我是否应该尝试保留一个空格标记(我实际上倾向于最后一种选择 - 尽管这是一个非常令人头疼的问题,但它会让我<<
通过确保两者之间没有空格来处理<
)。
parsing - 快乐的上下文相关运算符优先级
我这里有两段 Happy 代码,一段使用普通优先规则,另一段使用上下文相关的优先规则(两者都在此处描述)。
普通的:
上下文相关:
给定输入:
普通版给出:
而上下文相关的版本给出:
这两者不应该给出相同的输出吗?我在这里做错了什么导致它们生成不同的解析树?