在使用 Happy/Haskell 进行解析时,我们如何保留多个语义值
-
28-09-2020 - |
题
我正在尝试与Haskell中的Alex/Happy一起构建一个简单的Lexer/Parser,我想将文本文件中的一些本地化信息保存到我的最终AST中。
我设法使用 Alex 构建了一个词法分析器,它构建了具有本地化的令牌列表:
data Token = Token AlexPosn Foo Bar
lexer :: String -> [Token]
在我的快乐文件中,当声明%令牌部分时,我可以声明具有$$符号的令牌的语义部分
%token FOO { Token _ $$ _ }
并且在解析规则中,$i将引用这个$$。
foo_list: FOO { [$1] }
| foo_list FOO { $2 : $1 }
有没有办法参考AlexPosn部分 和 到 FOO 代币的 Foo 部分?现在我只知道如何引用其中之一。我可以找到有关“添加几个 $$”的方法的信息,并在之后参考它们。
有办法这样做吗?
五、
解决方案
到底,我发现了2个解决方案:
-
包在元组中的所有含义数据,使$$指向这个元组,然后提取 通过投影数据:
data Token = Token (AlexPosn,Foo) Bar %token FOO { Token $$ some_bar } rule : FOO { Ast (fst $1) (snd $1) }
-
aly使用$$
.data Token = Token AlexPosn Foo Bar %token FOO = { Token _ _ some_bar } rule : FOO { Ast (get_pos $1) (get_foo $1) } get_pos :: Token -> AlexPosn get_foo :: Token -> Foo
...
我认为第一个是最优雅的。如果您携带很多信息,则第二个可以在代码中的任期非常重如果你的令牌类型相当大。
其他提示
也可以保留多个值,如下所示:
data Token = Token AlexPosn Foo Bar
%token FOO { Token pos foo some_bar }
rule : FOO { Ast pos foo }
虽然我不确定Happy是否真的保证这永远有效。它(也许)起作用的原因是 happy 会生成模式匹配的代码 Token pos foo some_bar
, , 制作 pos
和 foo
可用于 Ast pos foo
.
不隶属于 StackOverflow