小编Zeb*_*Zeb的帖子

在 Haskell 中使用 Alex 制作一个解析骰子卷的词法分析器

我正在使用 Alex + Happy 为 Haskell 中的 DSL 制作解析器。我的 DSL 使用掷骰子作为可能表达式的一部分。

有时我有一个我想解析的表达式,如下所示:

[some code...]  3D6  [... rest of the code]
Run Code Online (Sandbox Code Playgroud)

这应该大致翻译为:

TokenInt {... value = 3}, TokenD, TokenInt {... value = 6}
Run Code Online (Sandbox Code Playgroud)

我的 DSL 也使用变量(基本上是字符串),所以我有一个特殊的标记来处理变量名。所以,有了这个令牌:

"D"                                 { \pos str -> TokenD pos }
$alpha [$alpha $digit \_ \']*       { \pos str -> TokenName pos str}
$digit+                             { \pos str -> TokenInt pos (read str) }
Run Code Online (Sandbox Code Playgroud)

我现在使用解析时得到的结果是:

TokenInt {... value = 3}, TokenName { ... , name …
Run Code Online (Sandbox Code Playgroud)

dsl parsing haskell lexer alex

7
推荐指数
1
解决办法
257
查看次数

标签 统计

alex ×1

dsl ×1

haskell ×1

lexer ×1

parsing ×1