J'expérimente Trifecta pour analyser un langage fonctionnel très simple avec une syntaxe de mise en page de type Haskell. Je travaille sur les documents Haddock et sur mon expérience avec Parsec, parce que je n'ai pas trouvé de matériel d'introduction sur Trifecta. Le problème que j'ai est avec l'utilisation de la mise en page, car même les docs Haddock ne sont pas très utiles.Utilisation de l'analyseur de mise en page de Trifecta
Vu le code suivant:
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
Je suis en train d'analyser le texte suivant avec test
:
f x = x y a b c -- 1
where -- 2
y = d -- 3
g x = z -- 4
mais il échoue avec cette erreur d'analyse syntaxique:
(interactive):4:2: error: expected: "=",
identifier, letter or digit
g x = z -- 4
^
mais si je commente les lignes 2 et 3, cela fonctionne.
Alors, comment puis-je faire analyser, même en incluant les lignes 2 et 3?
J'imagine que c'est corrigé maintenant? Trifecta est actuellement à 1.5.1. –
Nous avons actuellement l'analyseur de mise en page retiré du trifecta grand public. Cependant, vous avez un bon timing. Je suis en train de le dépoussiérer et je cherche à le remplacer. =) –