doc
Только либы
Денис
короче конрод у меня на линуксе просто не работал. примеры запускались, но был абсолютный рассинхрон элементов + ресайз окна просто ломал всё
Alexander
Да хаскель и то что-то имеет в запасе.
Alexander
Денис
хм
Денис
в июле того года
Alexander
Понял. Грустно.
Денис
да, я тогда искал на чём простенький интерфейс накидать. в итоге сделал гуй на рокете))))
Tuntz
коллеги, работал кто с nom?
Денис
тут таких много, так что просто спрашивай)
Tuntz
как протестировать тэг впереди и на основании этого выбрать парсер?
Tuntz
do_parse!(
...
packet: alt!(
tag!("getchallenge") => { |_| Packet::ChallengeRequest } |
tag!("connectResponse") => { |_| Packet::ConnectResponse } |
tag!("challengeResponse") => {
do_parse!(
id: read_cstring >>
(Packet::ChallengeResponse { id })
)
}
) »
...
Tuntz
так посылает на 3 буквы, пишет unexpected end of macro invocation
Alexander
@tapok_satan недельный апдейт по gui озвучь , plz
Cat
Денис
Alexander
Канбан? Это же типа электрона? Зачем он.
Loyd
Можно сделать
alt!(
do_parse!(
tag!("getchallenge" >>
(Packet::ChallengeRequest)
) |
... |
do_parse!(
tag!("challengeResponse") >>
id: read_csctring >>
(Packet::ChallengeResponse { id })
)
)
Berkus
Alexander
Alexander
Ну а relm вообще смотреть не стоит?
Денис
Денис
парсер — в смысле функцию, которая с номовская сигнатурой
Tuntz
Денис
ну почему, с ним
Loyd
Tuntz
Loyd
Я где-то так выкрутился, когда такая же проблема была
Tuntz
а если надо будет внятную ошибку выдавать?
Tuntz
после проверки тега, но в нужном парсере
Loyd
В случае, если тега нет?
Tuntz
не
Tuntz
если тег есть
Tuntz
но данные, которые дальше, невалидные
Tuntz
так он просто не сможет до конца применить парсер, и ошибка будет одинаковая
Tuntz
что тег левый, что payload
Loyd
Ну, ты о том, что alt будет дальше перебирать и поэтому ошибка одна всегда будет
Tuntz
ага
Денис
есть ещё свитч — https://docs.rs/nom/4.0/nom/macro.switch.html
Loyd
А вместо {} нельзя в alt? Ну, сразу tag!(...) => do_parse
Денис
но его наверное сложно тут будет применить
Loyd
Да нет, одинаково
Loyd
switch семантичнее, конечно
Loyd
Зря они в alt сделали форму с =>
Sergey
Loyd
Потому что с switch пересекается функциональность теперь
Tuntz
не-не-не, свитч про другое
Tuntz
к нему tag не прицепить
Loyd
А зачем он ему? Там делаешь take_while и потом свитч
Loyd
Чем тебе не тег
Loyd
А вот если надо tag_no_case, то да, сложнее
Tuntz
а если нет разделителя после тега?
Tuntz
здесь как раз нужна семантика "примени первый парсер, и если успешно, то примени второй парсер и верни его результат"
Tuntz
хм, есть идея
Tuntz
сделать отдельный енум PacketType
Tuntz
сначала альтом распарсить тег в PacketType, а потом свичом выбрать парсер на основе PacketType
Max
[Перевод] Как обновление Rust 1.26 ускорило мой код в три с лишним раза https://u.tmtm.ru/KE9UA
Berkus
Tuntz
Berkus
Loyd
Я тут смотря как грамматики описывают на этом nom. Скажем, в парсере glsl подход с alt + вложенными do_parse.
Tuntz
Loyd
Ага (
Loyd
А alt!( ... | tag!("a" => do_parse!) не работает?
Loyd
Короче, надо посмотреть реализацию alt
Loyd
Там ещё и тестов на эту альтернативную форму —> 0
Loyd
Там скобочка потерялась
Loyd
Ну, сейчас косяк в том, что альтернативная форма после => ожидает expr
Loyd
Поэтому там {do_parse!(...)} и не работает
Loyd
Не, не работает
Tuntz
загнал do_parse! в ф-ю, но она возвращает IResult, в отличие от остальных
Loyd
Все макросы-комбинаторы iresult же возвращают
Loyd
А чем тебе switch сейчас не подходит?
Tuntz
можно заставить все остальные замыкания возвращать IResult::Ok
Loyd
switch!(take_while!(is_alphabetic),
"somekek" => do_parse!(...) |
....
)
Tuntz