2010-07-24 49 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

相關問題