Здравствуйте, catbert, Вы писали:
C>Это как-то можно сделать?
Когда-то PegGrammar генерировал специальные методы для возможности разбора любого правила в грамматике, видимо этот функционал в какойто момент угробили за ненадобностью.
Я думаю можно ввести некий атрибут, например [Public]. Если им пометить нужные правила, то PegGrammar изготовит метод для разбора этого правила напрямую.
Здравствуйте, hardcase, Вы писали:
H>Когда-то PegGrammar генерировал специальные методы для возможности разбора любого правила в грамматике, видимо этот функционал в какойто момент угробили за ненадобностью. H>Я думаю можно ввести некий атрибут, например [Public]. Если им пометить нужные правила, то PegGrammar изготовит метод для разбора этого правила напрямую.
Понятно, спасибо.
Еще вопрос: есть ли пример питоноподобной грамматики для PegParser? Как вообще формализовать идею использования пробелов вместо скобок в PEG?
Здравствуйте, catbert, Вы писали:
C>Еще вопрос: есть ли пример питоноподобной грамматики для PegParser? Как вообще формализовать идею использования пробелов вместо скобок в PEG?
Идея #1: Парсим файл "построчно" (обработкой переносов строк \) с выцеплением значимых пробелов в начале строки. Полученный список "Located"-элементов после разбора группируем в соответствии с отступами.
Идея #2: Отслеживаем значимые пробелы во время разбора. Тут нужно подумать над использованием scope-ов PegParser-а — придется вводить в обработчики модификацию состояния (текущее значение пробела и стек).
Здравствуйте, hardcase, Вы писали:
H>Идея #2: Отслеживаем значимые пробелы во время разбора. Тут нужно подумать над использованием scope-ов PegParser-а — придется вводить в обработчики модификацию состояния (текущее значение пробела и стек).
Вторая идея выглядит более прямой, но похоже грамматика вида "if" expr block ("else" block)? не взлетит? Все блоки придется делать обрабатывать руками в скоупах?
Здравствуйте, hardcase, Вы писали:
H>Когда-то PegGrammar генерировал специальные методы для возможности разбора любого правила в грамматике, видимо этот функционал в какойто момент угробили за ненадобностью.
Его убрал Вольфхаунд. Как-то там обосновал. Уже не помню как. Я ему говорил, что это не правильно.
H>Я думаю можно ввести некий атрибут, например [Public]. Если им пометить нужные правила, то PegGrammar изготовит метод для разбора этого правила напрямую.
+1
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, catbert, Вы писали:
C>Еще вопрос: есть ли пример питоноподобной грамматики для PegParser? Как вообще формализовать идею использования пробелов вместо скобок в PEG?
Можно сделать прероцессор который бы занимался только анализом отступов и заменял бы конец строки ('\n') идущий непосредственно перед увеличением отступа на открывающую скобку (или некий спец.символ из числа не читаемых, заменяющий ее), и последний '\n' на закрывающую скобку (или некий спец.символ из числа не читаемых, заменяющий ее).
Но тут есть одна проблема. Закрывающих "скобок" может быть больше чем концов строк (смотри комментарий в примере). Эту проблему можно решить путем использования для закрывающих скобок не одного кода символа, а нескольких идущих подряд. Думаю, что этот диапазон на практике не велик (максимум десятки вложенностей), так что если заложить на это дело 255 значений, то этого хватит выше крыши.
Основной же парсер тупо будет использовать эти псевдо-скобки как обычные. Единственное что, дополнительно придется учитывать эти псевдо-скобки как концы строк. Но это не сложно. Так что модификация основного парсера будет минимальной.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hardcase, Вы писали:
VD>>Его убрал Вольфхаунд. Как-то там обосновал. Уже не помню как. Я ему говорил, что это не правильно.
H>По видимому тем, что если у нас стопицот правил (как в C#) то генерируется столькоже фактически неиспользуемых публичных методов.
Думаю, все прозаичнее. Скорее всего оптимизатор тупо уничтожал не стартовые правила которые инлайнились. Вот он и пошел на поводу алгоритма. А обходной маневр не предусмотрел.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Можно сделать препроцессор...
Дополнительным положительным моментом такого подхода может являться то, что одним парсером можно будет парсить как отступную грамматику, так и скобочную. Более того можно даже с небольшими доработками сделать парсер который может переходить на скобки и обратно когда это нужно программисту.
Возможно, что Н2 будет парситься именно таким образом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, VladD2, Вы писали:
VD>>Можно сделать препроцессор...
VD>Дополнительным положительным моментом такого подхода может являться то, что одним парсером можно будет парсить как отступную грамматику, так и скобочную. Более того можно даже с небольшими доработками сделать парсер который может переходить на скобки и обратно когда это нужно программисту.
VD>Возможно, что Н2 будет парситься именно таким образом.
Немного оффтопик.
Очень хотелось бы видеть эту возможность в Nemerle2.
Это положит конец войне скобок против отступов навсегда
Здравствуйте, VladD2, Вы писали:
VD>Его убрал Вольфхаунд. Как-то там обосновал. Уже не помню как. Я ему говорил, что это не правильно.
Ты такого не говорил.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, hardcase, Вы писали:
H>По видимому тем, что если у нас стопицот правил (как в C#) то генерируется столькоже фактически неиспользуемых публичных методов.
Так оно и было.
Плюс такой подход форсировал генерацию не нужных приватных методов с кучей кода.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
VD>>Его убрал Вольфхаунд. Как-то там обосновал. Уже не помню как. Я ему говорил, что это не правильно. WH>Ты такого не говорил.
Говорил, говорил. Жаль скайп историю не сохраняет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [Peg] распарсить правило
От:
Аноним
Дата:
19.01.11 17:08
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Говорил, говорил. Жаль скайп историю не сохраняет.
Историю переписки сохраняет.
Здравствуйте, VladD2, Вы писали:
VD>Говорил, говорил. Жаль скайп историю не сохраняет.
Все он запоминает... Читай выделенное.
[15.09.2010 19:12:48] WolfHound: Насколько актуальны методы генерируемые при помощи CreateSimpleParseMethod?
Просто сейчас наличие этих методов зависит от работы оптимизатора.
Тут два варианта
1)Либо не генерировать их
2)Либо генерировать их для всех правил.
[15.09.2010 21:00:10] WolfHound: [15 сентября 2010 г. 19:12] WolfHound:
<<< Насколько актуальны методы генерируемые при помощи CreateSimpleParseMethod?
Просто сейчас наличие этих методов зависит от работы оптимизатора.
Тут два варианта
1)Либо не генерировать их
2)Либо генерировать их для всех правил.
[15.09.2010 21:00:30] WolfHound: http://rsdn.ru/Forum/Message.aspx?mid=3959528&only=1 [15.09.2010 21:00:42] VladD2: Не помню что делает CreateSimpleParseMethod, но думаю, что вообще не актуальны.
[15.09.2010 21:01:18] WolfHound: Генерирует кучу методов типа ParseRule_mulOrDiv
[15.09.2010 21:01:31] WolfHound: Для каждого правила граматики [15.09.2010 21:02:02] VladD2: Ну, грохи его, а там разберемся.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>[15.09.2010 21:00:42] VladD2: Не помню что делает CreateSimpleParseMethod, но думаю, что вообще не актуальны. WH>[15.09.2010 21:01:18] WolfHound: Генерирует кучу методов типа ParseRule_mulOrDiv WH>[15.09.2010 21:01:31] WolfHound: Для каждого правила граматики WH>[15.09.2010 21:02:02] VladD2: Ну, грохи его, а там разберемся.
Не надо цитировать в стиле флэймовых форумов. ОК?
Вот же страницей ниже:
[16.09.2010 18:45:43] VladD2: Привет.
[16.09.2010 18:45:55] VladD2: А чем мешает CreateSimpleParseMethod ?
[16.09.2010 18:46:22] VladD2: В принципе народу может быть нужным парсить не всю грамматику целиком, а отдельные правила.
[16.09.2010 18:47:33] WolfHound: Ничем кроме того что его вызовы зависили от того как сильно оптимизирована граматика
[16.09.2010 18:48:07] WolfHound: Тут либо вызывать его для всех правил либо не вызывать совсем.
[16.09.2010 18:48:45] VladD2: А нельзя как-то для отдельных правил его вызвать?
[16.09.2010 18:49:12] WolfHound: Если как-то получить список этих правил то можно
[16.09.2010 18:49:55] VladD2: ОК. Тогда ты учти что это может в дальнешем понадобиться. Когда понадобится что-нить придумаем.
[16.09.2010 18:51:12] WolfHound: В худшем случае маленоко подрефакторим.
Первый раз что-ли?
[16.09.2010 18:51:41] VladD2: Ну, главное не делать чего-то что приципиально не даст это реализовать в дальнейшем.
В общем, видимо настала пора таки сделать список содержащий правила для которых нужно генерировать вход. Я вижу два варианта:
1. Сделать вместо стартового правила список, в котором позволить задавать несколько стартовых правил.
2. Ввести атрибут которым помечать те правила которые должны иметь отдельные точки входа в парсере. В принципе это будет дублировать стартовое правило.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.