2012-09-11 63 views
6

我正在嘗試使用Trifecta解析一個非常簡單的函數式語言,並使用類似於Haskell的佈局語法。我正在研究Haddock文檔和Parsec的經驗,因爲我無法在Trifecta上找到任何介紹性資料。使用Trifecta的佈局解析器

我遇到的問題是使用佈局的東西,因爲甚至沒有Haddock文檔幫助很大。

考慮下面的代碼:

import Text.Trifecta 
import Text.Trifecta.Parser.Token.Style 
import Text.Trifecta.Parser.Identifier.Style 
import Text.Trifecta.Layout.Combinators 
import Text.Trifecta.Language.Prim 

import Control.Applicative 
import Control.Monad.Trans 
import Data.Maybe (fromMaybe) 

import Data.HashSet as HashSet 
import Data.ByteString.UTF8 as UTF8 

-- Copypasta from Text.Trifecta.Parser.Identifier.Style 
set :: [String] -> HashSet ByteString 
set = HashSet.fromList . fmap UTF8.fromString 

lang :: MonadParser m => LanguageDef m 
lang = LanguageDef{ languageCommentStyle = haskellCommentStyle 
        , languageIdentifierStyle = emptyIdents{ styleReserved = set keywords } 
        , languageOperatorStyle = emptyOps{ styleReserved = set ops } 
        } 
    where 
    keywords = ["where"] 
    ops = ["="] 

data Def = Def ByteString [ByteString] [ByteString] [Def] 
     deriving Show 

instance MonadLanguage m => MonadLanguage (Layout m) where 
    askLanguage = fmap liftLanguageDef $ lift askLanguage 

def :: (MonadParser m) => Layout (Language m) Def 
def = Def <$> identifier <*> vars <* reservedOp "=" <*> vars <*> laidout locals 
    where 
    vars = many identifier 
    locals = fromMaybe [] <$> optional (reserved "where" *> defs) 

defs :: (MonadParser m) => Layout (Language m) [Def] 
defs = laidout (many def) 

test :: String -> IO() 
test = parseTest $ run $ defs <* eof 
    where 
    run p = runLanguage (fst <$> runLayout p defaultLayoutState) lang 

我試圖解析與test以下文字:

f x = x y a b c -- 1 
    where   -- 2 
    y = d  -- 3 
g x = z   -- 4 

但它失敗,此分析錯誤:

(interactive):4:2: error: expected: "=", 
    identifier, letter or digit 
g x = z   -- 4 
^  

但如果我註釋掉第2行和第3行,它就可以工作。

那麼即使包含第2行和第3行,我該如何解析它?

回答

6

對Trifecta支持Layout有幾個錯誤。我需要從Scala實現中移除一些修復。

值得注意的是,有些事情需要禁用不啓動行檢查,所以它試圖做自動分號插入,你得到的錯誤。

我從另一個代碼庫移植它,它做出了稍微不同的假設,並提供了與trifecta稍微不同的不變量。

這實際上是它目前不在github上的主分支中的很大一部分。

修復它以使用新的parsers爲基礎的API,並移植這些更改是我可以運輸0.90之前需要做的最後一件重要事情。

在此期間,我不會依賴它。我很抱歉。

我會盡快更新此響應,只要它穩定。

+1

我想現在這個問題已經解決了嗎? trifecta目前在1.5.1。 –

+2

我們目前已經從主流trifecta中刪除了佈局分析器。但是,你有很好的時機。我目前正在把它弄乾淨,並正在替換它。 =) –