PegGrammar - как ловить ошибки?
От: matumba  
Дата: 20.08.13 14:47
Оценка:
Вопросец разработчикам парсера: вот есть грамматика, повешенная на класс. Далее создаём экземпляр этого класса и вызываем Parse(). А что надо делать, чтобы перехватить ошибку неправильного входа и красиво на неё указать?
После def (len, res) = calc.TryParse("1 + -7 +6") я получаю (-1, 0) и.... чо?
Re: PegGrammar - как ловить ошибки?
От: matumba  
Дата: 20.08.13 15:51
Оценка:
Разобрался, найдя одно давнее сообщение. Вот:

Main() : void
        {
            def calc = CalcParser();
            def source = "1 + -7 +6";
            def (len, res) = calc.TryParse(source);
            if (len > 0) {
                Log($"Result: $res");
            } else {
                def (pos, ids) = calc.GetMaxRollbackPosAndIds();
                Log("Error!");
                Log(source);
                Log(String(' ', pos) + "^  <- Expected: " + $<# ..$(ids; "\r\n    "; id => calc.GetRuleName(id)) #>);
            }
            _ = Console.ReadKey();
        }


1. "Нельзя просто взять и рассказать о PegGrammar без упоминания об обработке ошибок!"
2. GetMaxRollbackPosAndIds — не самое лучшее имя для такой функции.
3. Есть ли по ней документация?
4. Что делать со всеми этими IDs? Зачем их так много?
5. Оператор ..$ — выглядит клёво, но что делает — непонятно.

Можно на это ответить?
Re: PegGrammar - как ловить ошибки?
От: STDray http://stdray.livejournal.com
Дата: 20.08.13 16:19
Оценка: 4 (2)
Здравствуйте, matumba, Вы писали:

M> А что надо делать, чтобы перехватить ошибку неправильного входа и красиво на неё указать?


Я писал разбор примитивной грамматики и делал вот так

            def mkError(parser)
                def (pos, expected) = parser.GetMaxRollbackPosAndNames()
                def expected = expected.NToList()
                def msg =
                    if (expected.IsEmpty) "Unexpected character."
                    else match (expected.DivideLast())
                        | ([], last) => $"Expected $last."
                        | (expected, last) => $"Expected ..$expected or $last."
                Message.FatalError(parser.ToLocation(pos, pos + 1),
Re: PegGrammar - как ловить ошибки?
От: _NN_ www.nemerleweb.com
Дата: 20.08.13 16:19
Оценка: 6 (1)
Здравствуйте, matumba, Вы писали:

M>Вопросец разработчикам парсера: вот есть грамматика, повешенная на класс. Далее создаём экземпляр этого класса и вызываем Parse(). А что надо делать, чтобы перехватить ошибку неправильного входа и красиво на неё указать?

M>После def (len, res) = calc.TryParse("1 + -7 +6") я получаю (-1, 0) и.... чо?


Q&amp;A содержит полезные ссылки.
Скажем: Обработка ошибок в Nemerle.Peg
Автор: VladD2
Дата: 09.11.12



Насчет ..$:

$"..$col" ==> склеивает элементы col с разделителем запятая.
$<#..$(col; sep; func)#> ==> склеивает элементы col с разделителем sep, при этом обрабатывая функцией func (T -> T).
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: PegGrammar - как ловить ошибки?
От: matumba  
Дата: 20.08.13 18:09
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Q&A содержит полезные ссылки.


Спасибо, _НН_! Всё же настаиваю на том, что подобные вещи должны быть описаны прямо в статье
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.
. Вопрос отнюдь не праздный или второстепенный, такие следует сразу освещать. Зато с "расширяемыми грамматиками" как раз можно было повременить — люди сначала должны освоить азы.

Кста, как ты нашёл этот форум?? В списке форумов такого нет.

_NN>$"..$col" ==> склеивает элементы col с разделителем запятая.


Клёво! Тыщу раз нужен был.

_NN>$<#..$(col; sep; func)#> ==> склеивает элементы col с разделителем sep, при этом обрабатывая функцией func (T -> T).


Ага, тоже полезно. Вместо всяких join/select; Спасибо!
Они тоже где-то в ФАКах описаны?
Re[3]: PegGrammar - как ловить ошибки?
От: _NN_ www.nemerleweb.com
Дата: 20.08.13 18:32
Оценка:
Здравствуйте, matumba, Вы писали:

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


_NN>>Q&A содержит полезные ссылки.


M>Спасибо, _НН_! Всё же настаиваю на том, что подобные вещи должны быть описаны прямо в статье
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.
. Вопрос отнюдь не праздный или второстепенный, такие следует сразу освещать. Зато с "расширяемыми грамматиками" как раз можно было повременить — люди сначала должны освоить азы.


Поддерживаю, но статью писал не я.

M>Кста, как ты нашёл этот форум?? В списке форумов такого нет.

Какой форум ?
Q&A прямо наверху в заголовках. Слева от "Автор"

_NN>>$"..$col" ==> склеивает элементы col с разделителем запятая.


M>Клёво! Тыщу раз нужен был.


_NN>>$<#..$(col; sep; func)#> ==> склеивает элементы col с разделителем sep, при этом обрабатывая функцией func (T -> T).


M>Ага, тоже полезно. Вместо всяких join/select; Спасибо!

M>Они тоже где-то в ФАКах описаны?
Они описаны на форуме, но поиском не удалось найти с первого раза. Попробуй поискать.

Есть много полезных ссылок в wiki: https://github.com/rsdn/nemerle/wiki/_pages
И иногда в тестах попадаются хорошие примеры.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: PegGrammar - как ловить ошибки?
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.08.13 19:55
Оценка:
Здравствуйте, matumba, Вы писали:

M>4. Что делать со всеми этими IDs? Зачем их так много?


Ты же сам код привел — передавать в GetRuleName(). Она вернет имя правила на котором облом произошел.

M>5. Оператор ..$ — выглядит клёво, но что делает — непонятно.


Дык документацию надо читать. Там все описано.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: PegGrammar - как ловить ошибки?
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.08.13 19:57
Оценка:
Здравствуйте, matumba, Вы писали:

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


Статью появилась раньше чем этот механизм. Надо, конечно, ее доработать.

Могу порадовать, что в Н2 обработка ошибок сделана очень круто. Там и восстановление будет, и более качественная информация, и текстовое сообщение будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: PegGrammar - как ловить ошибки?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 20.08.13 20:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Могу порадовать, что в Н2 обработка ошибок сделана очень круто. Там и восстановление будет, и более качественная информация, и текстовое сообщение будет.


В смысле, всё это уже есть, или только частично или в планах?
Ce n'est que pour vous dire ce que je vous dis.
Re[3]: PegGrammar - как ловить ошибки?
От: matumba  
Дата: 20.08.13 20:47
Оценка:
Здравствуйте, VladD2, Вы писали:

M>>4. Что делать со всеми этими IDs? Зачем их так много?

VD>Ты же сам код привел — передавать в GetRuleName().

Но "обламывается" же одно правило, зачем возвращается целый список?

VD>Дык документацию надо читать. Там все описано.


У Немерле прямо скажем — не самая лучшая документация. Я читал и вводные статьи, и про макросы, но это как бы "сливки" (причём с излишне техническим углублением), а вот классического описания языка (как у C#) — нет. Понятно, что бóльшая часть языка сидит в макросах, но начинающим это не интересно — им нужно знать, что уже есть и повсеместные примеры как это юзать. Можно даже обойтись без дотошных определений, но нужна краткая и всепокрывающая страница по всем возможностям — чтобы быстро находить незнакомые вещи.
Re[5]: PegGrammar - как ловить ошибки?
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.08.13 12:43
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>В смысле, всё это уже есть, или только частично или в планах?


Большая часть уже написана. Сейчас шлифуем. Сообщения качественные уже давно есть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: PegGrammar - как ловить ошибки?
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.08.13 12:45
Оценка:
Здравствуйте, matumba, Вы писали:

M>Но "обламывается" же одно правило, зачем возвращается целый список?


Обламываться могут сразу несколько правил.

VD>>Дык документацию надо читать. Там все описано.


M>У Немерле прямо скажем — не самая лучшая документация.


Какие проблемы?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: PegGrammar - как ловить ошибки?
От: matumba  
Дата: 21.08.13 13:21
Оценка:
Здравствуйте, VladD2, Вы писали:

M>>Но "обламывается" же одно правило, зачем возвращается целый список?


VD>Обламываться могут сразу несколько правил.


Каким образом? Ты про вложенные правила?

У меня на грамматике "калькулятор" почему-то выдалось единственное правило — num (парсинг числа). Тогда по идее должно было выдаться и sum, и start. Вот грамматика еси чо:

num : int = ['0'..'9']+;
S : void = ' '*;
start : int = S sum ![Any];
sum : int = num S ('+' S num S)*;


M>>У Немерле прямо скажем — не самая лучшая документация.

VD>Какие проблемы?

Проблемы организации и наименования документов. Лексика — последнее, куда я полезу за списковым оператором.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.