Nom est une bibliothèque de combinateurs d'analyseurs écrits en rouille. Son objectif est de fournir des outils pour construire des analyseurs sûrs sans compromettre la vitesse ou la consommation de mémoire. À cette fin, il utilise largement la forte sécurité de la rouille et la sécurité de la mémoire pour produire des analyseurs rapides et corrects, et fournit des fonctions, des macros et des traits pour résumer la majeure partie de la plomberie sujette aux erreurs.
Nom retirera joyeusement un octet de vos fichiers :)
Analyseur de couleur hexadécimale:
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 vous avez besoin d'aide pour développer vos analyseurs, veuillez ping geal
sur IRC (Libera, GeekNode, Oftc), allez chez #nom-parsers
sur Libera IRC ou sur la salle de chat Gitter.
Si vous voulez écrire:
NOM a été conçu pour analyser correctement les formats binaires depuis le début. Par rapport aux analyseurs C manuscrits habituels, les analyseurs NOM sont tout aussi rapides, exempts de vulnérabilités de débordement de tampon et gèrent les modèles communs pour vous:
Exemples de projets:
Bien que NOM ait été fait pour le format binaire au début, il s'est vite connu du travail aussi bien avec les formats de texte. Des formats en ligne comme CSV, aux formats plus complexes et imbriqués tels que JSON, NOM peuvent le gérer et vous fournit des outils utiles:
Exemples de projets:
Bien que les analyseurs de langage de programmation soient généralement écrits manuellement pour plus de flexibilité et de performances, le nom peut être (et a été utilisé avec succès) comme analyseur de prototypage pour une langue.
NOM vous permettra de démarrer rapidement avec de puissants types d'erreur personnalisés, que vous pouvez exploiter avec NOM_LOCE pour identifier la ligne et la colonne exactes de l'erreur. Pas besoin de phases séparées de tokenisage, de lexing et d'analyse: NOM peut gérer automatiquement l'analyse des espaces blancs et construire un AST en place.
Exemples de projets:
Alors que de nombreux formats (et le code qui les gère) supposent qu'ils peuvent s'adapter aux données complètes en mémoire, il existe des formats pour lesquels nous n'obtenons qu'une partie des données à la fois, comme des formats de réseau ou des fichiers énormes. Le nom a été conçu pour un comportement correct avec des données partielles: s'il n'y a pas suffisamment de données pour décider, NOM vous dira qu'il a besoin de plus au lieu de renvoyer silencieusement un mauvais résultat. Que vos données soient entièrement ou en morceaux, le résultat devrait être le même.
Il vous permet de construire des machines d'État puissantes et déterministes pour vos protocoles.
Exemples de projets:
Les combinateurs d'analyseurs sont une approche des analyseurs qui est très différent de logiciels comme Lex et YACC. Au lieu d'écrire la grammaire dans un fichier séparé et de générer le code correspondant, vous utilisez de très petites fonctions avec un objectif très spécifique, comme "prendre 5 octets", ou "reconnaître le mot" http "", et les assembler dans des modèles significatifs comme " Reconnaissez 'http', puis un espace, puis une version ". Le code résultant est petit et ressemble à la grammaire que vous auriez écrite avec d'autres approches d'analyse.
Cela présente quelques avantages:
Les analyseurs de nom sont pour:
&[u8]
et les analyseurs fonctionneront autant que possible sur les tranches de tableau d'octets (mais sans s'y limiter) Certains repères sont disponibles sur GitHub.
La série 7.0 de NOM prend en charge RustC version 1.56 ou plus .
La politique actuelle est que cela ne sera mis à jour que lors de la prochaine version majeure du nom.
NOM est disponible sur Crates.io et peut être inclus dans votre projet compatible avec cargaison comme celui-ci:
[ dependencies ]
nom = " 7 "
Il existe quelques caractéristiques de compilation:
alloc
: (activé par défaut) Si désactivé, NOM peut fonctionner dans les builds no_std
sans allocateurs de mémoire. S'il est activé, les combinateurs qui allacent (comme many0
) seront disponiblesstd
: (activé par défaut, active aussi alloc
) Si désactivé, le nom peut fonctionner dans les versions no_std
Vous pouvez configurer ces fonctionnalités comme celle-ci:
[ dependencies . nom ]
version = " 7 "
default-features = false
features = [ " alloc " ]
Voici une liste (non exhaustive) de projets connus utilisant NOM:
Vous voulez créer un nouvel analyseur en utilisant nom
? Une liste de formats non implémentés est disponible ici.
Vous voulez ajouter votre analyseur ici? Créez une demande de traction pour cela!
Nom est le fruit du travail de nombreux contributeurs au fil des ans, merci beaucoup pour votre aide!