Estoy experimentando con Trifecta para analizar un lenguaje funcional muy simple con una sintaxis de diseño similar a Haskell. Estoy trabajando en los documentos de Haddock y en mi experiencia con Parsec, porque no pude encontrar ningún material introductorio en Trifecta.Uso del analizador de diseño de Trifecta
El problema que tengo es con el uso de elementos de diseño, ya que ni siquiera los documentos de Haddock ayudan mucho.
Dado el siguiente código:
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
Estoy tratando de analizar el siguiente texto con test
:
f x = x y a b c -- 1
where -- 2
y = d -- 3
g x = z -- 4
pero falla con este error de análisis:
(interactive):4:2: error: expected: "=",
identifier, letter or digit
g x = z -- 4
^
pero si comento las líneas 2 y 3, funciona.
Entonces, ¿cómo hago para analizar incluso cuando se incluyen las líneas 2 y 3?
Me imagino que esto se soluciona ahora? trifecta se encuentra actualmente en 1.5.1. –
Actualmente tenemos el analizador de diseño eliminado de la corriente principal trifecta. Sin embargo, tienes un buen momento. Actualmente estoy desempolvando y buscando reemplazarlo. =) –