2012-09-11 2 views
6

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?

Répondre

6

Il existe un certain nombre de bogues dans le support Layout pour Trifecta. J'ai besoin de transférer quelques correctifs de l'implémentation de Scala.

Notamment, certaines choses doivent désactiver le début de la vérification de ligne qui ne le fait pas, alors il a essayé de faire l'insertion automatique de point-virgule où vous obtenez l'erreur.

Je l'ai porté d'une autre base de code qui a fait des hypothèses légèrement différentes et offert des invariants légèrement différents de ceux du trifecta.

Ceci est en fait une grande partie des raisons pour lesquelles il est actuellement dans la branche principale sur GitHub.

En le corrigeant pour utiliser la nouvelle API basée sur parsers, le portage de ces changements est la dernière chose que je dois faire avant de pouvoir expédier 0.90.

En attendant, je ne compterais pas dessus. Mes excuses.

Je mettrai à jour cette réponse dès qu'elle sera stable.

+1

J'imagine que c'est corrigé maintenant? Trifecta est actuellement à 1.5.1. –

+2

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. =) –

Questions connexes