La documentation Parsec a un exemple d'utilisation makeTokenParser
pour construire un lexer:Évitez les répétitions dans lexing lors de l'utilisation parsec
module Main where
import Text.Parsec
import qualified Text.Parsec.Token as P
import Text.Parsec.Language (haskellDef)
-- The parser
...
expr = parens expr
<|> identifier
<|> ...
-- The lexer
lexer = P.makeTokenParser haskellDef
parens = P.parens lexer
braces = P.braces lexer
identifier = P.identifier lexer
reserved = P.reserved lexer
...
Dans le bloc « Le lexer », chaque P.*
est appliqué à lexer de telle sorte que l'on peut éviter de répéter dans le bloc "Le parseur". Cependant répéter cela pour chaque jeton est toujours fastidieux. Y a-t-il un moyen d'éviter la répétition encore plus? Je pensais implicitement appliquer lexer partout dans "The Parser", mais je suis perdu à comment.
Si vous activez 'RecordWildCards', vous pouvez utiliser simplement' P.TokenParser {..} = lexer' au niveau supérieur pour définir tous les champs d'enregistrement. – ErikR