[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
Re[5]: [Peg] распарсить правило
От: WolfHound  
Дата: 19.01.11 18:04
Оценка: :)
Здравствуйте, 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&amp;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) А. Эйнштейн
Re[6]: [Peg] распарсить правило
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.01.11 08:20
Оценка:
Здравствуйте, 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. Ввести атрибут которым помечать те правила которые должны иметь отдельные точки входа в парсере. В принципе это будет дублировать стартовое правило.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Peg] распарсить правило
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.01.11 08:21
Оценка:
Здравствуйте, Аноним, Вы писали:

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

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

Отлично. Жаль, что все же не всегда он это делает. Я с разных машин им пользуюсь и история разбросана получается.

Но этот момент таки действительно у меня есть на текущей машине.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.