ПЕГ и ломающая оптимизация.
От: 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) А. Эйнштейн
Re: ПЕГ и ломающая оптимизация.
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.12.10 17:46
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>По большому счету это происходит из-за ошибки в грамматеке ("x" / "xx")

WH>По правилам ПЕГ "xx" накогда не сматчится.
WH>Но генератор FSM не различает приоритеты правил.

WH>Для того чтобы это починить придется что-то изобретать.

WH>Вопрос в том нужно ли?

В таких ситуациях самым правильным было бы выдавать сообщения об ошибке.
Ты можешь выявлять случаи когда в списке литералов более длинные идут после более коротких?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: ПЕГ и ломающая оптимизация.
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.12.10 17:47
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В таких ситуациях самым правильным было бы выдавать сообщения об ошибке.


Это позволило бы делать оптимизации не учитывая особенностей расположения литералов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.