Re[5]: [PEG] Не типизируется правило с предикатами
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.11 15:09
Оценка:
Здравствуйте, Mumitroller, Вы писали:

M>В Паскале после последнего statement в блоке begin-end может не указываться ";". А у меня эти последовательности парсятся разными правилами, поэтому я хочу сматчить ";" в одном правиле, а если его нет — проверить, что дальше идет "end". Примерно так:


M>
block = "begin" statementList "end";
M>statementList = (statement ";")* (statement (";" / &"end"))?;

M>Вероятно, это можно переписать по-другому, но я пока не вижу в этом никакой необходимости.

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

M>В чем косяк (глупость) такой грамматики — я тоже пока не понимаю. Поэтому мне проще использовать workaround. Если потом вылезут какие-то более серьезные проблемы — тогда и буду думать над изменением структуры грамматики.


В общем, я пока не могу решить как лучше поступить. Оставлю пока сообщение об ошибке. Если будут еще жалобы на такое решение, то можно будет заменить тип на void. Благо это не сложно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.