Nom é uma biblioteca de combinadores de analisador escrita em ferrugem. Seu objetivo é fornecer ferramentas para criar analisadores seguros sem comprometer a velocidade ou o consumo de memória. Para esse fim, ele usa extensivamente a forte segurança de digitação e memória da Rust para produzir analisadores rápidos e corretos e fornece funções, macros e características para abstrair a maior parte do encanamento propenso a erros.
O NOM ficará feliz em tirar um byte de seus arquivos :)
Analisador de cores 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 ,
}
) )
) ;
}
Se você precisar de ajuda para desenvolver seus analisadores, por favor, faça um ping geal
no IRC (libera, geeknode, oftc), vá para #nom-parsers
no libera irc ou na sala de bate-papo Gitter.
Se você quiser escrever:
O NOM foi projetado para analisar adequadamente os formatos binários desde o início. Comparados aos analisadores C usuais, os analisadores nomes são tão rápidos, livres de vulnerabilidades de buffer de transbordamento e lidam com padrões comuns para você:
Exemplo de projetos:
Enquanto o NOM foi feito para formato binário a princípio, logo cresceu para funcionar tão bem com formatos de texto. De formatos baseados em linha como CSV, a formatos mais complexos e aninhados, como o JSON, o NOM pode gerenciá -lo e fornece ferramentas úteis:
Exemplo de projetos:
Embora os analisadores de linguagem de programação sejam geralmente escritos manualmente para obter mais flexibilidade e desempenho, o NOM pode ser (e foi usado com sucesso) como um analisador de prototipagem para um idioma.
O NOM o iniciará rapidamente com poderosos tipos de erro personalizados, que você pode aproveitar com o NOM_LOCATE para identificar a linha e a coluna exatas do erro. Não há necessidade de fases de tokenização, lexing e análise separadas: o NOM pode lidar automaticamente com o espaço em branco e construir um AST no lugar.
Exemplo de projetos:
Embora muitos formatos (e o código deles lidando com eles) assumam que eles podem se ajustar aos dados completos na memória, existem formatos para os quais obtemos apenas uma parte dos dados de uma só vez, como formatos de rede ou arquivos enormes. O NOM foi projetado para um comportamento correto com dados parciais: se não houver dados suficientes para decidir, o NOM dirá que precisará de mais em vez de retornar silenciosamente um resultado errado. Se seus dados são inteiramente ou em pedaços, o resultado deve ser o mesmo.
Ele permite que você construa máquinas de estado poderosas e determinísticas para seus protocolos.
Exemplo de projetos:
Os combinadores de analisador são uma abordagem dos analisadores que é muito diferente de software como Lex e YACC. Em vez de escrever a gramática em um arquivo separado e gerar o código correspondente, você usa funções muito pequenas com um propósito muito específico, como "Take 5 bytes" ou "Reconheça a palavra 'http'", e montá -los em padrões significativos como " Reconheça 'http', depois um espaço, depois uma versão ". O código resultante é pequeno e se parece com a gramática que você teria escrito com outras abordagens de analisador.
Isso tem algumas vantagens:
Os pastores nomes são para:
&[u8]
e os analisadores funcionarão o máximo possível em fatias de matriz de bytes (mas não se limitam a eles) Alguns benchmarks estão disponíveis no Github.
A série 7.0 do NOM suporta RustC versão 1.56 ou superior .
A política atual é que isso será atualizado apenas no próximo grande lançamento do NOM.
O NOM está disponível em Crates.io e pode ser incluído em seu projeto de carga ativado como este:
[ dependencies ]
nom = " 7 "
Existem alguns recursos de compilação:
alloc
: (ativado por padrão) Se desativado, o NOM pode funcionar no no_std
construir sem alocadores de memória. Se ativado, os combinadores que alocam (como many0
) estarão disponíveisstd
: (ativado por padrão, ativa alloc
também) se desativado, o NOM pode funcionar no no_std
BuildsVocê pode configurar esses recursos como este:
[ dependencies . nom ]
version = " 7 "
default-features = false
features = [ " alloc " ]
Aqui está uma lista (não exaustiva) de projetos conhecidos usando o NOM:
Deseja criar um novo analisador usando nom
? Uma lista de formatos ainda não implementados está disponível aqui.
Quer adicionar seu analisador aqui? Crie uma solicitação de tração para isso!
Nom é fruto do trabalho de muitos colaboradores ao longo dos anos, muito obrigado pela sua ajuda!