[Peg] распарсить правило
От: catbert  
Дата: 18.01.11 22:42
Оценка:
Допустим у меня есть парсер грамматики языка, но я хочу распарсить не целую программу, а только одно выражение (то есть стартовое правило другое).

Это как-то можно сделать?
Re: [Peg] распарсить правило
От: hardcase Пират http://nemerle.org
Дата: 18.01.11 22:51
Оценка: 4 (3)
Здравствуйте, catbert, Вы писали:

C>Это как-то можно сделать?


Когда-то PegGrammar генерировал специальные методы для возможности разбора любого правила в грамматике, видимо этот функционал в какойто момент угробили за ненадобностью.
Я думаю можно ввести некий атрибут, например [Public]. Если им пометить нужные правила, то PegGrammar изготовит метод для разбора этого правила напрямую.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [Peg] распарсить правило
От: catbert  
Дата: 18.01.11 23:05
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Когда-то PegGrammar генерировал специальные методы для возможности разбора любого правила в грамматике, видимо этот функционал в какойто момент угробили за ненадобностью.

H>Я думаю можно ввести некий атрибут, например [Public]. Если им пометить нужные правила, то PegGrammar изготовит метод для разбора этого правила напрямую.

Понятно, спасибо.

Еще вопрос: есть ли пример питоноподобной грамматики для PegParser? Как вообще формализовать идею использования пробелов вместо скобок в PEG?
Re[3]: [Peg] распарсить правило
От: hardcase Пират http://nemerle.org
Дата: 19.01.11 07:30
Оценка:
Здравствуйте, catbert, Вы писали:

C>Еще вопрос: есть ли пример питоноподобной грамматики для PegParser? Как вообще формализовать идею использования пробелов вместо скобок в PEG?


Идея #1: Парсим файл "построчно" (обработкой переносов строк \) с выцеплением значимых пробелов в начале строки. Полученный список "Located"-элементов после разбора группируем в соответствии с отступами.

Идея #2: Отслеживаем значимые пробелы во время разбора. Тут нужно подумать над использованием scope-ов PegParser-а — придется вводить в обработчики модификацию состояния (текущее значение пробела и стек).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: [Peg] распарсить правило
От: Ziaw Россия  
Дата: 19.01.11 07:45
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Идея #2: Отслеживаем значимые пробелы во время разбора. Тут нужно подумать над использованием scope-ов PegParser-а — придется вводить в обработчики модификацию состояния (текущее значение пробела и стек).


Вторая идея выглядит более прямой, но похоже грамматика вида "if" expr block ("else" block)? не взлетит? Все блоки придется делать обрабатывать руками в скоупах?
Re[2]: [Peg] распарсить правило
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 07:57
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Когда-то PegGrammar генерировал специальные методы для возможности разбора любого правила в грамматике, видимо этот функционал в какойто момент угробили за ненадобностью.


Его убрал Вольфхаунд. Как-то там обосновал. Уже не помню как. Я ему говорил, что это не правильно.

H>Я думаю можно ввести некий атрибут, например [Public]. Если им пометить нужные правила, то PegGrammar изготовит метод для разбора этого правила напрямую.


+1
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [Peg] распарсить правило
От: hardcase Пират http://nemerle.org
Дата: 19.01.11 08:00
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Вторая идея выглядит более прямой


Если честно, мне и первая нравится. Тут зависит от сложности грамматики и необходимой производительности.


Z>похоже грамматика вида "if" expr block ("else" block)? не взлетит? Все блоки придется делать обрабатывать руками в скоупах?


Я не понял что ты имеешь в виду Нужно просто поставить эксперимент.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: [Peg] распарсить правило
От: hardcase Пират http://nemerle.org
Дата: 19.01.11 08:02
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Его убрал Вольфхаунд. Как-то там обосновал. Уже не помню как. Я ему говорил, что это не правильно.


По видимому тем, что если у нас стопицот правил (как в C#) то генерируется столькоже фактически неиспользуемых публичных методов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: [Peg] распарсить правило
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 08:22
Оценка:
Здравствуйте, catbert, Вы писали:

C>Еще вопрос: есть ли пример питоноподобной грамматики для PegParser? Как вообще формализовать идею использования пробелов вместо скобок в PEG?


Можно сделать прероцессор который бы занимался только анализом отступов и заменял бы конец строки ('\n') идущий непосредственно перед увеличением отступа на открывающую скобку (или некий спец.символ из числа не читаемых, заменяющий ее), и последний '\n' на закрывающую скобку (или некий спец.символ из числа не читаемых, заменяющий ее).

Например, имеем:
transform() : void\n
  def transform_named()\n
    def loop(args, named_args = [], named_names = [], unnamed_args = [])\n
      match(args)\n
        | [] => (named_args.Rev() + unnamed_args.Rev(), named_names.Rev())\n
        | arg :: args => match(arg)\n
          | <[ $(id : name) = $val ]> => loop(args, val :: named_args, <[ $(id.Id : string) ]> :: named_names, unnamed_args)\n
          | _ => loop(args, named_args, named_names, arg :: unnamed_args)\n
    (args, names) = loop(args)\n
  transform_named()\n

После препроцессирования получаем:
transform() : void{
  def transform_named(){
    def loop(args, named_args = [], named_names = [], unnamed_args = []){
      match(args){
        | [] => (named_args.Rev() + unnamed_args.Rev(), named_names.Rev())\n
        | arg :: args => match(arg){
          | <[ $(id : name) = $val ]> => loop(args, val :: named_args, <[ $(id.Id : string) ]> :: named_names, unnamed_args)\n
          | _ => loop(args, named_args, named_names, arg :: unnamed_args)}} // проблема!
    (args, names) = loop(args)}
  transform_named()}} // проблема!


Но тут есть одна проблема. Закрывающих "скобок" может быть больше чем концов строк (смотри комментарий в примере). Эту проблему можно решить путем использования для закрывающих скобок не одного кода символа, а нескольких идущих подряд. Думаю, что этот диапазон на практике не велик (максимум десятки вложенностей), так что если заложить на это дело 255 значений, то этого хватит выше крыши.

Основной же парсер тупо будет использовать эти псевдо-скобки как обычные. Единственное что, дополнительно придется учитывать эти псевдо-скобки как концы строк. Но это не сложно. Так что модификация основного парсера будет минимальной.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Peg] распарсить правило
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 08:24
Оценка:
Здравствуйте, hardcase, Вы писали:

VD>>Его убрал Вольфхаунд. Как-то там обосновал. Уже не помню как. Я ему говорил, что это не правильно.


H>По видимому тем, что если у нас стопицот правил (как в C#) то генерируется столькоже фактически неиспользуемых публичных методов.


Думаю, все прозаичнее. Скорее всего оптимизатор тупо уничтожал не стартовые правила которые инлайнились. Вот он и пошел на поводу алгоритма. А обходной маневр не предусмотрел.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Peg] распарсить правило
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 08:26
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Можно сделать препроцессор...


Дополнительным положительным моментом такого подхода может являться то, что одним парсером можно будет парсить как отступную грамматику, так и скобочную. Более того можно даже с небольшими доработками сделать парсер который может переходить на скобки и обратно когда это нужно программисту.

Возможно, что Н2 будет парситься именно таким образом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [Peg] распарсить правило
От: _nn_ www.nemerleweb.com
Дата: 19.01.11 08:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, VladD2, Вы писали:


VD>>Можно сделать препроцессор...


VD>Дополнительным положительным моментом такого подхода может являться то, что одним парсером можно будет парсить как отступную грамматику, так и скобочную. Более того можно даже с небольшими доработками сделать парсер который может переходить на скобки и обратно когда это нужно программисту.


VD>Возможно, что Н2 будет парситься именно таким образом.


Немного оффтопик.

Очень хотелось бы видеть эту возможность в Nemerle2.
Это положит конец войне скобок против отступов навсегда
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: [Peg] распарсить правило
От: nCdy http://nCdy.org/
Дата: 19.01.11 09:43
Оценка: :)
Здравствуйте, _nn_, Вы писали:

__>Это положит конец войне скобок против отступов навсегда


И сделать отступы по умолчанию
But I don't really mean it
Re[7]: [Peg] распарсить правило
От: matumba  
Дата: 19.01.11 10:44
Оценка:
Здравствуйте, nCdy, Вы писали:

C>И сделать отступы по умолчанию


Наоборот — для "отступников" показывать бьющихся головой об стену фортранистов, перепутавших 6 пробелов — может тогда "пистонизм" станет излечим...
Re[3]: [Peg] распарсить правило
От: WolfHound  
Дата: 19.01.11 14:56
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Его убрал Вольфхаунд. Как-то там обосновал. Уже не помню как. Я ему говорил, что это не правильно.

Ты такого не говорил.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: [Peg] распарсить правило
От: WolfHound  
Дата: 19.01.11 14:56
Оценка:
Здравствуйте, hardcase, Вы писали:

H>По видимому тем, что если у нас стопицот правил (как в C#) то генерируется столькоже фактически неиспользуемых публичных методов.

Так оно и было.
Плюс такой подход форсировал генерацию не нужных приватных методов с кучей кода.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: [Peg] распарсить правило
От: WolfHound  
Дата: 19.01.11 14:56
Оценка:
Здравствуйте, catbert, Вы писали:

C>Это как-то можно сделать?

Сейчас нельзя. Но сделать можно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: [Peg] распарсить правило
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.01.11 16:47
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>Его убрал Вольфхаунд. Как-то там обосновал. Уже не помню как. Я ему говорил, что это не правильно.

WH>Ты такого не говорил.

Говорил, говорил. Жаль скайп историю не сохраняет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [Peg] распарсить правило
От: Аноним  
Дата: 19.01.11 17:08
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Говорил, говорил. Жаль скайп историю не сохраняет.

Историю переписки сохраняет.
Re[6]: [Peg] распарсить правило
От: adontz Грузия http://adontz.wordpress.com/
Дата: 19.01.11 17:27
Оценка:
Здравствуйте, Аноним, Вы писали:

VD>>Говорил, говорил. Жаль скайп историю не сохраняет.

А>Историю переписки сохраняет.

С бесплатными плагинами и голос пишет, включая конференции. Удобно тыкать друзей носом в говно. Даже не представлял себе как это увлекательно.
A journey of a thousand miles must begin with a single step © Lau Tsu
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.