2010-07-24 47 views
4

我正在尝试用Haskell中的Alex/Happy构建一个简单的词法分析器/解析器,并且我想 将来自文本文件的一些本地化信息保存到我的最终的AST。如何在使用Happy/Haskell进行分析时保留多个语义值

我设法建立使用亚历克斯建立令牌的列表本地化词法分析:

data Token = Token AlexPosn Foo Bar 
lexer :: String -> [Token] 
在我的快乐文件

,声明%令牌部分的时候,我可以声明什么的 语义部分带有$$符号的令牌

%token FOO { Token _ $$ _ } 

并且在解析规则中,$ i将引用此$$。

foo_list: FOO { [$1] } 
     | foo_list FOO { $2 : $1 } 

有没有办法来指代AlexPosn部分到FOO令牌的富一部分? 现在我只知道如何只参考其中的一个。我可以通过“添加几个$$”的方式找到信息,并在之后参考它们。

有没有办法做到这一点?

+0

事实上,即使在C flex/bison中也不可能,所以它不应该直接在haskell或caml中。 但是,我可以使用一个元组 数据Token = Token(AlexPosn,Foo,Bar)) 而不是几个参数。 我打开了几天的问题,但我想我会很快关闭 。 – Vinz 2010-07-26 08:37:44

回答

4

最后,我确实发现2个解决方案:在一个元组

  • 包全部含义数据,让$$点这个元组,然后提取 数据通过投影:

    data Token = Token (AlexPosn,Foo) Bar 
    %token FOO { Token $$ some_bar } 
    rule : FOO { Ast (fst $1) (snd $1) } 
    
  • 不使用$$都:如果你不使用$$,快乐会给你完全令牌解析过程中,所以它是由你来提取WHA T优真的从此令牌需要:

    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 
    

    ...

我第一个想到的是最优雅的。如果你携带了大量的信息,第二个代码可能会非常繁重:你将不得不手动构建“预测”(模式匹配等),并且以安全的方式这样做可能会非常棘手如果你的令牌类型很大。

+1

+1回答你自己的问题 - 它为我省了很多麻烦! – Jack 2011-12-13 12:59:45

+0

是的,非常感谢。 – 2013-08-04 15:00:08

相关问题