Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Нет. Просто не могу иначе объяснить проблему с элементарными вещами. Написать простейший LL парсер проще и быстрее, чем рукопашный непонятный парсер лопатить, а потом годами вылавливать из него баги.
Ну, ок, возможно. Где бы еще посмотреть на что-то такое готовое, чтобы понять, как оно делается
M>>2) Тесты — хм. На них нет времени.
НС>Мне надо повторить тезис про технологический уровень?
Технологический уровень — как самоцель?
M>>4) Вот примерАвтор: Marty
Дата: 10.09.20
исходника на моём языке. Он сейчас вполне всех устраивает. Если тебе не сложно, не мог бы ты коротенько написать, как бы ты сделал его разбор? Ну, и как можно улучшить сам язык
НС>Зачем там знаки $ и #?
$ — признак директивы
# — комент
// — тоже комент
#!rdlc в начале — шебанг
НС>Что в нем такого, чего нельзя описать на yaml или json примерно теми же усилиями? Зачем тут вообще DSL, если, за исключением разве импортов да typedef, это простейшая древовидная структура? Если основные потребители — те кто использует плюсы и шарп, то зачем было изобретать свой нестандартный синтаксис? ?#!rdlc в начале зачем? Чем отличается include от import?
$include — это просто текстуальное включение внешнего файла, как в сишечке
$import — импорт другого устройства. Например, в роботе несколько плат, но пульт общается с одной мастер платой, однако ему нужно смотреть регистры других плат. Тогда мастер-плата их форвардит, включая регистры дочернего устройства (причем только нужные в данном устройстве, для экономии адресов). Что-то типа наследования в плюсах
| Пример |
| // Импортируемое устройство:
----
#!rdlc
$once
$type [format="#08b";generator=cpp:flags;generator=csharp:enum] SafetyStatusBits : u, 32 - "Биты внутреннего регистра Safety Status"
CELL_UNDERVOLTAGE : 1 << 0
$end_type
$type OtherSampleType : u32 - "Просто шляпа для примера"
thrill : 1<<5
fear : 1<<6
shake : 0x12<<7
fly : 'BF'
or : shake | creep | bit 12
CELL_UNDERVOLTAGE : ~(shake | SafetyStatusBits:CELL_UNDERVOLTAGE | 1<<6) - "Вытащил константу из другого типа. Ну, тут можно было наверно как в C++ сделать ::"
$end_type
$device "driver" - Драйвер
$namespace rw
$group
[tag=speed] speed_ctrl : s8 - скорость в % от -100 до 100
position_ctrl : u16 - позиция в градусах
$namespace ro
$group
[public] public : u8 - public
[protected] protected : u8 - protected
[private] private : u8 - private
$group Group A
[tag=speed] speed : s8 - текущая скорость в % от -100 до 100
position : u16 - позиция
$group [tag=status] Group B
temperature : u8 - температура мотора
current : s8 - текущий ток в % от -100 до 100
status : u8 - состояние драйвера, битовое поле ошибок
----
// Импортирующее устройство:
----
#!rdlc
$device "robot" - Робот Хоббот-Боббот
$import "driver" from "driver.rdl" as "Public1" prefix "pub1_" - Import public
$import [public] "driver" from "driver.rdl" as "Public2" prefix "pub2_" - Import public explicit
$import [protected] "driver" from "driver.rdl" as "Protected" prefix "prot_" - Import protected
$import [private] "driver" from "driver.rdl" as "Private" prefix "priv_" - Import private
$import [tag=speed] "driver" from "driver.rdl" as "Speed" prefix "speed_imp_" - Import speed by tag
$import [tag=status] "driver" from "driver.rdl" as "Status" prefix "status_imp_" - Import status by tag
$import [tag=speed,status] "driver" from "driver.rdl" as "SpeedStatus" prefix "speed_status_imp_" - Import speed and status by tag
$import [tag=speed;tag=status] "driver" from "driver.rdl" as "SpeedStatus2" prefix "speed_status_imp2_" - Import speed and status by tag - multiple tag attribute
----
|
| |
НС>Что касается улучшения — очень сложно тебе что то посоветовать не варясь в вашей предметной области и не понимая смысла написанного. Если совсем обще — я бы убрал весь визуальный мусор, все эти ненужные значки, ввел бы нормальный конец строки и отказался от бейсиковых слешей для переноса.
Не обижай сишечный символ продолжения строки
На самом деле это было добавлено в самом конце, и стоило полкопейки. В результате развития хотелок пользователей добавились атрибуты (типа шарповых), и строки стали длинноваты, поэтому для удобства и добавил этот перенос.
НС>Синтаксис взял бы стандартный сишный. Сделал бы язык попонятнее — какие то префиксы в импорте, которых ниже по тексту нет, какой то ro, какие то неймспейсы сами по себе не ясно к чему относящиеся. Куча underscores.
Ну, у нас в протоколе все регистры делятся на два неймспейса — ReadOnly — статусные, и RW — управляющие
Сишный синтаксис — ну, такое. Например, я делал $typedef u32 uint32_t, ими 0 человек пользуется.
Язык для нас вполне понятный. Префиксы — это если в текущем и импортируемом устройстве есть одинаковые регистры, то при импорте можно задать префикс, чтобы не было ошибок.
НС>generator=cpp:struct как бы намекает, что вместе с целевой областью тут какая то мешанина инструкций для процессинга, зачем оно там? В той секции что капсами — куча повторяющихся слов.
Сразу видно, что это будет в целевом языке. Удобно. Мне и части коллег удобно так, другие задают всё в командной строке.
Про капс. Сишный коллега видно из кода дефайны тупо скопипастил, потому и капс. Повторяющихся — нет. Это параметры работы, на которой у нас BMS аккума сделан.
НС><< это что? Распиновка? >> может там быть? Если нет, то ты зря направленную, да еще и двойную лексему использовал. Достаточно симметричного значка типа -. Почему там слева везде только 1? Там может быть что то другое? Часто?
Это сдвиг, как в сишечке. Везде единичка — потому что это одиночные биты, другое тоже может быть, но редко. Обычно если нужна маска из нескольких бит, то обычно по or ('|') объединяются несколько ранее описанных битовых констант
НС>$typedef u8 : bool. По смыслу — новый тип u8, идентичный bool.
Нет. Новый тип bool, идентичный u8, как в сишечке.
НС>А судя по тому что ниже — наоборот.
А это паскалевский стиль. Тип переменной можно опустить, тогда будет принят u8, как самый часто встречающийся. Ну, некоторая нелогичность наверное есть, но вот никто, кроме тебя, не обращал внимания. Вообще, по языку вопросов никто не задавал, по языку — только хотелки, вопросы только по опциям командной строки возникают