Библиотека-парсер, написана на PEG, несколько достаточно больших грамматик. Debug версия занимает — 500 кб, Relese — 1700 кб. Debug — работает, Release — не работает. Куда копать, дело в Peg или это более общая проблема?
Здравствуйте, Ka3a4oK, Вы писали:
KK>Библиотека-парсер, написана на PEG, несколько достаточно больших грамматик. Debug версия занимает — 500 кб, Relese — 1700 кб. Debug — работает, Release — не работает. Куда копать, дело в Peg или это более общая проблема?
В релизе делается ряд оптимизаций. В том числе генерируются ДКА для разбора токенов. В Peg поведение токенов в релизе и дебаге могло отличаться. Возможно в этом дело. А возможно просто баг.
В чем заключается неработоспособность? Не компилируется грамматика? Или прасер парсит не верно?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Ka3a4oK, Вы писали:
KK>>Библиотека-парсер, написана на PEG, несколько достаточно больших грамматик. Debug версия занимает — 500 кб, Relese — 1700 кб. Debug — работает, Release — не работает. Куда копать, дело в Peg или это более общая проблема?
VD>В релизе делается ряд оптимизаций. В том числе генерируются ДКА для разбора токенов. В Peg поведение токенов в релизе и дебаге могло отличаться. Возможно в этом дело. А возможно просто баг.
VD>В чем заключается неработоспособность? Не компилируется грамматика? Или прасер парсит не верно?
Все компилируется, но не парсится.
VD>В Peg поведение токенов в релизе и дебаге могло отличаться. Возможно в этом дело. А возможно просто баг.
Такое различие само по себе разве не баг?
Здравствуйте, Ka3a4oK, Вы писали:
KK>Все компилируется, но не парсится.
Покажи грамматику и на чем она падает. Оптимально, если сможешь выделить минимальный пример.
VD>>В Peg поведение токенов в релизе и дебаге могло отличаться. Возможно в этом дело. А возможно просто баг. KK>Такое различие само по себе разве не баг?
Ну, если и баг, то в дизайне. Просто в дебаге ДКА не использвется и вместо этого используются правила ПЕГ. А в дебаге, для ускорения, испоьзуются ДКА. А они не так гибки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Ka3a4oK, Вы писали:
KK>>Все компилируется, но не парсится.
VD>Покажи грамматику и на чем она падает. Оптимально, если сможешь выделить минимальный пример.
VD>Это первое что нужно сделать для отладки. Возможно сразу поймешь в чем дело. Ну, или мы сможем взглянув на грамматику сказать, что не так.
VD>Далее нужно попробовать вот эту строчку: VD>
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, Ka3a4oK, Вы писали:
_NN>Проблема возникает из-за этого правила: _NN>
_NN>raw_line_r:int= (!'&' anychar_p)* '&';
_NN>
_NN>Если вместо anychar_p вписать другое, что не присутствует в строке, то релиз проходит.
_NN>Нужно найти более простой пример и отлаживать оптимизацию Nemerle.Peg.
Не все так просто. Я не зря привел такой сложный пример.
Если заменить правило
group_a_r:int=(digit_p+ (sp digit_p+ "X" digit_p+)?);
Здравствуйте, Ka3a4oK, Вы писали:
KK>то релиз так же проходит.
Видимо выбора не остается, нужно отлаживать Nemerle.Peg.
Компилятор для этого собирать не нужно, достаточно собрать peg в отдельном проекте и проверять.
Кажись грамматика противоречивая. line_r от raw_line_r отличается только пробелом в конце. В root_r внутри скобок этот последний пробел не принимается: !line_r
но принимается raw_line_r и ожидается пробел: (raw_line_r) sp
А>Кажись грамматика противоречивая. line_r от raw_line_r отличается только пробелом в конце. В root_r внутри скобок этот последний пробел не принимается: !line_r А>но принимается raw_line_r и ожидается пробел: (raw_line_r) sp
Не важно. Это осталось от исходной грамматики. Можно убрать пробел в конце правила line_r и все равно поведение сохранится.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, Ka3a4oK, Вы писали:
KK>>то релиз так же проходит. _NN>Видимо выбора не остается, нужно отлаживать Nemerle.Peg. _NN>Компилятор для этого собирать не нужно, достаточно собрать peg в отдельном проекте и проверять.
Мне интересно, новый PEG aka N2 корректно себя ведет в этой ситуации или нет?
Re[11]: Debug - работает, Release - не работает
От:
Аноним
Дата:
15.06.13 15:12
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:
KK>Не важно. Это осталось от исходной грамматики. Можно убрать пробел в конце правила line_r и все равно поведение сохранится.
Сперва надо разобраться в правильности грамматики и только потом разбираться в различии дебага с релизом. Попробуй свою грамматику написать в визуальном редакторе грамматик и проверить правильность. Например на antlr.
Здравствуйте, Ka3a4oK, Вы писали:
KK>Мне интересно, новый PEG aka N2 корректно себя ведет в этой ситуации или нет?
Скорее да чем нет, но проверить нам не дано =)
Что-то мне подсказывает, что там и другой синтаксис и другие проблемы.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Ka3a4oK, Вы писали:
KK>>Не важно. Это осталось от исходной грамматики. Можно убрать пробел в конце правила line_r и все равно поведение сохранится.
А>Сперва надо разобраться в правильности грамматики и только потом разбираться в различии дебага с релизом. Попробуй свою грамматику написать в визуальном редакторе грамматик и проверить правильность. Например на antlr.
Что значит неправильная грамматика? Под Debug она ведет так как и ожидается? Под Release явно глючит.
Re[13]: Debug - работает, Release - не работает
От:
Аноним
Дата:
15.06.13 16:49
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:
KK>Что значит неправильная грамматика? Под Debug она ведет так как и ожидается? Под Release явно глючит.
Неправильная грамматика означает, что она не разбирает все возможные правильные последовательности символов.
То что твоя грамматика работает на каком-то ограниченном наборе в какой-то неизвестной реализации пег , да еще только в дебаге, это означает что тебе сильно повезло.
Если убрать пробел в конце у line, тебе придется переделать root.
Если убрать пробел в конце у line, то line отличается от raw_line только тем, он принимает чуть ограниченный набор начальных символов. То есть line = digit_groups + raw_line. То есть тебе надо как-то "нормализовать" правила, дальше "упростить".
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Ka3a4oK, Вы писали:
KK>>Что значит неправильная грамматика? Под Debug она ведет так как и ожидается? Под Release явно глючит.
А>Неправильная грамматика означает, что она не разбирает все возможные правильные последовательности символов. А>То что твоя грамматика работает на каком-то ограниченном наборе в какой-то неизвестной реализации пег , да еще только в дебаге, это означает что тебе сильно повезло. А>Если убрать пробел в конце у line, тебе придется переделать root. А>Если убрать пробел в конце у line, то line отличается от raw_line только тем, он принимает чуть ограниченный набор начальных символов. То есть line = digit_groups + raw_line. То есть тебе надо как-то "нормализовать" правила, дальше "упростить".
Я не понимаю такой терминологии — неправильная грамматика.
Приведенная мною грамматика не претендует на какую-то универсальность. Это конкретный набор правил для конкретного генератора парсеров — PEG. Интерпретация правил генератором парсеров описаны здесь http://www.rsdn.ru/article/nemerle/PegGrammar.xml
. Если вы сопоставите описание генератора парсеров по ссылке и приведенные мной правила разбора вы удостоверитесь в том, что сгенерированный парсер должен принимать строку из примера.
Пробел по недосмотру остался от исходной грамматики и не влияет на конечное положение дел. Язык описанный правилом raw_line_r включает в себя язык описанный правилом line_r, но не наоборот.
ROOT_r:int=(!line_r (raw_line_r) sp)* line_r;
Поэтому парсер ROOT_r будет принимать raw_line_r одну за другой через пробел, пока эта raw_line_r "не похожа" line_r. Далее он перейдет к попытке применить правило line_r.
Re[15]: Debug - работает, Release - не работает
От:
Аноним
Дата:
16.06.13 12:52
Оценка:
Здравствуйте, Ka3a4oK, Вы писали:
KK>Я не понимаю такой терминологии — неправильная грамматика.
А чего тут объяснять, грамматика которая парсит неправильные последовательности и не парсит правильные.
KK>Пробел по недосмотру остался от исходной грамматики и не влияет на конечное положение дел. Язык описанный правилом raw_line_r включает в себя язык описанный правилом line_r, но не наоборот.
То есть изначально грамматика "по недосмотру" неправильная. Есть смысл разбираться правильно ли он работает?
KK>
KK>Поэтому парсер ROOT_r будет принимать raw_line_r одну за другой через пробел, пока эта raw_line_r "не похожа" line_r. Далее он перейдет к попытке применить правило line_r.
Так если нет пробела в конце, то эту строку может принять только raw_line. Твоя грамматика не должна принимать строку "111 22222&", тк как нет пробела в конце строки. То что она работает в дебаге, говорит о том что или грамматика неправильная, или реализация пег неправильная, или кто-то говорит неправду.
А>То есть изначально грамматика "по недосмотру" неправильная. Есть смысл разбираться правильно ли он работает? А>Так если нет пробела в конце, то эту строку может принять только raw_line. Твоя грамматика не должна принимать строку "111 22222&", тк как нет пробела в конце строки. То что она работает в дебаге, говорит о том что или грамматика неправильная, или реализация пег неправильная, или кто-то говорит неправду.
_>>Мне вот этот кусок не нравится. Думаю, тут есть неоднозначность выбора group_a, group_b или anychar*.
KK>Тут нет никакого выбора, правила применяются последовательно. Почитайте http://www.rsdn.ru/article/nemerle/PegGrammar.xml
, проанализируйте мою грамматику, и все сомнения уйдут.
Всех тонкостей пег не помню. Выбор неоднозначных правил в пег может работать по разному в зависимости от реализации.
В данном случае если на входе будет "111 111 " (цифры пробел цифры пробел), то разбор может обломаться на "X" (droup_a). А может и откатится назад и перейти к group_b. Скорее всего в релизе из-за оптимизации не работает откат и разбор обламывается. И тот и другой случай корректны для пег, все зависит от конкретной реализации. И это один из минусов пег, он скрывает ошибки грамматики.