Вопросы про Peg parser
От: mikhailm1  
Дата: 01.04.11 08:57
Оценка:
Всем привет,

1. Если в грамматике встречаются подобные правила rule1 = A? B*; rule2 = rule1*; то парсер зациклиться. Как мне кажется, эту проблему можно разрешить на уровне генерации, если правило rule1 совпало с 0 символов то звать снова смысла нет. Понятно что можно переписать и правило вот таким образом rule1 = (A B*) / (B B*), но IMHO наглядность теряется.

2. Приведите пример расширяемого парсера, мне что то не удалось добиться рабочего варианта.

Заранее спасибо за ответы.
Re: Вопросы про Peg parser
От: hardcase Пират http://nemerle.org
Дата: 01.04.11 08:59
Оценка:
Здравствуйте, mikhailm1, Вы писали:

M>2. Приведите пример расширяемого парсера, мне что то не удалось добиться рабочего варианта.


Еще не сделано.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Вопросы про Peg parser
От: WolfHound  
Дата: 01.04.11 09:08
Оценка:
Здравствуйте, mikhailm1, Вы писали:

M>1. Если в грамматике встречаются подобные правила rule1 = A? B*; rule2 = rule1*; то парсер зациклиться. Как мне кажется, эту проблему можно разрешить на уровне генерации, если правило rule1 совпало с 0 символов то звать снова смысла нет.

Надо подумать.
Это меняет семантику ПЕГ но на первый взгляд проблем не видно.
Может и сделаю если ничего против не придумается.

M>Понятно что можно переписать и правило вот таким образом rule1 = (A B*) / (B B*), но IMHO наглядность теряется.

И переписал ты его не правильно.
Исходное правило может сматчить пустую строку, а новое обязано съесть A или B.

M>2. Приведите пример расширяемого парсера, мне что то не удалось добиться рабочего варианта.

Мне тоже. Влад бежит впереди паровоза описывая функциональность которую я еще не сделал.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Вопросы про Peg parser
От: mikhailm1  
Дата: 01.04.11 09:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


M>>1. Если в грамматике встречаются подобные правила rule1 = A? B*; rule2 = rule1*; то парсер зациклиться. Как мне кажется, эту проблему можно разрешить на уровне генерации, если правило rule1 совпало с 0 символов то звать снова смысла нет.

WH>Надо подумать.
WH>Это меняет семантику ПЕГ но на первый взгляд проблем не видно.
WH>Может и сделаю если ничего против не придумается.

M>>Понятно что можно переписать и правило вот таким образом rule1 = (A B*) / (B B*), но IMHO наглядность теряется.

WH>И переписал ты его не правильно.
WH>Исходное правило может сматчить пустую строку, а новое обязано съесть A или B.

да правила rule1 изменилось, тут я хотел показать что rule2 теперь работает, а не зацикливается и сматчит пустую строку.
Re: Вопросы про Peg parser
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.04.11 17:22
Оценка:
Здравствуйте, mikhailm1, Вы писали:

M>1. Если в грамматике встречаются подобные правила rule1 = A? B*; rule2 = rule1*; то парсер зациклиться.


Это проверено на практике? Вообще-то должен работать алгоритм выявления левой рекурсии. Он должен был дать сообщение об ошибке на стадии компиляции. Если это не так, то это баг который нужно фиксить.

M>2. Приведите пример расширяемого парсера, мне что то не удалось добиться рабочего варианта.


Версия которая это умеет находится на компьютере WolfHound. Он ее уже давно обещал выложить.

Отличный момент попросить уважаемого WolfHound-а доделать эту, не побоюсь этого слова, революционную фичу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Вопросы про Peg parser
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.04.11 17:24
Оценка:
Здравствуйте, WolfHound, Вы писали:

M>>2. Приведите пример расширяемого парсера, мне что то не удалось добиться рабочего варианта.

WH>Мне тоже. Влад бежит впереди паровоза описывая функциональность которую я еще не сделал.

Это не Влад бежит, а кто-то другой тормозит. Давно бы сделал уже. Мы тебя уже ждем месяц. Из-за этого стоит развитие Н2.

Алгоритм ты придумал. Реализовать его не представляет особых проблем. Нужно просто отложить все несущественное и сделать его.

Я тебе уже предлагал самому за это взяться (хотя у меня и так тут планов больше времени, надо 2010 студию допиливать).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Вопросы про Peg parser
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.04.11 17:31
Оценка:
Здравствуйте, mikhailm1, Вы писали:

M>>>Понятно что можно переписать и правило вот таким образом rule1 = (A B*) / (B B*), но IMHO наглядность теряется.

WH>>И переписал ты его не правильно.
WH>>Исходное правило может сматчить пустую строку, а новое обязано съесть A или B.

M>да правила rule1 изменилось, тут я хотел показать что rule2 теперь работает, а не зацикливается и сматчит пустую строку.


Думаю, что исходное правило принципиально не имеет смысла. В него просто надо добавить еще одно правило которое будет идти за B*. Другими словами нужно выбросить rule1 и rule2 и заинлайнить rule1 в место испольования.

Скорее всего, ведь, имеется в виду что-то вроде:
[ C#]
rule3 = A? B* C;
// или так
rule1 = A? B;
rule3 = rule1? C;
[/rule1]

Такое правило будет корректным и с точки зрения пега, и с точки зрения разбираемого языка.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Вопросы про Peg parser
От: mikhailm1  
Дата: 04.04.11 13:41
Оценка:
Здравствуйте, VladD2, Вы писали:

M>>1. Если в грамматике встречаются подобные правила rule1 = A? B*; rule2 = rule1*; то парсер зациклиться.


VD>Это проверено на практике? Вообще-то должен работать алгоритм выявления левой рекурсии. Он должен был дать сообщение об ошибке на стадии компиляции. Если это не так, то это баг который нужно фиксить.


А где здесь левая рекурсия? Никакой ошибки нет, и все успешно зацикливается.
Re[4]: Вопросы про Peg parser
От: mikhailm1  
Дата: 04.04.11 13:46
Оценка:
VD>Скорее всего, ведь, имеется в виду что-то вроде:
VD>[ C#]
VD>rule3 = A? B* C;
VD>// или так
VD>rule1 = A? B;
VD>rule3 = rule1? C;
VD>[/rule1]

Не понял что такое С.
У меня
A = ['0'..'9']
B = ['a'..'z']
вход: 0abcd4z выход: [(Some(0), [a,b,c,d]), (Some(4), [z])]
вход: abc2x,y выход: [(None, [a,b,c]), (Some(2), [x, y])]
Re[3]: Вопросы про Peg parser
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.04.11 14:23
Оценка:
Здравствуйте, mikhailm1, Вы писали:

M>А где здесь левая рекурсия?


Да, гоню.

M>Никакой ошибки нет, и все успешно зацикливается.


Хм. Пока что не догоняю почему это оно должно зацикливаться.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Вопросы про Peg parser
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.04.11 14:27
Оценка:
Здравствуйте, mikhailm1, Вы писали:

VD>>Скорее всего, ведь, имеется в виду что-то вроде:

VD>>[ C#]
VD>>rule3 = A? B* C;
VD>>// или так
VD>>rule1 = A? B;
VD>>rule3 = rule1? C;
VD>>[/rule1]

M>Не понял что такое С.


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

M>У меня

M>A = ['0'..'9']
M>B = ['a'..'z']
M>вход: 0abcd4z выход: [(Some(0), [a,b,c,d]), (Some(4), [z])]
M>вход: abc2x,y выход: [(None, [a,b,c]), (Some(2), [x, y])]

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