Parsec es una biblioteca para escribir analizadores en Haskell . [3] Se basa en combinadores de analizadores de orden superior , por lo que se puede crear un analizador complicado a partir de muchos más pequeños. [4] Se ha reimplementado en muchos otros lenguajes, incluidos Erlang , [5] Elixir , [6] OCaml , [7] Racket , [8] y F# , [9] [10] así como lenguajes imperativos como C#. , [11] y Java . [12]
Debido a que un programa basado en un analizador combinador es generalmente más lento que un programa basado en un generador de analizador , [ cita requerida ] Parsec se usa normalmente para lenguajes pequeños de dominio específico , mientras que Happy se usa para compiladores como GHC . [13]
Otras bibliotecas combinadoras de analizadores Haskell que se han derivado de Parsec incluyen Megaparsec [14] y Attoparsec. [15]
Parsec es un software gratuito publicado bajo la licencia BSD-3-Clause. [dieciséis]
Los analizadores escritos en Parsec comienzan con analizadores más simples, como los que reconocen ciertas cadenas, y los combinan para construir un analizador con un comportamiento más complicado. Por ejemplo, digit
analiza un dígito y string
analiza una cadena específica (como "hello"
).
Las bibliotecas combinadoras de analizadores como Parsec proporcionan funciones de utilidad para ejecutar los analizadores en valores reales. Un analizador para reconocer un solo dígito de una cadena se puede dividir en dos funciones: una para crear el analizador y una main
función que llama a una de estas funciones de utilidad ( parse
en este caso) para ejecutar el analizador:
import Text.Parsec : tiene funciones de utilidad de análisis general import Text.Parsec.Char : contiene combinadores básicos específicos tipo Parser = Stream s m Char => ParsecT s u m String analizador :: Analizador analizador = cadena "hola" principal :: IO () principal = imprimir ( parse analizador "<prueba>" "hola mundo" ) - imprime 'Correcto "hola"'
Definimos un Parser
tipo para que la firma tipográfica sea parser
más fácil de leer. Si quisiéramos alterar este programa, digamos leer la cadena "hello"
o la cadena "goodbye"
, podríamos usar el operador <|>
, proporcionado por la Alternative
clase de tipos, para combinar dos analizadores en un solo analizador que intente:
analizador = cadena "hola" <|> cadena "adiós"