Nom ist eine Parser -Kombinatorbibliothek in Rost. Sein Ziel ist es, Tools bereitzustellen, um sichere Parsers zu erstellen, ohne die Geschwindigkeit oder den Speicherverbrauch zu beeinträchtigen. Zu diesem Zweck verwendet es ausführlich die starke Schreib- und Speichersicherheit von Rost, um schnelle und korrekte Parser zu erzeugen, und bietet Funktionen, Makros und Merkmale, um den größten Teil des fehleranfälligsten Sanitärs abstrahieren.
Nom wird gerne ein Byte aus Ihren Dateien herausnehmen :)
Hexadezimaler Farbparser:
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 ,
}
) )
) ;
}
Wenn Sie Hilfe bei der Entwicklung Ihrer Parser benötigen, pingen Sie geal
auf IRC (Libera, Geeknode, Oftc), finden Sie zu #nom-parsers
auf Libera IRC oder im Gitter-Chatraum.
Wenn Sie schreiben möchten:
NOM wurde entwickelt, um Binärformate von Anfang an ordnungsgemäß zu analysieren. Im Vergleich zu den üblichen handgeschriebenen C -Parsers sind NOM -Parsers genauso schnell, frei von Pufferüberlaufschwachstellen und verarbeiten gemeinsame Muster für Sie:
Beispielprojekte:
Während Nom zunächst für ein binäres Format gemacht wurde, wurde es bald so gut mit Textformaten. Von leitebasierten Formaten wie CSV bis hin zu komplexeren, verschachtelten Formaten wie JSON kann NOM es verwalten und bietet Ihnen nützliche Tools:
Beispielprojekte:
Während die Programmiersprache Parser in der Regel für mehr Flexibilität und Leistung manuell geschrieben werden, kann NOM (und wurde erfolgreich) als Prototyping -Parser für eine Sprache verwendet.
NOM wird Sie schnell mit leistungsstarken benutzerdefinierten Fehlertypen beginnen, die Sie mit NOM_Locate nutzen können, um die genaue Zeile und Spalte des Fehlers zu bestimmen. Keine Notwendigkeit für separate Token-, Lexing- und Parsen -Phasen: NOM kann automatisch das Analysieren von Whitespace verarbeiten und ein AST an Ort und Stelle konstruieren.
Beispielprojekte:
Während viele Formate (und der Code, der sie bearbeitet) annehmen, dass sie die vollständigen Daten in den Speicher anpassen können, gibt es Formate, für die wir nur einen Teil der Daten gleichzeitig erhalten, z. B. Netzwerkformate oder riesige Dateien. NOM wurde für ein korrektes Verhalten mit Teildaten ausgelegt: Wenn nicht genügend Daten zur Entscheidung sind, wird NOM Ihnen mitgeteilt, dass es mehr benötigt, anstatt ein falsches Ergebnis stillschweigend zurückzugeben. Unabhängig davon, ob Ihre Daten vollständig oder in Stücken kommen, sollte das Ergebnis das gleiche sein.
Es ermöglicht Ihnen, leistungsstarke, deterministische Zustandsmaschinen für Ihre Protokolle zu erstellen.
Beispielprojekte:
Parser -Kombinatoren sind ein Ansatz für Parsers, der sich sehr von Software wie Lex und YACC unterscheidet. Anstatt die Grammatik in eine separate Datei zu schreiben und den entsprechenden Code zu generieren, verwenden Sie sehr kleine Funktionen mit sehr spezifischem Zweck, z. Erkennen Sie 'http', dann einen Raum, dann eine Version ". Der resultierende Code ist klein und sieht aus wie die Grammatik, die Sie mit anderen Parser -Ansätzen geschrieben hätten.
Dies hat einige Vorteile:
Nom -Parsers sind für:
&[u8]
und Parser werden in Byte-Array-Scheiben so viel wie möglich arbeiten (sind jedoch nicht auf sie beschränkt) Einige Benchmarks sind auf Github erhältlich.
Die 7.0 -Serie von NOM unterstützt RustC Version 1.56 oder mehr .
Die aktuelle Richtlinie ist, dass dies nur in der nächsten großen NOM -Veröffentlichung aktualisiert wird.
NOM ist auf crate.io erhältlich und kann in Ihrem von Fracht fähigen Projekt wie folgt aufgenommen werden:
[ dependencies ]
nom = " 7 "
Es gibt einige Zusammenstellungsfunktionen:
alloc
: (standardmäßig aktiviert) Wenn NOM deaktiviert ist, kann NOM in no_std
-Builds ohne Speicherballokatoren arbeiten. Wenn dies aktiviert ist, sind Kombinatoren, die (wie many0
) zuweisenstd
: (standardmäßig aktiviert, auch alloc
aktiviert) Wenn deaktiviert wird, kann NOM in no_std
-Builds arbeitenSie können diese Funktionen wie diese konfigurieren:
[ dependencies . nom ]
version = " 7 "
default-features = false
features = [ " alloc " ]
Hier ist eine (nicht erschöpfende) Liste bekannter Projekte mit NOM:
Möchten Sie einen neuen Parser mit nom
erstellen? Hier finden Sie eine Liste der noch nicht implementierten Formate.
Möchten Sie Ihren Parser hier hinzufügen? Erstellen Sie eine Pull -Anfrage dafür!
Nom ist die Frucht der Arbeit vieler Mitwirkender im Laufe der Jahre, vielen Dank für Ihre Hilfe!