NOM은 Rust로 작성된 Parser Combinators 라이브러리입니다. 목표는 속도 또는 메모리 소비를 손상시키지 않고 안전한 파서를 구축하는 도구를 제공하는 것입니다. 이를 위해, 그것은 Rust의 강력한 타이핑 및 메모리 안전을 사용하여 빠르고 올바른 파서를 생산하고, 대부분의 오류가 발생하기 쉬운 배관을 추상화 할 수있는 기능, 매크로 및 특성을 제공합니다.
Nom은 행복하게 파일에서 바이트를 꺼낼 것입니다 :)
16 진 컬러 파서 :
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 ,
}
) )
) ;
}
파서를 개발하는 데 도움이 필요한 경우 IRC (Libera, Geeknode, OFTC)에서 geal
Ping Geal, Libera IRC 또는 Gitter 채팅방에서 #nom-parsers
로 이동하십시오.
글을 쓰고 싶다면 :
NOM은 처음부터 이진 형식을 올바르게 구문 분석하도록 설계되었습니다. 일반적인 필기 C 파서에 비해 Nom Parsers는 버퍼 오버플로 취약점이 없으며 일반적인 패턴을 처리합니다.
예제 프로젝트 :
Nom은 처음에는 이진 형식으로 만들어졌지만 곧 텍스트 형식과도 잘 작동했습니다. CSV와 같은 라인 기반 형식에서 JSON과 같은 더 복잡한 중첩 형식에 이르기까지 Nom 은이를 관리하고 유용한 도구를 제공합니다.
예제 프로젝트 :
프로그래밍 언어 파서는 일반적으로 더 많은 유연성과 성능을 위해 수동으로 작성되지만 NOM은 언어의 프로토 타이핑 파서로 사용될 수 있습니다.
NOM은 강력한 사용자 정의 오류 유형으로 신속하게 시작하여 nom_locate를 사용하여 오류의 정확한 선과 열을 정확히 찾아 낼 수 있습니다. 별도의 토큰 화, Lexing 및 Parsing 단계가 필요하지 않습니다. NOM은 Shitespace 구문 분석을 자동으로 처리하고 AST를 제자리에 구축 할 수 있습니다.
예제 프로젝트 :
많은 형식 (및 코드 처리)은 메모리에 전체 데이터를 메모리에 맞출 수 있다고 가정하지만 네트워크 형식 또는 거대한 파일과 같은 데이터의 일부만 얻는 형식이 있습니다. NOM은 부분 데이터를 사용하여 올바른 동작을 위해 설계되었습니다. 결정하기에 충분한 데이터가 없으면 NOM은 잘못된 결과를 조용히 반환하는 대신 더 많은 것이 필요하다고 말할 것입니다. 데이터가 완전히 또는 청크에 있는지 여부에 관계없이 결과는 동일해야합니다.
그것은 당신이 당신의 프로토콜을위한 강력하고 결정적인 상태 기계를 구축 할 수있게합니다.
예제 프로젝트 :
Parser Combinators는 Lex 및 YACC와 같은 소프트웨어와는 매우 다른 Parsers에 대한 접근 방식입니다. 별도의 파일로 문법을 작성하고 해당 코드를 생성하는 대신 "5 바이트"또는 " 'http'라는 단어 인식"과 같은 매우 구체적인 목적으로 매우 작은 기능을 사용하여 의미있는 패턴으로 조립하십시오. " 'http', 공간, 버전을 인식하십시오. 결과 코드는 작고 다른 파서 접근 방식으로 작성했을 문법처럼 보입니다.
여기에는 몇 가지 장점이 있습니다.
Nom Parsers는 다음과 같습니다.
&[u8]
이며 파서는 바이트 어레이 슬라이스에서 가능한 한 많이 작동하지만 이에 국한되지는 않습니다. 일부 벤치 마크는 Github에서 사용할 수 있습니다.
7.0 시리즈의 NOM은 Rustc 버전 1.56 이상을 지원합니다.
현재 정책은 이것이 다음 주요 NOM 릴리스에서만 업데이트된다는 것입니다.
NOM은 Crates.io에서 사용할 수 있으며 다음과 같은화물 활성화 프로젝트에 포함될 수 있습니다.
[ dependencies ]
nom = " 7 "
몇 가지 컴파일 기능이 있습니다.
alloc
: (기본적으로 활성화) 비활성화 된 경우 NOM은 메모리 할당자가없는 no_std
빌드에서 작동 할 수 있습니다. 활성화 된 경우 ( many0
과 같은) 할당하는 콤비네이터를 사용할 수 있습니다.std
: (기본적으로 활성화, alloc
도 활성화) 비활성화 된 경우 NOM은 no_std
빌드에서 작동 할 수 있습니다.다음과 같은 기능을 구성 할 수 있습니다.
[ dependencies . nom ]
version = " 7 "
default-features = false
features = [ " alloc " ]
다음은 NOM을 사용하여 알려진 프로젝트의 (철저한) 목록입니다.
nom
사용하여 새 파서를 만들고 싶습니까? 아직 구현되지 않은 형식 목록은 여기에서 확인할 수 있습니다.
여기에 파서를 추가하고 싶습니까? 풀 요청을 작성하십시오!
Nom은 수년 동안 많은 기고자들의 작품의 결실입니다. 여러분의 도움에 감사드립니다!