[PEG] Не типизируется правило с предикатами
От: Mumitroller Беларусь  
Дата: 03.06.11 10:16
Оценка:
Привет

Вот эта грамматика (совершенно бессмысленная!), как и ожидается, вполне нормально компилируется:
[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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.