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行,我該如何解析它?
我想現在這個問題已經解決了嗎? trifecta目前在1.5.1。 –
我們目前已經從主流trifecta中刪除了佈局分析器。但是,你有很好的時機。我目前正在把它弄乾淨,並正在替換它。 =) –