Макрос PegGrammar
От: Чистяков Владислав Юрьевич Российская Империя www.nemerle.org
Дата: 11.12.10 16:41
Оценка: 880 (11)
Статья:
Макрос PegGrammar
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.


Авторы:
Чистяков Владислав Юрьевич

Аннотация:
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.

17.07.13 20:05: Перенесено из 'Nemerle'
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Макрос PegGrammar
От: WolfHound  
Дата: 11.12.10 17:31
Оценка:
Здравствуйте, Чистяков Владислав Юрьевич, Вы писали:

Ошибки:
1)LRPEGCC.dll
2)

Состоит из необязательного предиката ('!' или '&') и идущего за ним CardinalityRule. Если предикат задан, то он делает идущее за ним подправило предикативным (эфемерным). Такое правило распознается только с целью получения ответа на вопрос, можно ли продолжать дальнейший разбор. Информация о разборе предикативного подправила теряется, а текущая позиция не изменяется.

Чего? Если уж мы говорим про предикаты то какие же они не обязательные?
3)

& – позитивный предикат. Возвращает успех, если идущее за ним правило успешно распознано, и неудачу в обратном случае.

!E – негативный предикат. Возвращает успех, если идущее за ним правило потерпело неудачу при разборе, и неудачу в случае успешного разбора.

Почему в нодном случае Е есть, а в другом нет?
4)Строковый литерал и Символьный литерал поменять местами. Ибо в примере к строковому используется символьный.
5)

Extensible – указывает, что данное правило является точкой расширения. Такие правила могут быть динамически (во время исполнения) расширены другими правилами. Данный атрибут может применяться только к правилам, содержащим невырожденный (т.е. состоящий более чем из одного вхождения) оператор приоритетного выбора (OrderedChoice), так как только он может быть расширен динамически. Точки расширения, совместно с областями видимости (Scope), можно использовать, чтобы создавать парсеры динамически-расширяемых языков (например, самого Nemerle). При этом Scope можно использовать для открытия и закрытия пространств имен, содержащих правила, расширяющие грамматику разбираемого языка, а атрибутом Extensible будут указываться те правила, которые будут динамически пополняться. Правила, помеченные атрибутом Extensible, превращаются макросом PegGrammar в массивы, которые можно пополнять динамически, и в которых правила сортируются в соответствии с их приоритетами (задаваемыми так же атрибутами).

FailureRecovery – позволяет задать «точку восстановления» после обнаруженной парсером ошибки. Данный атрибут применим к правилам, состоящим из непустого оператора приоритетного выбора (OrderedChoice). Если в грамматике не заданы точки восстановления или точки отсечения (о них см. ниже), то при обнаружении первой ошибки парсер прекращает разбор (так как все правила откатываются) и сообщает об ошибке. FailureRecovery позволяет указать, что данное правило не должно откатываться при обнаружении ошибки. Атрибут FailureRecovery задает метод-обработчик, который генерирует заглушку (AST-элемент, содержащий информацию об ошибке), а также правило, позволяющее пропустить некорректные данные во входной строке, что позволяет парсеру продолжить разбор строки, даже если она частично не соответствует грамматике разбираемого языка (содержит ошибки). Это позволяет выявлять несколько ошибок сразу.

Выделенное не верно.
6)

Если тело правила состоит из невырожденного OrderedChoice, то обработчик должен принимать ровно один параметр, тип которого должен быть совместим с типами, возвращаемыми всеми элементами OrderedChoice.

Все что требует приоритетный выбор это чтобы типы совпадали.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Макрос PegGrammar
От: 24  
Дата: 11.12.10 17:42
Оценка:
Здравствуйте, Чистяков Владислав Юрьевич, Вы писали:

ЧВЮ>Статья:

ЧВЮ>Макрос PegGrammar
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.


Первая ссылка (на грамматику C#) ведёт в никуда.
Re[2]: Макрос PegGrammar
От: Antikrot  
Дата: 11.12.10 17:45
Оценка: +1
Здравствуйте, 24, Вы писали:

ЧВЮ>>Статья:

ЧВЮ>>Макрос PegGrammar
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.

24>Первая ссылка (на грамматику C#) ведёт в никуда.
там парочка таких ссылок. пострадали в результате "реструктуризации" видимо
Re[2]: Макрос PegGrammar
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.12.10 18:52
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Чистяков Владислав Юрьевич, Вы писали:


WH>Ошибки:

WH>1)LRPEGCC.dll

Писалось еще до переименования. Теперь надо править.

WH>2)

WH>

WH>Состоит из необязательного предиката ('!' или '&') и идущего за ним CardinalityRule. Если предикат задан, то он делает идущее за ним подправило предикативным (эфемерным). Такое правило распознается только с целью получения ответа на вопрос, можно ли продолжать дальнейший разбор. Информация о разборе предикативного подправила теряется, а текущая позиция не изменяется.

WH>Чего? Если уж мы говорим про предикаты то какие же они не обязательные?

Того. Это же грамматика. PredicateRule остается PredicateRule даже если сам предикат не задан.
Наверно, нужно это пояснить более подробно.

WH>3)

WH>

WH>& – позитивный предикат. Возвращает успех, если идущее за ним правило успешно распознано, и неудачу в обратном случае.

WH>!E – негативный предикат. Возвращает успех, если идущее за ним правило потерпело неудачу при разборе, и неудачу в случае успешного разбора.

WH>Почему в нодном случае Е есть, а в другом нет?

Кривой копипаст.

WH>4)Строковый литерал и Символьный литерал поменять местами. Ибо в примере к строковому используется символьный.


ОК

WH>5)

WH>

WH>Extensible – указывает, что данное правило является точкой расширения. Такие правила могут быть динамически (во время исполнения) расширены другими правилами. Данный атрибут может применяться только к правилам, содержащим невырожденный (т.е. состоящий более чем из одного вхождения) оператор приоритетного выбора (OrderedChoice), так как только он может быть расширен динамически. Точки расширения, совместно с областями видимости (Scope), можно использовать, чтобы создавать парсеры динамически-расширяемых языков (например, самого Nemerle). При этом Scope можно использовать для открытия и закрытия пространств имен, содержащих правила, расширяющие грамматику разбираемого языка, а атрибутом Extensible будут указываться те правила, которые будут динамически пополняться. Правила, помеченные атрибутом Extensible, превращаются макросом PegGrammar в массивы, которые можно пополнять динамически, и в которых правила сортируются в соответствии с их приоритетами (задаваемыми так же атрибутами).

WH>FailureRecovery – позволяет задать «точку восстановления» после обнаруженной парсером ошибки. Данный атрибут применим к правилам, состоящим из непустого оператора приоритетного выбора (OrderedChoice). Если в грамматике не заданы точки восстановления или точки отсечения (о них см. ниже), то при обнаружении первой ошибки парсер прекращает разбор (так как все правила откатываются) и сообщает об ошибке. FailureRecovery позволяет указать, что данное правило не должно откатываться при обнаружении ошибки. Атрибут FailureRecovery задает метод-обработчик, который генерирует заглушку (AST-элемент, содержащий информацию об ошибке), а также правило, позволяющее пропустить некорректные данные во входной строке, что позволяет парсеру продолжить разбор строки, даже если она частично не соответствует грамматике разбираемого языка (содержит ошибки). Это позволяет выявлять несколько ошибок сразу.

WH>Выделенное не верно.

Что не верно то? Ты уже поясняй свои мысли.

WH>6)

WH>

WH>Если тело правила состоит из невырожденного OrderedChoice, то обработчик должен принимать ровно один параметр, тип которого должен быть совместим с типами, возвращаемыми всеми элементами OrderedChoice.
WH>

WH>Все что требует приоритетный выбор это чтобы типы совпадали.

Не понял. Параметр должен быть один, это вроде факт. Что до типа, то вроде как у нас можно делать так, чтобы элементы были подтипами, а не точными типами (ковариантность).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Макрос PegGrammar
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.12.10 19:09
Оценка:
Здравствуйте, Antikrot, Вы писали:

ЧВЮ>>>Статья:

ЧВЮ>>>Макрос PegGrammar
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.

24>>Первая ссылка (на грамматику C#) ведёт в никуда.
A>там парочка таких ссылок. пострадали в результате "реструктуризации" видимо

Именно так. Сейчас правильная ссылка:
http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/?r=9425
Но видимо и она скоро изменится.

А какая еще ссылка не верна?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Макрос PegGrammar
От: Antikrot  
Дата: 11.12.10 19:31
Оценка:
Здравствуйте, VladD2, Вы писали:

ЧВЮ>>>>Статья:

ЧВЮ>>>>Макрос PegGrammar
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.

24>>>Первая ссылка (на грамматику C#) ведёт в никуда.
A>>там парочка таких ссылок. пострадали в результате "реструктуризации" видимо
VD>Именно так. Сейчас правильная ссылка:
VD>http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/?r=9425
ага, это я уже нашёл

VD>Но видимо и она скоро изменится.

VD>А какая еще ссылка не верна?
там просто на Parser.n в двух местах ссылка (второй раз в примечании где "Оказалось, что скорость парсинга на реальных грамматиках (мы использовали для тестов грамматику C# 4.0"), вот я и сказал "парочка"
Re[3]: Макрос PegGrammar
От: WolfHound  
Дата: 11.12.10 19:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Того. Это же грамматика. PredicateRule остается PredicateRule даже если сам предикат не задан.

VD>Наверно, нужно это пояснить более подробно.
Кручу верчу запутать хочу. Ничего не понял.

WH>>

WH>>Extensible –
WH>>FailureRecovery

WH>>Выделенное не верно.
VD>Что не верно то? Ты уже поясняй свои мысли.
То что ни то ни другое не имеет никакого отношения к OrderedChoice.
Я тебе раз 50 наверное об этом говорил но ты не слушаешь.

VD>Не понял. Параметр должен быть один, это вроде факт. Что до типа, то вроде как у нас можно делать так, чтобы элементы были подтипами, а не точными типами (ковариантность).

Вот так тоже можно:

[PegGrammar(s,
grammar
{
x : int = "x"*;
s : int = (("x" x "") / ("x" x "x")) x;
})]
public class TestPraser
{
x(t : NToken) : int
{
t.EndPos — t.StartPos;
}
s(_ : NToken * int * NToken, n : int) : int
{
n
}
}

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

VD>>Того. Это же грамматика. PredicateRule остается PredicateRule даже если сам предикат не задан.

VD>>Наверно, нужно это пояснить более подробно.
WH>Кручу верчу запутать хочу. Ничего не понял.

Так яснее:
redicateRule   = ('!' / '&')? CardinalityRule;

?

ОК, раз уж непонимание есть даже у тех кто в теме, надо подумать как это дело упростить.

WH>>>

WH>>>Extensible –
WH>>>FailureRecovery

WH>>>Выделенное не верно.
VD>>Что не верно то? Ты уже поясняй свои мысли.
WH>То что ни то ни другое не имеет никакого отношения к OrderedChoice.
WH>Я тебе раз 50 наверное об этом говорил но ты не слушаешь.

Ну, про нереализованное Extensible говорить бесполезно. А вот FailureRecovery можно поговорить.

Я что-то не пойму как этот атрибут может работать не на OrderedChoice. Точнее какой в этом смысл?
Я его и задумывал исключительно для этого.

В общем, объясняй как ты себе все видишь. И по подробнее.

VD>>Не понял. Параметр должен быть один, это вроде факт. Что до типа, то вроде как у нас можно делать так, чтобы элементы были подтипами, а не точными типами (ковариантность).

WH>Вот так тоже можно:
WH>

WH> [PegGrammar(s,
WH> grammar
WH> {
WH> x : int = "x"*;
WH> s : int = (("x" x "") / ("x" x "x")) x;
WH> })]
WH> public class TestPraser
WH> {
WH> x(t : NToken) : int
WH> {
WH> t.EndPos — t.StartPos;
WH> }
WH> s(_ : NToken * int * NToken, n : int) : int
WH> {
WH> n
WH> }
WH> }


Можно, но причем тут это? Правило s не является не вырожденным OrderedChoice, а является Sequence-ом. Так что все правильно. Это ты ошибаешься.

WH>Сейчас это не работает но это бага и я ее починю.


Дык, поправить бы не мешало. Почему не работает?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Макрос PegGrammar
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 11.12.10 20:44
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Именно так. Сейчас правильная ссылка:

VD>http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/?r=9425
VD>Но видимо и она скоро изменится.

Если явно указывается ревизия, то по идее такая ссылка не должна протухнуть после переноса этого каталога в другое место в другой ревизии.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re: Макрос PegGrammar
От: Ka3a4oK  
Дата: 11.12.10 21:13
Оценка:
Мне кажется, или это правда, что синтаксис описания грамматики в виде атрибута класса трудно совместим с модульностью?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[2]: Макрос PegGrammar
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.12.10 23:58
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Мне кажется, или это правда, что синтаксис описания грамматики в виде атрибута класса трудно совместим с модульностью?


Кажется.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Макрос PegGrammar
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.12.10 00:13
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

VD>>Именно так. Сейчас правильная ссылка:

VD>>http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/?r=9425
VD>>Но видимо и она скоро изменится.

KV>Если явно указывается ревизия, то по идее такая ссылка не должна протухнуть после переноса этого каталога в другое место в другой ревизии.


Во-первых, не работает: здесь
Во-вторых, это тоже не выход из ситуации.

Тут скорее имеет смысл задействовать редикрект вроде того что у нас для рекламмных банеров используется. За одно статистику можно посчитать .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Макрос PegGrammar
От: Visor2004  
Дата: 12.12.10 03:14
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Мне кажется, или это правда, что синтаксис описания грамматики в виде атрибута класса трудно совместим с модульностью?


Что подразумевается под модульностью в данном контексте? Если вы хотите хранить грамматику отдельно от парсера, то можно поинтересоваться зачем? В случае если вам надо делать парсинг, загружая грамматики в runtime, то никто не мешает выделить парсеры в отдельные сборки, реализовать в них какой-то интерфейс и получать через фабрику, тем самым обеспечивая динамику и слабую связность между клиентским кодом и парсером.
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[2]: Макрос PegGrammar
От: Ziaw Россия  
Дата: 12.12.10 05:49
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:

KK>Мне кажется, или это правда, что синтаксис описания грамматики в виде атрибута класса трудно совместим с модульностью?


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

Только надо ли оно? Даже грамматика C# вполне обозрима и читабельна. Класс сделан partial и методы обработки грамматики разбиты по файлам.
Re[6]: Макрос PegGrammar
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 12.12.10 06:52
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>>>http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/?r=9425

VD>Во-первых, не работает: http://nemerle.googlecode.com/svn/nemerle/trunk/snippets/peg-parser/CSharp/CSharpParser/Parser.n?r=9390

См. выделенное.

Приведенная тобой ссылка должна выглядеть так:

http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/CSharp/CSharpParser/Parser.n?r=9390

или так:

http://nemerle.googlecode.com/svn-history/r9390/nemerle/trunk/snippets/peg-parser/CSharp/CSharpParser/Parser.n

тогда работает.

VD>Во-вторых, это тоже не выход из ситуации.

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

Можно использовать уже существующий сокращатель ссылок. Тот же goo.gl дает возможность просмотра истории кликов и статистики: количество кликов, рефереры, география кликающих и т.п. Сделать свой сокращатель или редиректор в принципе несложно, заодно научить его следить за живостью ссылок и сообщать в случае чего их авторам.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[3]: Макрос PegGrammar
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.12.10 10:43
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Что подразумевается под модульностью в данном контексте?


Возможность разбить грамматику на части собирать реальную грамматику из частей. Например, выделить разбор чисел в отдельную грамматику и подключать ее в другие (более большие грамматики) когда нужно.

Организация в виде атрибута этому никак не препятствует. Но чтобы данная функциональность появилась нужно ее реализовать. Примерный принцип описывал Вольфхаунд еще пару месяцев назад.

Однако, нам сейчас важнее динамическая расширяемость. Так что я бы не распылялся. Еще важной фичей являются точки отсечения. Без них реализовать качественные сообщения об ошибках будет не просто.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Макрос PegGrammar
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.12.10 10:47
Оценка: +1
Здравствуйте, Ziaw, Вы писали:

Z>Только надо ли оно? Даже грамматика C# вполне обозрима и читабельна. Класс сделан partial и методы обработки грамматики разбиты по файлам.


Модульность предназначена не только для борьбы с размерами кода, но и для борьбы с копипастом. Например, почти все сишныеп языки имеют одинаковую грамматику для числе, комментариев и т.п.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Макрос PegGrammar
От: Visor2004  
Дата: 12.12.10 11:03
Оценка:
Здравствуйте, VladD2, Вы писали:

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


V>>Что подразумевается под модульностью в данном контексте?

VD>Возможность разбить грамматику на части собирать реальную грамматику из частей. Например, выделить разбор чисел в отдельную грамматику и подключать ее в другие (более большие грамматики) когда нужно.
VD>Организация в виде атрибута этому никак не препятствует. Но чтобы данная функциональность появилась нужно ее реализовать. Примерный принцип описывал Вольфхаунд еще пару месяцев назад.
VD>Однако, нам сейчас важнее динамическая расширяемость. Так что я бы не распылялся. Еще важной фичей являются точки отсечения. Без них реализовать качественные сообщения об ошибках будет не просто.

Забавная фича, но где она реально нужна? мне в голову приходит только поддержка нескольких диалектов одного языка. Широко распространен в этом смысле только SQL, как часто люди пишут парсеры SQL
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re: Макрос PegGrammar
От: jazzer Россия Skype: enerjazzer
Дата: 12.12.10 11:03
Оценка: +1
Здравствуйте, Чистяков Владислав Юрьевич, Вы писали:

В списке главных достоинств вот это не одно и то же?

Благодаря тому, что PegGrammar предоставляет концепцию областей видимости (Scopes), он позволяет разбирать ряд контекстно-зависимых грамматик вроде грамматик языков C, C++ или Nemerle.


Scope позволяет разбирать некоторые контекстно-зависимые грамматики, например С/C++.

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.