Здравствуйте, VladD2, Вы писали:
VD>И определить, что в итоге разобрано "&" твой код сможет ведь?
Мой код определит что разобрался один символ.
VD>Ну, вот в этом переходе нужно добавить проверку предиката.
В каком этом?
И как его отличить от другого?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
VD>>И определить, что в итоге разобрано "&" твой код сможет ведь? WH>Мой код определит что разобрался один символ.
Ну, а что это именно & он определить не может?
VD>>Ну, вот в этом переходе нужно добавить проверку предиката. WH>В каком этом? WH>И как его отличить от другого?
Давай лучше так. Покажи какой код твой алгоритм сгенерит для случая без предиката.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Ну, а что это именно & он определить не может?
Нет.
ДКА не запоминает путь которым он шол.
VD>Давай лучше так. Покажи какой код твой алгоритм сгенерит для случая без предиката.
Легче стало?
prefixOperator : Located = ("++" / "--" / "+" / "-" / "~" / "!" / "&" / "*")s;
private __GENERATED_PEG__RULE__prefixOperator__(pos : int, text : string) : int
{
unchecked
{
mutable (c : char);
_ = c;
{
def pos =
{
mutable okPos = -1;
mutable curPos = pos;
l6325:
DEFAULT;
when (curPos >= text.Length) goto l6330 [1];;
c = text[curPos];
++curPos;
when (c == '+') goto l6327 [1];;
when (c == '-') goto l6328 [1];;
when (if (c >= '!')
{
if (c >= '*')
{
if (c >= '~')
{
c <= '~'
}; else
{
c <= '*'
}
}; else
{
if (c >= '&')
{
c <= '&'
}; else
{
c <= '!'
}
}
}; else
{
false
}) goto l6329 [1];;
goto l6330 [1];;
l6327:
DEFAULT;
okPos = curPos;
when (curPos >= text.Length) goto l6330 [1];;
c = text[curPos];
++curPos;
when (c == '+') goto l6329 [1];;
goto l6330 [1];;
l6328:
DEFAULT;
okPos = curPos;
when (curPos >= text.Length) goto l6330 [1];;
c = text[curPos];
++curPos;
when (c == '-') goto l6329 [1];;
goto l6330 [1];;
l6329:
DEFAULT;
okPos = curPos;
l6330:
DEFAULT;
okPos
};
if (pos >= 0)
{
__GENERATED_PEG__RULE__s__(pos, text)
}; else -1
}
}
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
VD>Почему просто на == не проверять?
По тому что это бинарный поиск.
Чем больше интервалов тем меньше сравнений по сравнению с наивной схемой.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
VD>>Почему просто на == не проверять? WH>По тому что это бинарный поиск. WH>Чем больше интервалов тем меньше сравнений по сравнению с наивной схемой.
Какой смысл в интервале в один символ? Это банально не эффективно. Два сравнения вместо одного. Если ты заранее знаешь, что интервал состоит из одного символа, то и код для него лучше генерить соответствующий.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Смотри комментарий. VD>
VD> if (c >= '&')
VD> {
VD> c <= '&' // вот сюда бы вставить проверку предката
VD> }; else
VD> {
VD> c <= '!'
VD> }
VD>
VD>Собственно любой автомат определяет путь разбора. Проблема только в том, что в ДКА состояния могут быть объедением нескольких других.
Подумаешь какие мелочи
Чтоб ты знал: Для этого мне предется переделать все алгоритмы работы с FSM. Просто по тому что нужную информацию в текущем варианте хранить негде.
Более того я не представляю куда ее засунуть.
Если по твоему тут все просто сделай сам.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
VD>Какой смысл в интервале в один символ? Это банально не эффективно. Два сравнения вместо одного. Если ты заранее знаешь, что интервал состоит из одного символа, то и код для него лучше генерить соответствующий.
А давай ты посчитаешь сравнения...
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн