Здравствуйте, 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>Говорил, говорил. Жаль скайп историю не сохраняет.
Историю переписки сохраняет.