问题标签 [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 - Haskell - 快乐的解析器错误
我正在开发一个使用 Happy 解析器生成器的项目。这是我到目前为止所做的:
问题是我收到以下错误:
你知道我该如何解决这个问题吗?
更新:我解决了它,但现在它只有在我写“sqrt2”时才有效(sqrt 和 2 之间没有空格);如果我写“sqrt 2”,我会得到“解析错误”。
这就是我在 Alex(lex) 文件中的内容:
parsing - Haskell - Happy,数学表达式和变量解析器
我正在开发一个快乐的数学表达式和变量解析器。问题是我不知道如何保存变量的值并在以后使用它。有任何想法吗?
这就是我识别表达式和变量赋值的方式:
一个表达式可以包含一个变量。例如:
我需要在解析器解析行'a = 2 + 1'时保存变量'a'的值,并在解析器解析行'a + 2'时获取变量'a'的值
xml - 如何使用 Alex 和 Happy 对 XML 电子邮件消息进行 Lex、解析和序列化
我正在努力输入任何电子邮件并输出等效的 XML 编码。
我从小处着手,使用其中一个电子邮件标头——“发件人标头”
以下是 From Header 的示例:
我希望它转换成这个 XML:
我想使用词法分析器“Alex”(http://www.haskell.org/alex/doc/html/)来分解(标记)From Header。
我想使用解析器“Happy”(http://www.haskell.org/happy/)来处理标记并生成解析树。
然后我想使用序列化程序来遍历解析树并输出 XML。
From Header 的格式由 Internet 消息格式 (IMF)、RFC 5322 ( https://www.rfc-editor.org/rfc/rfc5322 ) 指定。
以下是 From Headers 和所需 XML 输出的更多示例:
从没有显示名称的标题:
所需的 XML 输出:
来自没有显示名称且地址周围没有尖括号的标题:
所需的 XML 输出:
来自具有多个邮箱的 Header,每个邮箱用逗号分隔:
所需的 XML 输出:
RFC 5322 说注释的语法是:( … )。这是一个包含评论的 From Header:
我希望在词法分析期间删除所有评论。
所需的 XML 输出是这样的:
RFC 说,可以在 From Header 中散布“折叠空格”。这是一个 From Header,第一行是 From: 标记,第二行是显示名称,第三行是地址:
XML 输出不应受折叠空格的影响:
RFC 说,地址中的 @ 字符之后可以是括在括号中的字符串,例如:
我必须承认,我从未见过与此相关的电子邮件。尽管如此,RFC 说它是允许的,所以我当然希望我的词法分析器和解析器处理这样的输入。这是所需的输出:
错误处理
如果 From Header 不正确,我希望生成一个错误。以下是一些错误的 From Headers 示例和所需的输出:
显示名称错误地放在地址之后:
输出应指定发现错误的位置:
此 From Header 在显示名称前有一个错误的“23”:
同样,输出应指定发现错误的位置:
您能否展示如何实现词法分析器、解析器和序列化器?
haskell - 抑制某些 Haskell Alex/Happy 编译消息
当使用 Alex lexer 生成器或 Happy 解析器生成器创建 aLexer.x
或解析器时,将它们编译成 Haskell 文件,并将它们编译成目标文件,默认情况下这将生成以下“警告”:Parser.y
这些行是由于生成的.hs
文件中嵌入了以下行而出现的:
为什么包括这些行,如果命令行显然没有用于生成的词法分析器和解析器中的任何内容,是否有办法抑制这些消息?
haskell - 如何从 Haskell 中的语法规范构建抽象语法树?
我正在从事一个项目,该项目涉及在 Java 的一个非常小的子集中优化某些结构,并以 BNF 形式化。
如果我要在 Java 中执行此操作,我会使用 JTB 和 JavaCC 的组合来构建 AST。然后使用访问者来操纵树。但是,鉴于 Haskell 中有大量用于解析的库(parsec、happy、alex 等),我在选择合适的库时有点困惑。
所以,简单地说,当在 BNF 中指定一种语言时,哪个库提供了构建 AST 的最简单方法?在惯用的 Haskell 中修改这棵树的最佳方法是什么?
haskell - 如何在 Happy 中使用 Alex monadic 词法分析器?
我正在尝试学习使用 Alex + Happy 构建解析器,特别是我对学习使用monad
Alex 的包装器感兴趣。我已经查看了 Alex 和Happy的文档,但对我来说,他们都缺乏任何关于一起使用它们的有用信息。我设法让它们与basic
和posn
包装器一起工作,但我对monad
.
我已经看过关于 Alex、Happy 和 monadic 词法分析器的 SO 上的不同问题(包括:是否有关于使用 Alex + Happy 构建简单解释器的教程?但没有一个能够提供使用的简单示例monad
。
大多数在线代码使用 Happy 和自定义词法分析器函数,或使用basic
或posn
Alex 包装器。
这是一个类似 ini 语法的简单词法分析器:
这是相对的 Happy 解析器:
这引发了很多编译器错误:
我应该如何修改解析器来使用alexMonadScan
?Happy文档根本不清楚,并且努力不使用任何说明性示例(或者从我的角度来看,提供的示例无法说明)。
如果需要,我可以发布我posn
的同一个词法分析器+解析器的版本。
parsing - noob 想为一种小语言做一个解析器
我想让解析器对 let-in-expression 语言感到高兴。例如,我想解析以下字符串:
在大学里我们学习属性语法,我想用这个技巧直接计算解析后的 let-in-expression 的值。所以在快乐文件中,我将解析函数的数据类型设置为 Int,并创建了一个名为env的新属性。该属性是一个从 String 到 Int 的函数,它将变量名与值相关联。参考我的例子:
现在我把快乐文件放在这里,那里有我的语法:
当我加载从上面的快乐文件生成的 haskell 文件时,我收到以下错误:
我不知道为什么会得到这个,因为我没有在我的快乐文件中定义类型 Parser.Int 。我试图用 Prelude.Int 替换 Int,但我得到了其他错误。
我该如何解决?如果我正在做一些不是最佳的事情,我还能获得一些一般性提示吗?
parsing - 与 Alex 和 Happy 一起管理职位信息
我正在学习使用 Alex 和 Happy 编写一个小型编译器。我想为我的 AST 节点维护行和列信息,以便向用户提供有意义的错误消息。为了说明我打算如何做,我写了一个小例子(见下面的代码),我想知道我解决问题的方式(将 AlexPosn 附加到令牌,将多态属性字段附加到 AST 节点, 使用 tkPos 和 astAttr) 是很好的风格,或者如果有更好的方法来处理位置信息。
词法分析器.x:
解析器.y:
主要.hs:
parsing - 用 Happy 解析并添加语义/绑定
有没有办法在解析静态范围嵌套语言(例如 Pascal(允许嵌套子例程))的源代码时维护绑定信息(在源代码中遇到的名称-值对列表)?困难在于,如果有一个包含两个嵌套子例程的外层例程,则第二个解析的子例程应该“继承”全局或在外层例程中建立的绑定,而不是第一个解析的绑定常规。因此,在我看来,你不能用一元解析器来处理这个问题,但这可能是因为我不知道如何足够好地使用它们。
有任何想法吗 ?我希望我解释得足够清楚。
parsing - 什么是语法规则(在解析中)?
我正在尝试编写解释器,但难以理解该过程的理论基础。
我知道第一部分是编写一个词法分析器,它将字符串拆分成一个有效标记列表,然后使用解析器为这个标记字符串生成相应的抽象语法树。但是,解析器是使用语法规则构建的,这是我难以理解的。
语法规则显然用于创建生成的抽象语法树的规则,但这个中间步骤究竟是如何工作的。它是否在字符串字符和特定标记列表或 . . .?
欢迎任何类型的直觉或解释。谢谢!