Информация об изменениях

Сообщение Re[3]: О безусловных переходах от 23.04.2015 7:43

Изменено 25.04.2015 18:10 WolfHound

Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, AlexRK, Вы писали:


ARK>>Обойтись без goto можно всегда. Есть люди, которые считают, что иногда goto делает код проще/лучше. Лично я считаю, что это не так. По моему мнению, если goto делает код проще, то это плохой код.

WH>Удачи переписать без goto. Производительность пострадать не должна.
WH>
WH>  public struct ExtensionRuleParserState
WH>  {
WH>    public mutable newResult : int;
WH>    public mutable newEndPos : int;
WH>    public mutable bestResult : int;
WH>    public mutable bestEndPos : int;
WH>    public mutable lastResult : int;
WH>    public mutable curTextPos : int;
WH>    public mutable parseResult : ParseResult;

WH>    public Append() : void
WH>    {
WH>      assert3(newResult > 0);

WH>      //очищаем флаги
WH>      parseResult.rawTree[newResult] = parseResult.rawTree[newResult] & ExtensibleRuleParser.RawTreeMask.Id;

WH>      //добавляем в список
WH>      parseResult.rawTree[newResult + ExtensibleRuleParser.RawTreeOfs.Next] = lastResult;
WH>      lastResult = newResult;

WH>      // выбираем лучшее правило: побеждает то правило, у которого находится поле спарсившее больше текста
WH>      // если оба правила имеют одинаковое кол-во полей, размеры которых идентичны, ситуация считается неоднозначностью
WH>      when (bestResult <= 0) goto new_better;
WH>      if   (bestEndPos < 0)  if   (newEndPos >= 0) goto new_better; else goto equal;
WH>      else                   when (newEndPos < 0)  goto best_better;

WH>      def newTokens  = parseResult.TokenEnumerator1.Start(newResult,  curTextPos);
WH>      def bestTokens = parseResult.TokenEnumerator2.Start(bestResult, curTextPos);

WH>      while (true)
WH>      {
WH>        def newSize = newTokens.NextTokenSize();
WH>        def bestSize = bestTokens.NextTokenSize();
WH>        when (newSize > bestSize) goto new_better;
WH>        when (newSize < bestSize) goto best_better;
WH>        when (newSize < 0)        goto equal;
WH>      }

WH>    label equal;//АСТ равен лучшему. Неоднозначность.
WH>      parseResult.rawTree[newResult] = parseResult.rawTree[newResult] | ExtensibleRuleParser.RawTreeFlags.Equal;
WH>      assert(bestEndPos == newEndPos);
WH>      return;

WH>    label new_better;//Новый АСТ лучше
WH>      bestEndPos = newEndPos;
WH>      bestResult = newResult;
WH>      parseResult.rawTree[newResult] = parseResult.rawTree[newResult] | ExtensibleRuleParser.RawTreeFlags.Best;
WH>      return;

WH>    label best_better;
WH>      return;
WH>    }
WH>  }
WH>


Ну по производительности код тоже не блещет.
Лучше сделать копипаст и избавится от гоуту.

Например переход goto best_better; заменить на обычный return.
Re[3]: О безусловных переходах
Здравствуйте, WolfHound, Вы писали:

WH>Удачи переписать без goto. Производительность пострадать не должна.


Ну по производительности код тоже не блещет.
Лучше сделать копипаст и избавится от гоуту.

Например переход goto best_better; заменить на обычный return.