ПЕГ и ломающая оптимизация.
От: WolfHound  
Дата: 08.12.10 16:17
Оценка:
В текущей реализации ПЕГ парсера есть бага.
При генерации конечных автоматов / рассматривается как недетерминированный выбор.
В результате получается вот что:
  [PegGrammar(s,
  grammar
  {
    x : int = "x"*;
    s : int = ("x" / "xx") x;
  })]
  public class TestPraser
  {
    x(t : Nemerle.Peg.NToken) : int
    {
      t.EndPos - t.StartPos;
    }
    s(_ : Nemerle.Peg.NToken, n : int) : int
    {
      n
    }
  }

      WriteLine(test.Parse(""));
      WriteLine(test.Parse("x"));
      WriteLine(test.Parse("xx"));
      WriteLine(test.Parse("xxx"));
      WriteLine(test.Parse("xxxx"));


дебаг
None
Some (0)
Some (1)
Some (2)
Some (3)

релиз
None
Some (0)
Some (0)
Some (1)
Some (2)


По большому счету это происходит из-за ошибки в грамматеке ("x" / "xx")
По правилам ПЕГ "xx" накогда не сматчится.
Но генератор FSM не различает приоритеты правил.

Для того чтобы это починить придется что-то изобретать.
Вопрос в том нужно ли?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.