[PEG]Переделал генерацию FSM на goto.
От: WolfHound  
Дата: 21.11.10 14:00
Оценка: 171 (3)
Получил очередные 10% производительности.
Что странно каждая оптимизация разгоняет парсер на ~10%...

Так же сделал поддержку полноценных FSM. Теперь в FSM закатывается не только ? но и * и +. Однако прироста производительности это не дало.
Нужно еще минимизацию FSM сделать. Это должно дать еще немножко прироста и уменьшить размер генерируемого кода.
Например сейчас генерируется вот такой код:
private __GENERATED_PEG__RULE__decimalIntegerLiteral__(pos : int, text : string) : int
{
  unchecked 
  {
    mutable (c : char);
    _  = c;
    
    {
      def pos = 
      {
        mutable okPos = -1;
        mutable curPos = pos;
        l0:
          DEFAULT;
        when (curPos >= text.Length) goto l5 [1];;
        c = text[curPos];
        ++curPos;
        when ('0' <= c && c <= '9') goto l1 [1];;
        goto l5 [1];;
        l1:
          DEFAULT;
        okPos = curPos;
        when (curPos >= text.Length) goto l5 [1];;
        c = text[curPos];
        ++curPos;
        when ('0' <= c && c <= '9') goto l2 [1];;
        goto l5 [1];;
        l2:
          DEFAULT;
        okPos = curPos;
        when (curPos >= text.Length) goto l5 [1];;
        c = text[curPos];
        ++curPos;
        when ('0' <= c && c <= '9') goto l2 [1];;
        goto l5 [1];;
        l4:
          DEFAULT;
        okPos = curPos;
        l5:
          DEFAULT;
        okPos
      };
      if (pos >= 0) 
      {
        def newPos = 
        {
          __GENERATED_PEG__RULE__integerTypeSuffix__(pos, text)
        };
        if (newPos >= 0) 
        {
          ();
          newPos
        }; else 
        {
          ();
          pos
        }
      }; else -1
    }
  }
}

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