NOM - это библиотека комбинаторов анализаторов, написанная в Rust. Его цель состоит в том, чтобы предоставить инструменты для создания безопасных анализаторов без ущерба для скорости или потребления памяти. С этой целью он использует сильную печати Руста и безопасность памяти для производства быстрых и правильных анализаторов, а также предоставляет функции, макросы и признаки, чтобы абстрагировать большую часть сантехники склонности к ошибкам.
Ном с радостью возьмет байт из ваших файлов :)
Шестнадцатеричный цветовой анализатор:
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 ,
}
) )
) ;
}
Если вам нужна помощь в разработке ваших анализаторов, пожалуйста, пинг- geal
на IRC (Libera, Geeknode, OFTC), перейдите к #nom-parsers
на Libera IRC или в чате-комнате с друтком.
Если вы хотите написать:
NOM был разработан для правильного разбора бинарных форматов с самого начала. По сравнению с обычными рукописными аналогичными анализаторами, анализаторы Nom так же быстры, свободны от уязвимостей переполнения буфера и обрабатывают для вас общие закономерности:
Пример проектов:
В то время как NOM был сделан для бинарного формата поначалу, вскоре он работал так же хорошо с форматами текста. От форматов на основе линий, таких как CSV, до более сложных, вложенных форматов, таких как JSON, NOM может управлять им, и предоставляет вам полезные инструменты:
Пример проектов:
В то время как анализаторы языка программирования обычно пишутся вручную для большей гибкости и производительности, NOM может (и успешно) используется в качестве прототипирования анализатора для языка.
NOM быстро запустит вас с мощными пользовательскими типами ошибок, которые вы можете использовать с помощью NOM_LOCATE, чтобы определить точную строку и столбец ошибки. Нет необходимости в отдельных этапах токенизации, лексинга и диапазона: NOM может автоматически обрабатывать диапазон пробелов и построить AST на месте.
Пример проектов:
В то время как многие форматы (и код обращаются с ними) предполагают, что они могут соответствовать полным данным в памяти, есть форматы, для которых мы получаем только часть данных одновременно, например, форматы сети или огромные файлы. NOM был разработан для правильного поведения с частичными данными: если не хватает данных, чтобы решить, NOM скажет вам, что ему нужно больше, вместо того, чтобы молча вернуть неправильный результат. Независимо от того, поступают ли ваши данные полностью или в кусках, результат должен быть таким же.
Это позволяет вам создавать мощные, детерминированные государственные машины для ваших протоколов.
Пример проектов:
Комбинаторы анализаторов - это подход к анализаторам, который сильно отличается от программного обеспечения, такого как Lex и YACC. Вместо того, чтобы записать грамматику в отдельном файле и генерировать соответствующий код, вы используете очень небольшие функции с очень специфической целью, например, «Take 5 байтов» или «распознавать слово« http »и собирать их по значимым шаблонам, как», такие как » Признайте «http», затем пространство, затем версия ». Полученный код маленький, и выглядит как грамматика, которую вы бы написали с другими подходами анализатора.
Это имеет несколько преимуществ:
Стоимость парсеров для:
&[u8]
и анализаторы будут работать как можно больше на ломтиках байтовых массивов (но не ограничиваются им) Некоторые тесты доступны на GitHub.
Серия NOM 7.0 поддерживает Rustc версию 1.56 или более .
Текущая политика заключается в том, что это будет обновлено только в следующем крупном выпуске Nom.
Nom доступен на Crates.io и может быть включен в ваш проект с поддержкой груза, подобный этим:
[ dependencies ]
nom = " 7 "
Есть несколько функций компиляции:
alloc
: (активируется по умолчанию) Если отключен, NOM может работать в no_std
сборки без распределителей памяти. Если включено, комбинаторы, которые выделяют (например, many0
) будут доступныstd
: (активируется по умолчанию, активирует также alloc
), если отключен, NOM может работать в no_std
BUILDSВы можете настроить эти функции, подобные этим:
[ dependencies . nom ]
version = " 7 "
default-features = false
features = [ " alloc " ]
Вот (не исчерпывающий) список известных проектов, использующих NOM:
Хотите создать новый анализатор, используя nom
? Список еще не реализованных форматов доступен здесь.
Хотите добавить здесь анализатор? Создайте запрос на это!
NOM - это плод работы многих участников за эти годы, большое спасибо за вашу помощь!