我正在尝试与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, , 制作 posfoo 可用于 Ast pos foo.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top