Parsec es una biblioteca para escribir analizadores en Haskell . [3] Se basa en combinadores de analizadores sintácticos de orden superior , por lo que se puede hacer un analizador complicado a partir de muchos más pequeños. [4] Se ha vuelto a implementar en muchos otros lenguajes, incluidos Erlang , [5] Elixir , [6] OCaml , [7] y F # , [8] [9] , así como lenguajes imperativos como C # , [10] y Java . [11]
Autor (es) original (es) | Daan Leijen, Paolo Martini, Antoine Latter |
---|---|
Desarrollador (es) | Herbert Valerio Riedel, Derek Elkins, Antoine Latter, Roman Cheplyaka, Ryan Scott |
Versión inicial | 2 de noviembre de 2006 [1] |
Lanzamiento estable | 3.1.14.0 / 10 de agosto de 2019 [2] |
Repositorio | github |
Escrito en | Haskell |
Sistema operativo | Linux , macOS , Windows |
Plataforma | Plataforma Haskell |
Tipo | Combinador de analizador , biblioteca |
Licencia | BSD-3 |
Sitio web | hackage |
Debido a que un programa basado en un combinador de analizador sintáctico es generalmente más lento que un programa basado en un generador de analizador sintáctico [ cita requerida ] , Parsec se usa normalmente para lenguajes específicos de dominio pequeño , mientras que Happy se usa para compiladores como GHC . [12]
Otras bibliotecas de combinador de analizadores sintácticos de Haskell que se han derivado de Parsec incluyen Megaparsec [13] y Attoparsec. [14]
Parsec es un software gratuito publicado bajo la licencia BSD-3-Clause. [15]
Ejemplo
Los analizadores escritos en Parsec comienzan con analizadores más simples, como los que reconocen ciertas cadenas, y los combinan para crear 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 del combinador 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 Stringparser :: Parser parser = string "hola"main :: IO () main = print ( parse parser "" "hola mundo" ) - imprime 'derecha "hola"'
Definimos un Parser
tipo para que la firma del tipo parser
sea 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"
Referencias
- ^ "parsec 2.0" . Hackage . Consultado el 3 de septiembre de 2019 .
- ^ "Lanzamientos" . Github . Consultado el 3 de septiembre de 2019 .
- ^ "Parsec en la wiki de Haskell" . Wiki de Haskell . Consultado el 29 de mayo de 2017 .
- ^ "Parsec: combinadores de analizador monádico de estilo directo para el mundo real" (PDF) . Investigación de Microsoft . Consultado el 22 de noviembre de 2014 .
- ^ "Parsec Erlang" . BitBucket . Consultado el 23 de noviembre de 2014 .
- ^ "Ágil Parsec" . Github . Consultado el 18 de diciembre de 2018 .
- ^ "Parsec OCaml" (PDF) . El Proyecto de Verano OCaml . Consultado el 23 de noviembre de 2014 .
- ^ "XParsec por corsis" . XParsec . Consultado el 29 de mayo de 2017 .
- ^ "FParsec" . Quanttec . Consultado el 29 de mayo de 2017 .
- ^ "Mónada aguda" . Github . Consultado el 10 de diciembre de 2014 .
- ^ "JParsec" . Github . Consultado el 14 de octubre de 2016 .
- ^ "El compilador de Glasgow Haskell (AOSA Vol. 2)" . La arquitectura de las aplicaciones de código abierto . Consultado el 23 de noviembre de 2014 .
- ^ "megaparsec: combinadores de analizador monádico" . Hackage . Consultado el 10 de septiembre de 2018 .
- ^ "attoparsec: análisis de combinador rápido para cadenas de bytes y texto" . Hackage . Consultado el 10 de septiembre de 2018 .
- ^ https://github.com/haskell/parsec/blob/master/LICENSE
enlaces externos
- Parsec en la wiki de Haskell
- Parsec en Hackage