问题标签 [alex]

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 投票
3 回答
821 浏览

regex - Haskell 中的正则表达式与词法分析器

我开始使用 Haskell,我正在尝试使用Alex工具来创建正则表达式,但我有点迷茫;我的第一个不便是编译部分。我必须如何使用 Alex 编译文件?然后,我认为我必须将 alex 生成的模块导入我的代码,但不确定。如果有人可以帮助我,我将非常感激!

0 投票
4 回答
7161 浏览

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

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

浏览完文档后,我了解了大部分内容,但希望看到有关使用这些工具的完整示例。

0 投票
2 回答
695 浏览

haskell - 我们如何在使用 Happy/Haskell 进行解析时保留多个语义值

我正在尝试在 Haskell 中使用 Alex/Happy 构建一个简单的词法分析器/解析器,并且我想将文本文件中的一些本地化信息保留到我的最终 AST 中。

我设法使用 Alex 构建了一个词法分析器,它构建了一个具有本地化的令牌列表:

在我的 Happy 文件中,当声明 %token 部分时,我可以用 $$ 符号声明令牌的语义部分

在解析规则中,$i 将引用这个 $$。

有没有办法引用 AlexPosn 部分FOO 令牌的 Foo 部分?现在我只知道如何只引用其中一个。我可以找到有关“添加多个 $$”的方法的信息,并在之后参考它们。

有没有办法这样做?

五。

0 投票
2 回答
791 浏览

haskell - 如何将换行符与 Alex/Haskell 匹配

我借用了这里展示的例子

http://www.haskell.org/alex/doc/html/introduction.html

我正在尝试为数值表达式制作解释器。(只有文字,没有变量)我想让换行符分隔两个不同的表达式。不幸的是,当我这样做时

$ignoredWhite = [\t\f\v\r] -- 忽略空格

$newline = "\n" --换行

Alex (v 2.2) 中止编译。我努力了

$newline = \n --换行

但这只会在读取输入时导致中止从 alex 移动到最终二进制文件(也就是由 ghc 生成的二进制文件)。

我该如何解决这个问题?

0 投票
2 回答
4297 浏览

haskell - 使用 alex/happy 和 Cabal

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

然后 cabal 完美运行。

我以为我早先让 cabal 自动运行它们,但也许我记得不完全。

跛行阴谋:

目录布局:

0 投票
1 回答
274 浏览

regex - 无法匹配 Alex 语法中的单个字符

我终于回到充实我想添加到 YI 的 GitCommit 消息模式,但我似乎缺少一些基本的东西。我似乎无法匹配语法中的单个字符,我的所有规则只有在它们匹配整行时才有效。我知道这必须是可能的,因为 YI 中的其他语法显然会这样做,但做同样的事情似乎不起作用。

我想要一种最终看起来与 vim 中的非常相似的提交模式。在 vim 模式下有用的一件事是在注释中突出显示关键字。Git 在它所做的大多数事情(提交、变基等)中都将大量信息放在注释中,所以这很有用。我的想法是匹配 git 注释中的起始 '#' 字符并切换到将匹配关键字的不同上下文。但是,我似乎无法制定仅匹配“#”的规则,该规则在包含“#”的行上切换为注释样式,但在包含“#”之后的任何内容的行上,它不会切换样式。

我现在拥有的是:

细节明显省略。我们的想法是当我们看到“#”时切换到“lineComment”模式,并以不同的方式设置样式,直到我们看到行尾。根据文档和示例,应该有一种方法可以做我想做的事。我已经尝试了几乎所有我能想到的“#”模式的排列,但没有任何改变我所看到的行为。
我错过了什么明显的东西?

编辑:上面的代码来自我的 YI 分支中的实现。我有一个独立的解析器,在这里表现出同样的问题。如果您运行alex GitCommit.x && ghc --make GitCommit.hs && ./GitCommit < shortmsg,您将看到内容被解析为的MessageLine注释行和正确标记的空注释行CommentStart

0 投票
2 回答
862 浏览

haskell - 是否有用于编写词法分析器的 haskell EDSL?

在一个阶段混合词法分析器和解析阶段有时会使 Parsec 解析器的可读性降低,但也会减慢它们的速度。一种解决方案是使用 Alex 作为标记器,然后使用 Parsec 作为标记流的解析器。

这很好,但如果我能摆脱 Alex 会更好,因为它在编译管道中添加了一个预处理阶段,不能很好地与 haskell“IDE”等集成。我想知道是否有这样的事情用于描述标记器的 haskell EDSL,非常类似于 Alex 的风格,但作为一个库。

0 投票
1 回答
246 浏览

haskell - 波浪号重音标记亚历克斯

我正在用 Haskell 构建一个编译器。我在解析带有波浪线重音符号的字符时遇到问题。我正在使用亚历克斯 2.3.3。我找不到解决方案。请帮忙。

0 投票
2 回答
258 浏览

haskell - Alex 中的 Haskell 数据类型模式匹配

假设我在 Haskell 中有这样的数据类型:

从亚历克斯,我明白了:

我可以像这样进行模式匹配:

但我真正想在这里完成的是:

但是,我得到:

有什么建议么?

0 投票
1 回答
887 浏览

bnf - [af]?lex 正则表达式的区别

我不知道该怎么做,而且我在网上没有找到关于如何执行这个操作的好资源[。]我正在尝试采用一个带注释的 EBNF 生产规则,它是两个正则表达式之间的差异并将其转换进入 a(na| f?)lex 语法规范规则[.] 问题是我看不到正常执行此操作的方法[.]{3} 有没有办法使用 Kleene 代数来执行此操作,就像您可以使用的方式一样与上下文无关语法中的交替空匹配[?]