Привет
Вот эта грамматика (совершенно бессмысленная!), как и ожидается, вполне нормально компилируется:
[PegGrammar(
Options = None,
start,
grammar
{
start : int = rule;
rule = ['0'..'9'] (space / &comma);
comma : void = ',';
space : void = ' ';
})]
class Parser
{
start(_ : Nemerle.Peg.NToken) : int
{
1
}
}
Однако, если попытаться указать какой-нибудь тип для правила rule, то вылетает assert:
...
rule : int = ['0'..'9'] (space / &comma);
...
Exception Nemerle.Core.AssertionException: assertion failed in file Grammar\GrammarTyper.Utils.n, line 48
Проблема явно в том, что Peg не может определить тип выражения приоритетного выбора, хотя в данном конкретном случае логично было бы считать его void. Я пока нашел только один способ обойти эту проблему — добавить рядом с предикатом опциональную ссылку на какое-нибудь правило с типом void. Например, вот так:
...
rule : int = ['0'..'9'] (space / space? &comma);
...
Может есть какой-нибудь более красивый способ? А то сильно не хочется замусоривать грамматику.
И, конечно-же, хотелось бы видеть внятное сообщение об ошибке вместо ничего не говорящего assert'а.
Mumitroller
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>