Tôi đang thử nghiệm với Trifecta để phân tích cú pháp một ngôn ngữ hàm rất đơn giản với cú pháp bố cục giống như Haskell. Tôi đang làm việc với các tài liệu Haddock và kinh nghiệm của tôi với Parsec, bởi vì tôi không thể tìm thấy bất kỳ tài liệu giới thiệu nào về Trifecta.Sử dụng trình phân tích cú pháp bố cục của Trifecta
Sự cố mà tôi đang gặp phải là sử dụng nội dung bố cục, vì ngay cả tài liệu Haddock cũng không giúp được gì nhiều.
Với đoạn mã sau:
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
Tôi đang cố gắng để phân tích các văn bản sau đây với test
:
f x = x y a b c -- 1
where -- 2
y = d -- 3
g x = z -- 4
nhưng nó thất bại với lỗi phân tích cú pháp này:
(interactive):4:2: error: expected: "=",
identifier, letter or digit
g x = z -- 4
^
nhưng nếu tôi bình luận ra dòng 2 và 3, nó hoạt động.
Vậy làm cách nào để phân tích cú pháp ngay cả khi bao gồm các dòng 2 và 3?
Tôi cho rằng điều này đã được khắc phục ngay bây giờ? trifecta hiện tại là 1.5.1. –
Hiện tại, chúng tôi đã xóa trình phân tích cú pháp bố cục khỏi trifecta chính thống. Tuy nhiên, bạn có thời gian tốt. Tôi hiện đang quét sạch nó và tìm cách thay thế nó. =) –