Здравствуйте, Чистяков Владислав Юрьевич, Вы писали:
Ошибки:
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) А. Эйнштейн
Здравствуйте, 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>Все что требует приоритетный выбор это чтобы типы совпадали.
Не понял. Параметр должен быть один, это вроде факт. Что до типа, то вроде как у нас можно делать так, чтобы элементы были подтипами, а не точными типами (ковариантность).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
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"), вот я и сказал "парочка"
Здравствуйте, 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) А. Эйнштейн
Здравствуйте, 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>Сейчас это не работает но это бага и я ее починю.
Дык, поправить бы не мешало. Почему не работает?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ka3a4oK, Вы писали:
KK>Мне кажется, или это правда, что синтаксис описания грамматики в виде атрибута класса трудно совместим с модульностью?
Кажется.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, kochetkov.vladimir, Вы писали:
VD>>Именно так. Сейчас правильная ссылка: VD>>http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/?r=9425 VD>>Но видимо и она скоро изменится.
KV>Если явно указывается ревизия, то по идее такая ссылка не должна протухнуть после переноса этого каталога в другое место в другой ревизии.
Во-первых, не работает: здесь
Во-вторых, это тоже не выход из ситуации.
Тут скорее имеет смысл задействовать редикрект вроде того что у нас для рекламмных банеров используется. За одно статистику можно посчитать .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ka3a4oK, Вы писали:
KK>Мне кажется, или это правда, что синтаксис описания грамматики в виде атрибута класса трудно совместим с модульностью?
Что подразумевается под модульностью в данном контексте? Если вы хотите хранить грамматику отдельно от парсера, то можно поинтересоваться зачем? В случае если вам надо делать парсинг, загружая грамматики в runtime, то никто не мешает выделить парсеры в отдельные сборки, реализовать в них какой-то интерфейс и получать через фабрику, тем самым обеспечивая динамику и слабую связность между клиентским кодом и парсером.
Здравствуйте, Ka3a4oK, Вы писали:
KK>Мне кажется, или это правда, что синтаксис описания грамматики в виде атрибута класса трудно совместим с модульностью?
Если имеется ввиду разбиение грамматики на куски, действительно не очень, только пресловутыми точками расширений.
Только надо ли оно? Даже грамматика C# вполне обозрима и читабельна. Класс сделан partial и методы обработки грамматики разбиты по файлам.
тогда работает.
VD>Во-вторых, это тоже не выход из ситуации. VD>Тут скорее имеет смысл задействовать редикрект вроде того что у нас для рекламмных банеров используется. За одно статистику можно посчитать .
Можно использовать уже существующий сокращатель ссылок. Тот же goo.gl дает возможность просмотра истории кликов и статистики: количество кликов, рефереры, география кликающих и т.п. Сделать свой сокращатель или редиректор в принципе несложно, заодно научить его следить за живостью ссылок и сообщать в случае чего их авторам.
Здравствуйте, Visor2004, Вы писали:
V>Что подразумевается под модульностью в данном контексте?
Возможность разбить грамматику на части собирать реальную грамматику из частей. Например, выделить разбор чисел в отдельную грамматику и подключать ее в другие (более большие грамматики) когда нужно.
Организация в виде атрибута этому никак не препятствует. Но чтобы данная функциональность появилась нужно ее реализовать. Примерный принцип описывал Вольфхаунд еще пару месяцев назад.
Однако, нам сейчас важнее динамическая расширяемость. Так что я бы не распылялся. Еще важной фичей являются точки отсечения. Без них реализовать качественные сообщения об ошибках будет не просто.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Ziaw, Вы писали:
Z>Только надо ли оно? Даже грамматика C# вполне обозрима и читабельна. Класс сделан partial и методы обработки грамматики разбиты по файлам.
Модульность предназначена не только для борьбы с размерами кода, но и для борьбы с копипастом. Например, почти все сишныеп языки имеют одинаковую грамматику для числе, комментариев и т.п.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Visor2004, Вы писали:
V>>Что подразумевается под модульностью в данном контексте? VD>Возможность разбить грамматику на части собирать реальную грамматику из частей. Например, выделить разбор чисел в отдельную грамматику и подключать ее в другие (более большие грамматики) когда нужно. VD>Организация в виде атрибута этому никак не препятствует. Но чтобы данная функциональность появилась нужно ее реализовать. Примерный принцип описывал Вольфхаунд еще пару месяцев назад. VD>Однако, нам сейчас важнее динамическая расширяемость. Так что я бы не распылялся. Еще важной фичей являются точки отсечения. Без них реализовать качественные сообщения об ошибках будет не просто.
Забавная фича, но где она реально нужна? мне в голову приходит только поддержка нескольких диалектов одного языка. Широко распространен в этом смысле только SQL, как часто люди пишут парсеры SQL
Здравствуйте, Чистяков Владислав Юрьевич, Вы писали:
В списке главных достоинств вот это не одно и то же?
Благодаря тому, что PegGrammar предоставляет концепцию областей видимости (Scopes), он позволяет разбирать ряд контекстно-зависимых грамматик вроде грамматик языков C, C++ или Nemerle.
Scope позволяет разбирать некоторые контекстно-зависимые грамматики, например С/C++.