[Ответить в тред] Ответить в тред

16/08/16 - Запущен Двач Трекер
01/08/16 - Вернули возможность создавать юзердоски
09/07/16 - Новое API для капчи - внимание разработчикам приложений



Новые доски: /obr/ - Offline Battle Rap • /hv/ - Халява в интернете • /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 13 | 2 | 4
Назад Вниз Каталог Обновить

Дизайн синтаксиса Аноним 27/08/16 Суб 19:50:07  828963  
14723166079260.png (90Кб, 500x279)
Пилю потихоньку свой генератор парсеров. Возникла маленькая проблема с обозначениями. Не знаю, какой синтаксис выбрать.

Вот смотри, анон: я решил, что пусть каждая 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".
Аноним 27/08/16 Суб 20:27:51  828986
БАМП
Аноним 27/08/16 Суб 20:43:56  828994
14723198365610.jpg (41Кб, 450x350)
>>828963 (OP)
> Пилю потихоньку свой генератор парсеров
А тем временем:

1) Сайты недописанные стоят
2) Отчеты не доделаные, Настеньке неудобно
3) В юните геометрия глючит
4) Хаар каскады не обучены
5) DL вместо дворников улицы еще не чистит
6) В трекере на работе баги сединой обросли
8) Проблема остановки не решена
9) Программы на GO тормозят, виснут в дедлоках, молча не работают там, где надо работать или выходить с ошибкой
10) Устройство не троттлит входящие события от моросящих датчиков, лагует

ЗА РАБОТУ БЫДЛО!
Аноним 27/08/16 Суб 21:21:48  829010
Так вот чтоб это все рещить, и нужен генератор парсеров. На этом генераторе будет написан универсальный ЯП и куча DSL-ей, и можно будет строгать сайты и отчеты однострочниками, переписать юнитю и доказать его на этапе конпеляции, закрыть все баги в багтрекере и решить проблему остановки.
Аноним 27/08/16 Суб 22:09:25  829042
Все так говорят, а потом имеем яка без reentrancy, несовместимую залупу, перемежающую код парсер-генератора и яп, прямо как в PHP, парсек с бэктрекингом, работающий на пердячем паре хачкелистов. У меня еще не облазаным остается PEG, но как только выдастся необходимость, обязательно надену болотные резиновые сапоги, опыт подсказывает что там будет не зефир.
> сайты и отчеты однострочниками
> однострочниками
Для этого уже есть инструмент, wake up neo.
Аноним 27/08/16 Суб 22:12:11  829044
>>829010
Тогда пиши сразу генератор генераторов парсеров, чего уж там.
Аноним 27/08/16 Суб 22:13:58  829045
>>829044
Правильнее сначала универсальный ЯП написать.
Аноним 27/08/16 Суб 22:14:33  829047
>>829044
А это мысль! Я ведь тогда могу не задумываться об обозначениях вообще, достаточно будет просто поменять строчку в генераторе генератора... Анон, ты гений! Мод, закрывай тред.
Аноним 27/08/16 Суб 22:32:05  829059
>>829042
Вместо Яка есть Бизон, который умеет делать реентрант парсеры.
> PHP
> хачкель
Нинужно.
> PEG
В треде PEG и обсуждается, лалка.
Аноним 27/08/16 Суб 22:49:30  829071
>>829042
> Для этого уже есть инструмент, wake up neo.
Покажи, как в одну строку сляпать интернет-магазин еды. И чтоб со счетчиком калорий.
Аноним 27/08/16 Суб 23:54:15  829098
БМАп
Аноним 28/08/16 Вск 01:55:42  829145
>>829010
Хелло ворлд на твоем языке когда наконец увидим?
Аноним 28/08/16 Вск 15:43:15  829508
>>829145
Сначала нужно генератор парсеров написать. Потом уже мой язык на нем. А для этого нужно решить вопрос с обозначениями. Как мне ту штуку обозначить, блджад?
Аноним 29/08/16 Пнд 19:13:36  830575
О, я придумал. Пусть генератор генерит все структуры, какие ему нужно, но оборачивает их во что-нибудь вида #ifdef DONT_GEN_%s_STRUCT. И юзер будет управлять генерацией при помощи дефайнов. Да, наверно, так и сделаю.

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 13 | 2 | 4
Назад Вверх Каталог Обновить

Топ тредов
Избранное