Здравствуйте, 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. Благо это не сложно.