- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
rule_t block_r = ch_p('{') >> *(~ch_p('}') | (~ch_p('{') >> block_r));
rule_t bin_r = str_p("0b") >> bin_p[assign(m)];
rule_t hex_r = str_p("0x") >> hex_p[assign(m)];
rule_t dec_r = uint_p[assign(m)];
rule_t id_r = alpha_p >> *(alnum_p | ch_p('_') | ch_p('.'));
rule_t string_r = ch_p('"') >> (*(~ch_p('"')))[assign(s)] >> ch_p('"');
rule_t channel_r = str_p("channel") >> *(space_p) >> id_r[assign(s)][assign_a(ch.name,s)][push_back_a(lstJSVars_,s)] >> *(space_p) >> ch_p('{') >>
*(space_p
| (str_p("mode") >> *(space_p) >> ch_p('=') >> *(space_p) >>
(str_p("in")[assign_a(ch.mode,(int)channel::IN)] | str_p("out")[assign_a(ch.mode,(int)channel::OUT)]) >> *(space_p) >> ch_p(';'))
| (str_p("number") >> *(space_p) >> ch_p('=') >> *(space_p) >> int_p[assign(ch.number)] >> *(space_p) >> ch_p(';'))
| (str_p("channel") >> *(space_p) >> ch_p('=') >> *(space_p) >> int_p[assign(ch.ch)] >> *(space_p) >> ch_p(';'))
| (str_p("gain") >> *(space_p) >> ch_p('=') >> *(space_p) >> int_p[assign(ch.gain)] >> *(space_p) >> ch_p(';'))
| (str_p("type") >> *(space_p) >> ch_p('=') >> *(space_p) >>
(str_p("analog")[assign_a(ch.type,(int)channel::ANALOG)] | str_p("discrete")[assign_a(ch.type,(int)channel::DISCRETE)]) >> *(space_p) >> ch_p(';'))
| (str_p("mask") >> *(space_p) >> ch_p('=') >> *(space_p) >>
(bin_r[assign_a(ch.mask,m)] | hex_r[assign_a(ch.mask,m)] | dec_r[assign_a(ch.mask,m)]) >> *(space_p) >> ch_p(';'))
) >>
ch_p('}') >> *(space_p) >> ch_p(';');
rule_t device_r = str_p("device_info") >> *(space_p) >> id_r[assign(dev_info_.name)] >> *(space_p) >> ch_p('{') >>
*(space_p |
(str_p("device") >> *(space_p) >> ch_p('=') >> *(space_p) >> string_r[assign_a(dev_info_.dev,s)] >> *(space_p) >> ch_p(';')) |
(str_p("blocking") >> *(space_p) >> ch_p('=') >> *(space_p) >>
(str_p("true")[assign_a(dev_info_.blocking,true)] | str_p("false")[assign_a(dev_info_.blocking,false)]) >> *(space_p) >> ch_p(';')) |
(str_p("freq_ch") >> *(space_p) >> ch_p('=') >> *(space_p) >> int_p[assign(dev_info_.freq_ch)] >> *(space_p) >> ch_p(';')) |
(str_p("freq_sel_ch") >> *(space_p) >> ch_p('=') >> *(space_p) >> int_p[assign(dev_info_.freq_sel_ch)] >> *(space_p) >> ch_p(';')) |
(str_p("speed") >> *(space_p) >> ch_p('=') >> *(space_p) >> int_p[assign(dev_info_.speed)] >> *(space_p) >> ch_p(';')) |
channel_r[assign_a(v,ch)][push_back_a(lstChannels_,v)]
) >>
ch_p('}') >> *(space_p) >> ch_p(';');
rule_t var_r = (str_p("var") >> *(space_p) >> id_r[assign(s)][push_back_a(lstJSVars_,s)] >>*(~ch_p(';')) >> ch_p(';'))[assign(s)][push_back_a(lstVars,s)];
rule_t function_r = str_p("function") >> *(~ch_p('`'));
//rule_t function_r = str_p("function") >> *(~ch_p('{')) >> block_r;
rule_t script_r = str_p("script") >> *(space_p) >> ch_p('{') >>
*(space_p |
var_r[assign(s)][push_back_a(lstJSVars_,s)] |
(function_r[assign(s)][push_back_a(lstFunc,s)] >> *(space_p) >> ch_p('`'))
) >>
ch_p('}') >> *(space_p) >> ch_p(';');
Noodles 21.01.2022 19:12 # +1
guest6 21.01.2022 19:24 # 0
bormand 21.01.2022 19:25 # 0
guest6 21.01.2022 19:26 # 0
Noodles 21.01.2022 19:36 # 0
Хорошо, что я не дописал похожую штуку для петона. Сперва я думал, что будет красиво.
codemeow 21.01.2022 19:35 # +1
bormand 21.01.2022 19:37 # 0
guest6 21.01.2022 19:48 # 0
а писаемо?
bormand 21.01.2022 19:53 # 0
Надо руку набить и немного выпить для храбрости... И самое главное -- не смотреть вниз на ошибки конпелятора.
Если с [action'ами] сильно не выёбываться и правила более-менее внятно называть, то пишется вполне норм.
guest6 21.01.2022 19:56 # 0
codemeow 21.01.2022 19:58 # 0
bormand 21.01.2022 20:00 # 0
guest6 21.01.2022 20:07 # 0
>мелкий конфиг
вооот! Какой-нить "ini" файл я бы и сам на спирите запилил, но ведь тут совсем что-то страшное.
Кстати, современные конфиги можно хранить в yaml/toml/xml/json и не писать парсер вооще
bormand 21.01.2022 20:07 # 0
Дык это и есть BNF, просто обмазанный крестоговном и с ограничениями типичного LL парсера...
guest6 21.01.2022 20:11 # 0
Но я предвзят: спирит я трогал один раз из интереса, а BNF мне часто встречался в описании всяких говноформатов протоколов, и я как-то привык
bormand 21.01.2022 20:15 # 0
guest6 21.01.2022 20:18 # 0
* пишешь BNF
* тула генерит тебе по нему код
Ну как бизон например. Другой вопрос, что код получается говеный, и его нужно обмазывать потом удодным API
bormand 21.01.2022 20:19 # 0
И что этот код сможет сделать помимо проверки синтаксиса? Всё равно какие-то расширения BNF нужны в духе экшенов [спирта] или {бизона}. Голый BNF только для документации пригоден.
guest6 21.01.2022 20:27 # 0
Примерно как бы ты парсил XML со схемой.
Это не подойдет для настоящего парсера наверное, но для конфига может.
(тут надо спизднуть что-то умное про грамматики и иерархию Хомски, наверное)
bormand 21.01.2022 20:31 # 0
Фублядь, фунахуй... Зачем мне описывать грамматику, которая мапается на какое-то json-подобное говнище, которое потом руками дальше парсить? Если уж юзать инструмент, так по-нормальному...
guest6 21.01.2022 20:32 # 0
А зачем? Ну если это key value, то чому бы и нет?
Если же ты хочешь настоящий парсер, который умеет найши ошибку, подсветить, и сказать "питух экспектд", то конечно надо вшивать в него умный код, и тут без экшенов не абойтись
bormand 21.01.2022 20:35 # 0
А где генератор в голом BNF найдёт типы? Свои какие-то от балды напихает, чтобы мне потом их в осмысленные загонять и доделывать работу руками за него?
guest6 21.01.2022 20:39 # 0
ну типа итак
это енум Letter
итд
>тобы мне потом их в осмысленные загонять
Так и было сказано:
>Другой вопрос, что код получается говеный, и его нужно обмазывать потом удодным API
А еще было сказано, что это подходит для конфигов (где все довольно тупо) но не для парсеров.
Блин, какой ты капризный. У меня на работе жабаёбы длиннющщие JSONы вручную парсят какой-то хуйней типа
и не жужжат
bormand 21.01.2022 20:45 # 0
Я просто не понимаю, нахуя закручивать шурупы шуроповёртом как отвёрткой, так и не разобравшись, что его можно включить и он будет закручивать всё сам...
Noodles 21.01.2022 20:42 # 0
Хотя мне ближе ручной процедурный подход.
bormand 21.01.2022 20:44 # 0
Из говна и палок? А если я могу как-то управлять упаковкой распарсенного говна в нужные мне типы, поля и т.п., то это уже расширенный BNF, как в спирте или бизоне.
ISO 21.01.2022 21:11 # 0
Хочу я конфиг — беру «pydantic» и теку от строго типизированной конфигурации с нулевым бройлерплейтом:
Там даже «parse_file()» есть, если лень файл читать.
bormand 21.01.2022 21:13 # 0
ISO 21.01.2022 21:17 # 0
Можно сделать «parse_obj()», передав туда любой питоний словарик; словарик можешь парсить откуда угодно.
bormand 21.01.2022 21:18 # 0
Тем, что хипстерскую парашу для сериализации все почему-то начали юзать в качестве человекочитаемых конфигов.
А там ведь даже комментов нету.
Noodles 21.01.2022 21:18 # 0
Noodles 21.01.2022 21:22 # 0
Отделяет синтакс от сёмантики.
bormand 21.01.2022 21:23 # 0
Имена параметров он где возьмёт? Как он поймёт, какие элементы мне надо сохранить, а какие просто кусок синтаксиса? Как он поймёт, какие типы назначить этим параметрам (я не хочу допарсивать каждый инт потом)?
В голом BNF ничего из этого нет, емнип.
Noodles 21.01.2022 21:26 # 0
guest6 21.01.2022 21:30 # 0
ключи известны заранее
Как бы ты его распарсил?
bormand 21.01.2022 21:35 # +1
guest6 21.01.2022 21:44 # 0
Я писал парсер и лексер для гнуснёвой командлайны на жабе
Ну точнее я просто взял JFlex и там нахучил
bormand 21.01.2022 21:56 # 0
guest6 21.01.2022 21:59 # +3
Именно потому каждая виндовая тула имеет СВОЙ синтаксис для аргументов, и каждый из них отвратителен по своему
А ты же читал статью "Everyone quotes command line arguments the wrong way" ?
bormand 21.01.2022 22:04 # 0
HoBorogHuu_nemyx 22.01.2022 08:54 # 0
bormand 22.01.2022 15:55 # 0
bormand 21.01.2022 21:40 # 0
bormand 21.01.2022 20:09 # 0
Ну х.з., yaml ещё ничего, но за конфиги в json или xml мне хочется убивать.
guest6 21.01.2022 20:15 # 0
Я тут давеча попал на сервер убунту, и а там netplan. Я его исправил, говорю ``netplan try --debug``, а он говорит "хуй", а что хуй не поясняет.
Правда ямл не виноват: там оказалось, что он ждал листа (который в ямле через "-" или в скобках) а я ему туда литерал хуйнул.
json действительно отвратителен, но к сожалению на нем уже дохуя всего, например докер, и вроде эти ваши VSCode?
XML хорошо поддерживает вложенность, есть стандарт для референсов, его можно програмно спарснуть на любом языке, итд.
Проблема его только в вербозности. Использовать XML для пары key-value -- тупо.
Мне XML легче читать, чем JSON, но это тоже моя деформация
bormand 21.01.2022 20:17 # 0
Python я не люблю. При серьёзном уровне вложенности приходится писать код в правом углу моника.
Вообще говоря, он обратно совместим с json. Так что можешь скобочками обмазать в некоторых местах.
guest6 21.01.2022 20:19 # 0
А может, и в ямле можно? Я может лалка анскильная?
> Так что можешь скобочками обмазать.
Спасибо, не хочу.
Хачу чтобы чтобы вместо неплана были interfaces как в debian. Там свой говноформат, очень простой
bormand 21.01.2022 20:28 # 0
С натяжкой, там есть ссылки. И если в твоём формате есть какие-то места, на которые парсеру пофиг, то там можно &складывать блоки и *ссылаться на них из других мест.
HoBorogHuu_nemyx 21.01.2022 20:54 # 0
https://ru.m.wikipedia.org/wiki/JSON-LD
bormand 21.01.2022 20:55 # 0
Пиздец, какой-то XML с неймспейсами там замутили...
HoBorogHuu_nemyx 21.01.2022 21:16 # 0
Noodles 21.01.2022 20:32 # 0
Кстати тут больше никаких операций не определяется, я бы вместо токого дерьма нагородил бы простенький дсльчик.
guest6 21.01.2022 20:35 # 0
можно как-то так наибать JS, чтоб можно было написать
или нет?
Noodles 21.01.2022 21:04 # +2
guest6 21.01.2022 19:26 # 0
Noodles 21.01.2022 19:40 # +1
Опять говно,
Снова выход на бис,
Плетёт лапшу генерено
За чертою кулис.
HoBorogHuu_nemyx 21.01.2022 19:46 # +1
Докомпилю,
Но уже не спеша
Я вижу, как
Берёт разбег
Лапша.
guest6 21.01.2022 19:48 # 0
Опять грачи
bormand 21.01.2022 20:58 # 0
Опять лечить
HoBorogHuu_nemyx 21.01.2022 21:18 # 0
Опять оффтоп...
3.14159265 22.01.2022 00:52 # 0
Опять говном.
Nyanwitt 22.01.2022 03:11 # +1
Понабежали как глисты
Rooster 24.01.2022 12:01 # 0
guest6 24.01.2022 13:07 # +1