Nom es una biblioteca de combinadores de analizador escrita en Rust. Su objetivo es proporcionar herramientas para construir analizadores seguros sin comprometer la velocidad o el consumo de memoria. Con ese fin, utiliza ampliamente la fuerte seguridad y la seguridad de la memoria para producir analizadores rápidos y correctos, y proporciona funciones, macros y rasgos para abstraer la mayor parte de la plomería propensa a errores.
nom felizmente sacará un byte de sus archivos :)
Parser de color hexadecimal:
use nom :: {
bytes :: complete :: { tag , take_while_m_n } ,
combinator :: map_res ,
sequence :: Tuple ,
IResult ,
Parser ,
} ;
# [ derive ( Debug , PartialEq ) ]
pub struct Color {
pub red : u8 ,
pub green : u8 ,
pub blue : u8 ,
}
fn from_hex ( input : & str ) -> Result < u8 , std :: num :: ParseIntError > {
u8 :: from_str_radix ( input , 16 )
}
fn is_hex_digit ( c : char ) -> bool {
c . is_digit ( 16 )
}
fn hex_primary ( input : & str ) -> IResult < & str , u8 > {
map_res (
take_while_m_n ( 2 , 2 , is_hex_digit ) ,
from_hex
) . parse ( input )
}
fn hex_color ( input : & str ) -> IResult < & str , Color > {
let ( input , _ ) = tag ( "#" ) ( input ) ? ;
let ( input , ( red , green , blue ) ) = ( hex_primary , hex_primary , hex_primary ) . parse ( input ) ? ;
Ok ( ( input , Color { red , green , blue } ) )
}
fn main ( ) {
println ! ( "{:?}" , hex_color ( "#2F14DF" ) )
}
# [ test ]
fn parse_color ( ) {
assert_eq ! (
hex_color ( "#2F14DF" ) ,
Ok ( (
"" ,
Color {
red: 47 ,
green: 20 ,
blue: 223 ,
}
) )
) ;
}
Si necesita alguna ayuda para desarrollar sus analizadores, por favor ping geal
en IRC (Libera, Geeknode, OFTC), vaya a #nom-parsers
en Libera IRC o en la sala de chat de Gitter.
Si quieres escribir:
NOM fue diseñado para analizar adecuadamente los formatos binarios desde el principio. En comparación con los analizadores C escritos a mano habituales, los analizadores NOM son igual de rápidos, libres de vulnerabilidades de desbordamiento del búfer y manejan patrones comunes para usted:
Ejemplo de proyectos:
Si bien NOM se hizo para el formato binario al principio, pronto se convirtió en funcionar igual de bien con formatos de texto. Desde formatos basados en línea como CSV, hasta formatos más complejos y anidados como JSON, NOM puede administrarlo y le proporcionan herramientas útiles:
Ejemplo de proyectos:
Si bien los analizadores de lenguaje de programación generalmente se escriben manualmente para obtener más flexibilidad y rendimiento, NOM puede ser (y se ha utilizado con éxito) como un analizador de prototipos para un lenguaje.
Nom lo hará comenzar rápidamente con potentes tipos de errores personalizados, que puede aprovechar con Nom_Locate para identificar la línea y la columna exacta del error. No hay necesidad de fases separadas de tokenización, lexing y análisis: NOM puede manejar automáticamente el análisis de espacios en blanco y construir un AST en su lugar.
Ejemplo de proyectos:
Si bien muchos formatos (y el código que los maneja) supone que pueden ajustarse a los datos completos en la memoria, hay formatos para los cuales solo obtenemos una parte de los datos a la vez, como formatos de red o archivos enormes. Nom ha sido diseñado para un comportamiento correcto con datos parciales: si no hay suficientes datos para decidir, NOM le dirá que necesita más en lugar de devolver en silencio un resultado incorrecto. Ya sea que sus datos vienen por completo o en fragmentos, el resultado debería ser el mismo.
Le permite construir máquinas de estado potentes y deterministas para sus protocolos.
Ejemplo de proyectos:
Los combinadores de analizador son un enfoque para los analizadores que es muy diferente del software como Lex y YACC. En lugar de escribir la gramática en un archivo separado y generar el código correspondiente, utiliza funciones muy pequeñas con un propósito muy específico, como "tomar 5 bytes" o "reconocer la palabra 'http'", y ensamblarlas en patrones significativos como " Reconocer 'http', luego un espacio, luego una versión ". El código resultante es pequeño y se parece a la gramática que habría escrito con otros enfoques de analizador.
Esto tiene algunas ventajas:
Los analizadores nom son para:
&[u8]
y analizadores funcionarán lo más posible en las rodajas de matriz de bytes (pero no se limitan a ellos) Algunos puntos de referencia están disponibles en GitHub.
La serie 7.0 de Nom admite Rustc versión 1.56 o más .
La política actual es que esto solo se actualizará en el próximo lanzamiento de Nom -Nom.
NOM está disponible en cajas.io y puede incluirse en su proyecto habilitado para carga como este:
[ dependencies ]
nom = " 7 "
Hay algunas características de compilación:
alloc
: (activado por defecto) Si está deshabilitado, Nom puede funcionar en no_std
Builds sin asignadores de memoria. Si está habilitado, los combinadores que asignen (como many0
) estarán disponiblesstd
: (activado por defecto, se alloc
también) Si está deshabilitado, NOM puede funcionar en no_std
compilacionesPuede configurar esas características como esta:
[ dependencies . nom ]
version = " 7 "
default-features = false
features = [ " alloc " ]
Aquí hay una lista (no exhaustiva) de proyectos conocidos utilizando Nom:
¿Quieres crear un nuevo analizador usando nom
? Una lista de formatos aún no implementados está disponible aquí.
¿Quieres agregar tu analizador aquí? ¡Crea una solicitud de extracción para ello!
Nom es el fruto del trabajo de muchos contribuyentes a lo largo de los años, ¡muchas gracias por su ayuda!