저는 Haskell과 같은 레이아웃 구문을 사용하여 아주 간단한 함수 언어를 구문 분석하기 위해 Trifecta를 실험하고 있습니다. 나는 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에서 제거되었습니다. 그러나 좋은 타이밍이 있습니다. 나는 현재 그것을 털어 내고 그것을 대체하려고하고있다. =) –