标签: happy

与使用解析器组合器相比,使用像happy一样的解析器生成器有什么好处?

要学习如何编写和解析无上下文语法,我想选择一个工具.对于Haskell,有两个很大的选项:Happy,它从语法描述中生成解析器,以及*Parsec,它允许您直接在Haskell中编写解析器代码.

这两种方法的(dis)优势是什么?

parsing haskell parsec parser-generator happy

27
推荐指数
2
解决办法
4049
查看次数

与Alex和Happy一起管理职位信息

我正在学习使用Alex和Happy编写一个小编译器.我想维护AST节点的行和列信息,以便我可以向用户提供有意义的错误消息.为了说明我打算如何做,我写了一个小例子(见下面的代码),我想知道我是否接近问题的方式(将AlexPosn附加到标记,将多态属性字段附加到AST节点,使用tkPos和astAttr)是好的风格或者是否有更好的方法来处理位置信息.

Lexer.x:

{
module Lexer where
}

%wrapper "posn"

$white = [\ \t\n]

tokens :-

$white+ ;
[xX] { \pos s -> MkToken pos X }
"+"  { \pos s -> MkToken pos Plus }
"*"  { \pos s -> MkToken pos Times }
"("  { \pos s -> MkToken pos LParen }
")"  { \pos s -> MkToken pos RParen }

{
data Token = MkToken AlexPosn TokenClass
           deriving (Show, Eq)

data TokenClass = X
                | Plus
                | Times …
Run Code Online (Sandbox Code Playgroud)

parsing haskell lexical-analysis alex happy

20
推荐指数
1
解决办法
1278
查看次数

cabal-install不保留版本为happy

我试图做,cabal install hoogle但有haskell-src-exts-1.13.5依赖的hickup :

Configuring haskell-src-exts-1.13.5...
setup: The program happy version >=1.17 is required but it could not be found.
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做cabal install happy似乎成功完成,但cabal-install不保留版本:

>$ cabal list happy
* happy
    Synopsis: Happy is a parser generator for Haskell
    Default available version: 1.18.10
    Installed versions: [ Unknown ]
    Homepage: http://www.haskell.org/happy/
    License:  BSD3
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,版本是[ Unknown ].它仍然未知,如果我再试cabal install happy一次,cabal-install仍然无视.

是什么赋予了?

提前致谢!

haskell cabal-install happy

19
推荐指数
1
解决办法
2633
查看次数

Parsec或happy(使用alex)或uu-parsinglib

我将编写一个verilog(或vhdl)语言的解析器,并将对解析数据进行大量操作(某种转换).我打算解析真正的大文件(完整的Verilog设计,大到10K行),我最终会支持大部分的Verilog.我不介意输入,但每当我添加对其他规则的支持时,我不想重写代码的任何部分.

在Haskell,你会推荐哪个图书馆?我知道Haskell并且之前使用过Happy(玩).我觉得有可能使用Parsec来转换代码中的解析字符串(这是一个很好的加分).我没有使用uu-paringlib的经验.

那么要解析verilog/VHDL的全语法,推荐其中一个?我主要担心的是我可以随心所欲地操纵解析数据的简易性和"正确性".速度不是主要问题.

parsing haskell parsec happy uu-parsinglib

16
推荐指数
1
解决办法
3996
查看次数

如何让Stack调用Happy,Alex和其他构建工具?

作为我的编译器的一部分,我需要alexhappy作为构建过程的一部分运行.Stack如何支持这种情况?

额外:我如何注册alexhappy编译时依赖?

haskell happy haskell-stack

16
推荐指数
1
解决办法
1145
查看次数

使用alex/happy with Cabal

我正在为我正在学习的课程编写一个编译器.该类不是专门的Haskell,而是我使用Haskell编写我的编译器和解释器.我有一个cabal包设置,希望我的教授可以轻松运行/编译.我对构建工具字段中的两个可执行文件感到高兴和alex,但是Cabal忽略了这一点,然后抱怨它无法找到Happy和Alex应该生成的模块.如果我手动运行:

alex LimpScanner.x
happy LimpParser.y
Run Code Online (Sandbox Code Playgroud)

然后cabal完美运行.

我以为我让cabal自动运行它们,但也许我记得不完美.

limp.cabal:

-- limp.cabal auto-generated by cabal init. For additional options,
-- see
-- http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#pkg-descr.
-- The name of the package.
Name:                limp

-- The package version. See the Haskell package versioning policy
-- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
-- standards guiding when and how versions should be incremented.
Version:             0.1

-- A short (one-line) description of the package.
Synopsis:            LIMP Compiler (Compiler Construction course project)

-- A longer description of the package.
-- Description:         

-- URL …
Run Code Online (Sandbox Code Playgroud)

haskell cabal alex happy

13
推荐指数
2
解决办法
3725
查看次数

有没有关于使用Alex + Happy构建简单解释器的教程?

我正在开展一个学校项目,我必须使用Alex + Happy在Haskell中为一种简单的语言构建一个解释器.

仔细阅读文档后我了解了大部分内容,但希望看到使用这些工具的完整示例.

parsing interpreter haskell alex happy

12
推荐指数
2
解决办法
6334
查看次数

覆盖"内部快乐错误" - notHappyAtAll

我使用Happy来生成解析器.

我发现当我给它的标记部分语法比顶层更低时(比如给它一个表达它自己,这不是一个声明的一部分),我得到一个"内部快乐"错误"而不是解析错误.

有没有办法覆盖,notHappyAtAll以便我可以打印比"内部快乐错误"更好的错误消息?显然,除了更改自动生成的解析器文件之外,我每次更新语法时都必须这样做.

error-handling parsing haskell happy

11
推荐指数
1
解决办法
394
查看次数

如何使用Alex monadic lexer与Happy?

我正在尝试学习使用Alex + Happy来构建解析器,特别是我有兴趣学习使用monadAlex 的包装器.我已经看过亚历克斯和快乐的文档,但对于我来说,他们都非常缺乏将它们一起使用的任何有用信息.我设法让它们basicposn包装纸一起工作,但我很茫然monad.

我已经看过关于Alex,Happy和monadic词法分析器的不同问题(包括:是否有关于使用Alex + Happy构建简单解释器的任何教程?但没有一个能够提供一个使用的简单示例monad.

大多数在线代码使用Happy与自定义词法分析器函数,或使用basicposnAlex包装器.

这是一个类似ini的语法的简单词法分析器:

{
module IniLexer where
}

%wrapper "monad"



$spaces = [\ \t]
$alpha = [a-zA-Z]
$digits = [0-9]
$alnum = [$alpha$digits]


@identifier = $alpha $alnum*

@comment = \#.*

@integer = $digits+

@boolean = (true) | (false)

@string = \"[^\"]*\"


:-

@integer    { mkL LInteger }
@boolean    { mkL LBoolean }
@string     { …
Run Code Online (Sandbox Code Playgroud)

monads haskell alex happy

11
推荐指数
1
解决办法
3494
查看次数

快乐和亚历克斯如何引导自己成为存在?

源树happy中包含AttrGrammarParser.lyParser.ly和源树alex包含Scan.x.然而,据我所知,为了编译happy,我们需要使用... 将.ly文件转换为.lhs文件happy,并且为了编译,alex我们需要使用... 将.x文件转换为.hs文件alex.

因此,为了编译任一工具,似乎必须进行一些自举.

Setup.lhs每个项目的文件都包含一些模板扩展,但据我所知,不要做任何特别的事情来进行自举.

引导如何以及在哪里完成?

bootstrapping haskell alex happy

10
推荐指数
1
解决办法
190
查看次数