Пилю потихоньку свой генератор парсеров. Возникла маленькая проблема с обозначениями. Не знаю, какой синтаксис выбрать.Вот смотри, анон: я решил, что пусть каждая sequence у меня генерирует структуру, причем каждый capture будет полем в этой структуре. Например, вот такое parsing expression: p:"ab" q:("de" r:"fg" "hi") "jkl"распарсит входной текст вот в такую структуру: AnonymousStruct1 { p = "ab"; q = AnonymousStruct2 { r = "fg"; }; };Но в некоторых случаях я хочу распарсить данные не в анонимные структуры, а в свои собственные. Например, объявить где-нибудь: struct MyText { public string p; public Object q; }а потом добавить в мое parsing expression: p:"ab" q:("de" r:"fg" "hi") "jkl" -> MyTextи после парсинга получить MyText { p = "ab", q = AnonymousStruct }.Но я ленивый и не хочу сначала объявлять структуру, потом еще прописывать ее в parsing expression. Я хочу написать один раз: p:"ab" q:("de" r:"fg" "hi") "jkl" -> MyTextи чтоб генератор парсеров оттранслировал моё parsing expression в нечто такое: #region Generated struct MyText { public string p; public Object q; } class MyParser { public Object Parse(InputReader input) { ... тут используется MyText ... } } #endregionНо тут возникает проблема: что если некоторые структуры я захочу определить сам? Например, файл "InnerPart.cs" содержит вот такое: class InnerPart { public string r; }а файл "parsing-expression.peg" - вот такое: p:"ab" q:("de" r:"fg" "hi" -?> InnerPart) "jkl" -> MyTextИ мой генератор сгенерирует два класса: MyParser и MyText, а InnerPart импортирует.Это еще не все. У меня будут не только отдельные parsing expressions. Я смогу объединять их в правила: Expr = p:"ab" "+" q:"cd";Так вот, я хочу, чтобы имена правил также были именами типов. То есть, вот из этого примера генератор должен сгенерить нечто такое: struct Expr { public string p; public string q; } class Parser { public Object Parse(InputStream input) { ... } }Но тут опять возникает проблема: что если мне не понравится структура, которую сгенерил генератор, что если мне захочется самому прописать ее? Как обозначить, что структуру вот конкретно для этого правила не надо генерить, а надо импортировать? ExprOne = p:"ab" "+" q:"cd"; // struct ExprOne сгенерируется генератором ???ExprTwo??? = r:"ab" "-" s:"cd"; // класс ExprTwo будет импортироваться извнеИ я хочу сделать это обозначение единообразным и для имени правила, и для "xxx -> Struct".
БАМП
>>828963 (OP)> Пилю потихоньку свой генератор парсеровА тем временем:1) Сайты недописанные стоят2) Отчеты не доделаные, Настеньке неудобно3) В юните геометрия глючит4) Хаар каскады не обучены5) DL вместо дворников улицы еще не чистит6) В трекере на работе баги сединой обросли8) Проблема остановки не решена9) Программы на GO тормозят, виснут в дедлоках, молча не работают там, где надо работать или выходить с ошибкой10) Устройство не троттлит входящие события от моросящих датчиков, лагуетЗА РАБОТУ БЫДЛО!
Так вот чтоб это все рещить, и нужен генератор парсеров. На этом генераторе будет написан универсальный ЯП и куча DSL-ей, и можно будет строгать сайты и отчеты однострочниками, переписать юнитю и доказать его на этапе конпеляции, закрыть все баги в багтрекере и решить проблему остановки.
Все так говорят, а потом имеем яка без reentrancy, несовместимую залупу, перемежающую код парсер-генератора и яп, прямо как в PHP, парсек с бэктрекингом, работающий на пердячем паре хачкелистов. У меня еще не облазаным остается PEG, но как только выдастся необходимость, обязательно надену болотные резиновые сапоги, опыт подсказывает что там будет не зефир.> сайты и отчеты однострочниками> однострочникамиДля этого уже есть инструмент, wake up neo.
>>829010Тогда пиши сразу генератор генераторов парсеров, чего уж там.
>>829044Правильнее сначала универсальный ЯП написать.
>>829044А это мысль! Я ведь тогда могу не задумываться об обозначениях вообще, достаточно будет просто поменять строчку в генераторе генератора... Анон, ты гений! Мод, закрывай тред.
>>829042Вместо Яка есть Бизон, который умеет делать реентрант парсеры.> PHP> хачкельНинужно.> PEGВ треде PEG и обсуждается, лалка.
>>829042> Для этого уже есть инструмент, wake up neo. Покажи, как в одну строку сляпать интернет-магазин еды. И чтоб со счетчиком калорий.
БМАп
>>829010Хелло ворлд на твоем языке когда наконец увидим?
>>829145Сначала нужно генератор парсеров написать. Потом уже мой язык на нем. А для этого нужно решить вопрос с обозначениями. Как мне ту штуку обозначить, блджад?
О, я придумал. Пусть генератор генерит все структуры, какие ему нужно, но оборачивает их во что-нибудь вида #ifdef DONT_GEN_%s_STRUCT. И юзер будет управлять генерацией при помощи дефайнов. Да, наверно, так и сделаю.