Re[7]: [PEG]Переделал генерацию FSM на goto.
От: WolfHound  
Дата: 24.11.10 15:30
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>И определить, что в итоге разобрано "&" твой код сможет ведь?

Мой код определит что разобрался один символ.

VD>Ну, вот в этом переходе нужно добавить проверку предиката.

В каком этом?
И как его отличить от другого?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: [PEG]Переделал генерацию FSM на goto.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.11.10 15:44
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>И определить, что в итоге разобрано "&" твой код сможет ведь?

WH>Мой код определит что разобрался один символ.

Ну, а что это именно & он определить не может?

VD>>Ну, вот в этом переходе нужно добавить проверку предиката.

WH>В каком этом?
WH>И как его отличить от другого?

Давай лучше так. Покажи какой код твой алгоритм сгенерит для случая без предиката.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: [PEG]Переделал генерацию FSM на goto.
От: WolfHound  
Дата: 24.11.10 17:42
Оценка:
Здравствуйте, 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) А. Эйнштейн
Re[10]: [PEG]Переделал генерацию FSM на goto.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.11.10 17:52
Оценка:
Здравствуйте, WolfHound, Вы писали:

А что это за изыски:
if (c >= '~') 
{
  c <= '~'
};

Почему просто на == не проверять?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: [PEG]Переделал генерацию FSM на goto.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.11.10 18:01
Оценка:
Здравствуйте, WolfHound, Вы писали:

Смотри комментарий.
            if (c >= '&') 
            {
              c <= '&' // вот сюда бы  вставить проверку предката
            }; else 
            {
              c <= '!'
            }


Собственно любой автомат определяет путь разбора. Проблема только в том, что в ДКА состояния могут быть объедением нескольких других.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: [PEG]Переделал генерацию FSM на goto.
От: WolfHound  
Дата: 24.11.10 18:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Почему просто на == не проверять?

По тому что это бинарный поиск.
Чем больше интервалов тем меньше сравнений по сравнению с наивной схемой.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: [PEG]Переделал генерацию FSM на goto.
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.11.10 18:05
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>Почему просто на == не проверять?

WH>По тому что это бинарный поиск.
WH>Чем больше интервалов тем меньше сравнений по сравнению с наивной схемой.

Какой смысл в интервале в один символ? Это банально не эффективно. Два сравнения вместо одного. Если ты заранее знаешь, что интервал состоит из одного символа, то и код для него лучше генерить соответствующий.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: [PEG]Переделал генерацию FSM на goto.
От: WolfHound  
Дата: 24.11.10 18:12
Оценка:
Здравствуйте, 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) А. Эйнштейн
Re[13]: [PEG]Переделал генерацию FSM на goto.
От: WolfHound  
Дата: 24.11.10 18:14
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Какой смысл в интервале в один символ? Это банально не эффективно. Два сравнения вместо одного. Если ты заранее знаешь, что интервал состоит из одного символа, то и код для него лучше генерить соответствующий.

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