Сообщение Re[3]: О безусловных переходах от 23.04.2015 7:43
Изменено 25.04.2015 18:10 WolfHound
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, AlexRK, Вы писали:
ARK>>Обойтись без goto можно всегда. Есть люди, которые считают, что иногда goto делает код проще/лучше. Лично я считаю, что это не так. По моему мнению, если goto делает код проще, то это плохой код.
WH>Удачи переписать без goto. Производительность пострадать не должна.
WH>
Ну по производительности код тоже не блещет.
Лучше сделать копипаст и избавится от гоуту.
Например переход goto best_better; заменить на обычный return.
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.
WH>Удачи переписать без goto. Производительность пострадать не должна.
Ну по производительности код тоже не блещет.
Лучше сделать копипаст и избавится от гоуту.
Например переход goto best_better; заменить на обычный return.