powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск последовательности в бинарном массиве
25 сообщений из 270, страница 4 из 11
Поиск последовательности в бинарном массиве
    #39587426
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Запили обычный RawByteString из файла и Pos - он сработает быстрее, тем более под x86. А можно сделать ещё быстрее с SSE и применением пары алгоритмов.

Насколько я понял, у ТС задача поиска сразу нескольких слов в файле и при нахождении - замена. Все акцентируют своё внимание на поиске, хотя скорее всего проседает замена :)
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587427
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

если нужно несколько фраз сильно быстрее искать 'деревом'. Все фразы представляются как дерево ветвления. Сравнивается первый байт каждой фразы с 'текущим', далее идёт ветвление, либо на выход, если ничего не нашлось, либо на конкретную фразу. Что-то наподобие как lzw работает по своим справочникам.
Ну и 'линейный' поиск стоит оптимизировать. Должно на 9 мб искаться моментально.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587436
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Да, тут уже предлагали Ахо-Карасика
Только лучше не дерево, а хеш
И хеш по первому символу - array[Char]
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587463
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикЗачем он ищет в файлах ? И что это, за файлы ??? Что - то вроде архива????
А ты тред с самого начала почитать не пробовал?
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587486
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Опять про хэши..... Не могут быть хэши быстрее, так как - мы генерируем хэш для искаемого слова. И генерируем для сравнения.

По этому я в своём интерпретаторе использовал древовидный вид поиска лексем, как предложил выше makhaon



Док,

Сложно... Чтение не моё
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587497
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

А кто виноват в том, что ты не умеешь хеши использовать?
Хеши в разы быстрее дерева. Тем более, если речь идёт о символах.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587498
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНяшик,

А кто виноват в том, что ты не умеешь хеши использовать?
Хеши в разы быстрее дерева. Тем более, если речь идёт о символах.

Приведи пример - что ты имеешь введу под поиском - хэшом

Если ты собираешься сравнивать хэш, то ты должен для каждой N+1 генерировать новый хэш. Для искаемой строки.

Куда быстрее, чем просто сравнить ....
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587500
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Я уже раза 3 написал про массив от первого символа
И про алгоритм Ахо-Карасика

А твоё дерево лексем - это бред. С точки зрения оптимизации конечно.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587526
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

А где там про хэш хоть слово ?

https://ru.wikipedia.org/wiki/Алгоритм_Ахо_—_Корасик


SOFT FOR YOUА твоё дерево лексем - это бред. С точки зрения оптимизации конечно.

Посмотри что генерируют yacc в связке с bsion. Куча goto + switch
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587536
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

У меня у самого есть суперкрутая утилита CachedSerializer, генерирующая case, и работающая со скоростью света.
Но этот подход хорош тогда, когда перечень строковых констант изначально предопределён и длина идентифицируемой строки в момент поиска известна.

В ситуации, когда в текстовом потоке мы выхватываем "лексемы", эта схема не работает, т.к. лексема и её длина зависит от последовательности символов. В этом случае актуален Ахо-Карасик, только подход при идентификации символов может быть разный. Можно делать полный перебор, поиск в сортированном массиве, дерево (и для заранее определённых констант можно написать case), но быстрее хешей всёравно ничего не будет.

В твоём компиляторе, к примеру, можно существенно ускорить идентификацию лексем до 3 символов за раз с помощью таблиц(хеш). И я хотел это продемонстрировать, только ты из своей же ветки почему-то заблаговременно слился. Такое впечатление, что ты не компилятор пишешь, а рекламируешь дельфовый case.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587561
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Ну так приведи поиск по хэшам. Мб готовая реализации уже есть на том же гите ?
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587562
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНяшик,
В твоём компиляторе, к примеру, можно существенно ускорить идентификацию лексем до 3 символов за раз с помощью таблиц(хеш). И я хотел это продемонстрировать, только ты из своей же ветки почему-то заблаговременно слился. Такое впечатление, что ты не компилятор пишешь, а рекламируешь дельфовый case.

У меня всё равно git. Один и тот же файл, два раза никак не перекомпилируется, если не был изменён. (И нет, он не будет весь компилировать. Только те участки, которые были изменены и добавлены)
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587566
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Ты просто не знаешь, как пользоваться хешами
И да, тебе с самого начала говорили, что не нужно заморачиваться на скорости трансляции скриптов, значительно важнее скорость исполнения
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587569
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Да ты можешь наконец привести своё этакое чудо на хэшах? Или слился (Слился - слился, по настоящему)
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587571
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Да не вопрос
Приведи в качестве примера штук 20 своих лексем и напиши функцию, которая будет анализировать RawByteString и вызывать калбеки с описанием найденного.

А я сделаю то же самое через хеши с упрощённой реализацией
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587572
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU, Няшик,


на чё спорите?
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587577
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

На пинок :)
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587579
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Да не на что. Прощу привести пример, нет - же...


.... Вот те пример из 21 правда. Но ничё.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
function GetNextToken(var StrCode: PWideChar; var Value: PWideChar;
  var StartToken: Cardinal; var LenToken: Byte): PHPTokenType;
label NewStart, TokenStr;
begin
NewStart:
  case WideToLower[PWord(StrCode)^] of
    61: // =
      case WideToLower[PWord(StrCode + 1)^] of
        61: // =
          case WideToLower[PWord(StrCode + 2)^] of
            61: // =
              begin
                CurrentToken := T_IS_IDENTICAL;
                inc(StrCode, 3);
              end;
          else
            begin
              CurrentToken := T_IS_EQUAL;
              inc(StrCode, 2);
            end;
          end;
        62: // >
          begin
            CurrentToken := T_DOUBLE_ARROW;
            inc(StrCode, 2);
          end;
      else
        begin
          CurrentToken := T_ASSIGN;
          inc(StrCode, 1);
        end;
      end;
    62: // >
      case WideToLower[PWord(StrCode + 1)^] of
        61: // =
          begin
            CurrentToken := T_IS_GREATER_OR_EQUAL;
            inc(StrCode, 2);
          end;
        62: // >
          case WideToLower[PWord(StrCode + 2)^] of
            61: // =
              begin
                CurrentToken := T_SR_EQUAL;
                inc(StrCode, 3);
              end;
          else
            begin
              CurrentToken := T_SR;
              inc(StrCode, 2);
            end;
          end;
      else
        begin
          CurrentToken := T_GREATER;
          inc(StrCode, 1);
        end;
      end;
    95: // _
      case WideToLower[PWord(StrCode + 1)^] of
        95: // _
          case WideToLower[PWord(StrCode + 2)^] of
            99: // c
              case WideToLower[PWord(StrCode + 3)^] of
                108: // l
                  case WideToLower[PWord(StrCode + 4)^] of
                    97: // a
                      case WideToLower[PWord(StrCode + 5)^] of
                        115: // s
                          case WideToLower[PWord(StrCode + 6)^] of
                            115: // s
                              case WideToLower[PWord(StrCode + 7)^] of
                                95: // _
                                  case WideToLower[PWord(StrCode + 8)^] of
                                    95: // _
                                      begin
                                        CurrentToken := T_CLASS_C;
                                        inc(StrCode, 9);
                                      end;
                                  else
                                    goto TokenStr;
                                  end;
                              else
                                goto TokenStr;
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
            100: // d
              case WideToLower[PWord(StrCode + 3)^] of
                105: // i
                  case WideToLower[PWord(StrCode + 4)^] of
                    114: // r
                      case WideToLower[PWord(StrCode + 5)^] of
                        95: // _
                          case WideToLower[PWord(StrCode + 6)^] of
                            95: // _
                              begin
                                CurrentToken := T_DIR;
                                inc(StrCode, 7);
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    101: // e
      case WideToLower[PWord(StrCode + 1)^] of
        110: // n
          case WideToLower[PWord(StrCode + 2)^] of
            100: // d
              case WideToLower[PWord(StrCode + 3)^] of
                115: // s
                  case WideToLower[PWord(StrCode + 4)^] of
                    119: // w
                      case WideToLower[PWord(StrCode + 5)^] of
                        105: // i
                          case WideToLower[PWord(StrCode + 6)^] of
                            116: // t
                              case WideToLower[PWord(StrCode + 7)^] of
                                99: // c
                                  case WideToLower[PWord(StrCode + 8)^] of
                                    104: // h
                                      if IsCharNext(StrCode, 9) then
                                      begin
                                        CurrentToken := T_ENDSWITCH;
                                        inc(StrCode, 9);
                                      end
                                      else
                                        goto TokenStr;
                                  else
                                    goto TokenStr;
                                  end;
                              else
                                goto TokenStr;
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
                119: // w
                  case WideToLower[PWord(StrCode + 4)^] of
                    104: // h
                      case WideToLower[PWord(StrCode + 5)^] of
                        105: // i
                          case WideToLower[PWord(StrCode + 6)^] of
                            108: // l
                              case WideToLower[PWord(StrCode + 7)^] of
                                101: // e
                                  if IsCharNext(StrCode, 8) then
                                  begin
                                    CurrentToken := T_ENDWHILE;
                                    inc(StrCode, 8);
                                  end
                                  else
                                    goto TokenStr;
                              else
                                goto TokenStr;
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    103: // g
      case WideToLower[PWord(StrCode + 1)^] of
        111: // o
          case WideToLower[PWord(StrCode + 2)^] of
            116: // t
              case WideToLower[PWord(StrCode + 3)^] of
                111: // o
                  if IsCharNext(StrCode, 4) then
                  begin
                    CurrentToken := T_GOTO;
                    inc(StrCode, 4);
                  end
                  else
                    goto TokenStr;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    105: // i
      case WideToLower[PWord(StrCode + 1)^] of
        102: // f
          if IsCharNext(StrCode, 2) then
          begin
            CurrentToken := T_IF;
            inc(StrCode, 2);
          end
          else
            goto TokenStr;
        115: // s
          case WideToLower[PWord(StrCode + 2)^] of
            115: // s
              case WideToLower[PWord(StrCode + 3)^] of
                101: // e
                  case WideToLower[PWord(StrCode + 4)^] of
                    116: // t
                      if IsCharNext(StrCode, 5) then
                      begin
                        CurrentToken := T_ISSET;
                        inc(StrCode, 5);
                      end
                      else
                        goto TokenStr;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    108: // l
      case WideToLower[PWord(StrCode + 1)^] of
        105: // i
          case WideToLower[PWord(StrCode + 2)^] of
            115: // s
              case WideToLower[PWord(StrCode + 3)^] of
                116: // t
                  if IsCharNext(StrCode, 4) then
                  begin
                    CurrentToken := T_LIST;
                    inc(StrCode, 4);
                  end
                  else
                    goto TokenStr;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    112: // p
      case WideToLower[PWord(StrCode + 1)^] of
        114: // r
          case WideToLower[PWord(StrCode + 2)^] of
            111: // o
              case WideToLower[PWord(StrCode + 3)^] of
                116: // t
                  case WideToLower[PWord(StrCode + 4)^] of
                    101: // e
                      case WideToLower[PWord(StrCode + 5)^] of
                        99: // c
                          case WideToLower[PWord(StrCode + 6)^] of
                            116: // t
                              case WideToLower[PWord(StrCode + 7)^] of
                                101: // e
                                  case WideToLower[PWord(StrCode + 8)^] of
                                    100: // d
                                      if IsCharNext(StrCode, 9) then
                                      begin
                                        CurrentToken := T_PROTECTED;
                                        inc(StrCode, 9);
                                      end
                                      else
                                        goto TokenStr;
                                  else
                                    goto TokenStr;
                                  end;
                              else
                                goto TokenStr;
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    114: // r
      case WideToLower[PWord(StrCode + 1)^] of
        101: // e
          case WideToLower[PWord(StrCode + 2)^] of
            113: // q
              case WideToLower[PWord(StrCode + 3)^] of
                117: // u
                  case WideToLower[PWord(StrCode + 4)^] of
                    105: // i
                      case WideToLower[PWord(StrCode + 5)^] of
                        114: // r
                          case WideToLower[PWord(StrCode + 6)^] of
                            101: // e
                              case WideToLower[PWord(StrCode + 7)^] of
                                95: // _
                                  case WideToLower[PWord(StrCode + 8)^] of
                                    111: // o
                                      case WideToLower[PWord(StrCode + 9)^] of
                                        110: // n
                                        case WideToLower
                                        [PWord(StrCode + 10)^] of
                                        99: // c
                                        case WideToLower
                                        [PWord(StrCode + 11)^] of
                                        101: // e
                                        if IsCharNext(StrCode, 12) then
                                        begin
                                        CurrentToken := T_REQUIRE_ONCE;
                                        inc(StrCode, 12);
                                        end
                                        else
                                        goto TokenStr;
                                        else
                                        goto TokenStr;
                                        end;
                                        else
                                        goto TokenStr;
                                        end;
                                      else
                                        goto TokenStr;
                                      end;
                                  else
                                    goto TokenStr;
                                  end;
                              else
                                goto TokenStr;
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
            116: // t
              case WideToLower[PWord(StrCode + 3)^] of
                117: // u
                  case WideToLower[PWord(StrCode + 4)^] of
                    114: // r
                      case WideToLower[PWord(StrCode + 5)^] of
                        110: // n
                          if IsCharNext(StrCode, 6) then
                          begin
                            CurrentToken := T_RETURN;
                            inc(StrCode, 6);
                          end
                          else
                            goto TokenStr;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    117: // u
      case WideToLower[PWord(StrCode + 1)^] of
        115: // s
          case WideToLower[PWord(StrCode + 2)^] of
            101: // e
              if IsCharNext(StrCode, 3) then
              begin
                CurrentToken := T_USE;
                inc(StrCode, 3);
              end
              else
                goto TokenStr;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    118: // v
      case WideToLower[PWord(StrCode + 1)^] of
        97: // a
          case WideToLower[PWord(StrCode + 2)^] of
            114: // r
              if IsCharNext(StrCode, 3) then
              begin
                CurrentToken := T_VAR;
                inc(StrCode, 3);
              end
              else
                goto TokenStr;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
  else
  TokenStr:
    begin
      CurrentLenToken := 0;
      while not IsCharNext(StrCode, 0) do
      begin
        Value := Value + StrCode^;
        inc(StrCode);
        inc(CurrentLenToken);
      end;
      CurrentToken := T_STRING;
    end;
  end;
end;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
:[use]: T_USE
:[var]: T_VAR
:[require_once]: T_REQUIRE_ONCE
:[return]: T_RETURN
:[protected]: T_PROTECTED
:[isset]: T_ISSET
:
    : T_LIST :[goto]: T_GOTO :[if]: T_IF :[endswitch]: T_ENDSWITCH :[endwhile]: T_ENDWHILE :[__CLASS__]: T_CLASS_C :[__DIR__]: T_DIR :[===]: T_IS_IDENTICAL :[==]: T_IS_EQUAL :[=>]: T_DOUBLE_ARROW :[=]: T_ASSIGN :[>>=]: T_SR_EQUAL :[>>]: T_SR :[>=]: T_IS_GREATER_OR_EQUAL :[>]: T_GREATER
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587580
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкладываю полный код моего генератора

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
$lexem = file_get_contents('lexem');
preg_match_all('/\:\[(.*)\]\:\s*([a-z0-9_]++)/i', $lexem, $v);
if(empty($v[1])) return;

$v = array_combine($v[1], $v[2]);
ksort($v, SORT_STRING);


$List = array("function GetNextToken(var StrCode: PWideChar; var Value: PWideChar;
  var StartToken: Cardinal; var LenToken: Byte): PHPTokenType;
label NewStart, TokenStr;
begin
NewStart:
    case WideToLower[PWord(StrCode)^] of
");

foreach($v as $ValueName => $TokenName) {
    $v = &$List;
    foreach(str_split($ValueName) as $Idx => $vKey) {
        $vKey = serialize(array($Idx, strtolower($vKey)));
        if(!isset($v[$vKey]))
            $v[$vKey] = array();
        elseif(!is_array($v[$vKey]))
            $v[$vKey] = array('Else' => $v[$vKey]);
        $v = &$v[$vKey];
    }

       $v = '   begin
                              CurrentToken :=  '.$TokenName.';
                              inc(StrCode, '. ($Idx + 1) . ');
                            end; ';
}

$Arr = range('a', 'z');

$PrintTokens = null;
$PrintTokens = &$PrintTokens;
$PrintTokens = function ($ListLines, $idx = 0) use (&$PrintTokens, &$Arr) {
    $Else = isset($ListLines['Else']) ? $ListLines['Else'] : 'goto TokenStr;';
    unset($ListLines['Else']);

   if(isset($ListLines[0])) {
        $tmp = $ListLines[0];
        unset($ListLines[0]);
    } else
        $tmp = " case WideToLower[PWord(StrCode + {$idx})^] of  ";

    foreach($ListLines as $i => $v) {
        $i = unserialize($i);
        $tmp .= ord($i[1]) . ': // ' . $i[1] . PHP_EOL . (is_array($v) ? $PrintTokens($v,$i[0]+1) :
                (in_array($i[1], $Arr) ? ' if IsCharNext(StrCode, '. ($i[0]+1)  .') then '
                . substr(trim($v), 0, -1) . ' else ' . $Else . ' ' : $v)
        );
    }

    return $tmp . ' else  '.$Else.' end; ';
};

$tmp = $PrintTokens($List);

if (($pos = strrpos($tmp, ' goto TokenStr;')) !== false) {
  $tmp = substr($tmp, 0, $pos);
  $tmp .= '         TokenStr:
          begin
            CurrentLenToken := 0;
            while not IsCharNext(StrCode, 0) do
            begin
              Value := Value + StrCode^;
              inc(StrCode);
              inc(CurrentLenToken);
            end;
            CurrentToken := T_STRING;
          end;
end;';
}

file_p_contents('tmp', $tmp . ' end;');

`Formatter -delphi tmp`;

...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587581
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это старый генератор, и не жалко его сливать. В новом я всё под move переделал. К примеру

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
          TokenStr:
            begin
              i3 := 0;

              while not IsCharNext(StrCode, i3) do
                inc(i3);

              if i3 <> 0 then
              begin
                SetLength(Value, i3);
                MyMove(StrCode^, Value[1], i3 * SizeOf(EngineChar));
                inc(CurrentLenToken, i3);
                inc(StrCode, i3);
              end;
              CurrentToken := T_STRING;
            end;
          end;
        end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
            36: // $
              begin

                if IsCharVARIABLE(StrCode, 1) then
                begin
                  CurrentToken := T_DOLLAR;
                  inc(StrCode);
                end
                else
                begin
                  CurrentToken := T_VARIABLE;

                  CurrentLenToken := 1;
                  while not IsCharVARIABLE2(StrCode, CurrentLenToken) do
                    inc(CurrentLenToken);

                  SetLength(Value, CurrentLenToken);

                  MyMove(StrCode^, Value[1],
                    CurrentLenToken * SizeOf(EngineChar));
                  inc(StrCode, CurrentLenToken);
                end;
              end;




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
function IsCharNext(const StrCode: EngineType; i: EngineInt): EngineBool;
begin
  case EngineType(StrCode + i)^ of
    #0, '$', '!', '@', '#', '%', '^', '&', '*', '(', ')', '+', '[', ']', '{',
      '}', ':', '"', '|', '\', '''', ';', '<', '>', '?', '/', '.', #32, #10,
      #13, #9, ',', '-', '=', '`':
      Result := True;
  else
    Result := false;
  end;
end;


...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587582
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Приведи в качестве примера штук 20 своих лексем и напиши функцию, которая будет анализировать RawByteString и вызывать калбеки с описанием найденного.

Я что-то не вижу тестового проекта и оговоренной функции. Проверять корректность и замерять производительность мы на чем будем? На заднице? )
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587586
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замеряйте как угодно и на чём угодно, но в исходном
топике (Няшика или чей он там был), а не тут.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587587
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

В других случаях я бы с тобой согласился, ибо против офтопика. Но в данном случае ситуация Ахо-Корасика (т.е. ситуация ТС) в чистом виде.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587595
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Вот проект. Тестируемый файл на 9,38 МБ (9 842 560 байт)

29120 строк с содержимым
isset return if goto === require_once and var protected use => __DIR__ >= endswitch >> __CLASS__ >> endwhile list === == = >>= > JUTRJHIROTJHOTBHNIkoorth iyko hjisset return if goto === require_once and var protected use => __DIR__ >= endswitch >> __CLASS__ >> endwhile list === == = >>= > JUTRJHIROTJHOTBHNIkoorth iyko hj


Время : 0,040280

Код проекта
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  Winapi.Windows,
  System.SysUtils,
  StringCASE;

var
  StartTime, StopTime: Int64;
  iCounterPerSec: Int64;

procedure BeginTime;
begin
  QueryPerformanceCounter(StartTime);
end;

procedure EndTime;
begin
  if QueryPerformanceCounter(StopTime) and QueryPerformanceFrequency
    (iCounterPerSec) then
    Writeln(Format('%.6f', [(StopTime - StartTime) / iCounterPerSec]));
end;

type
  PHPTokenType = (T_END, S_START, T_STRING, T_USE, T_VAR, T_REQUIRE_ONCE,
    T_RETURN, T_PROTECTED, T_ISSET, T_LIST, T_GOTO, T_IF, T_ENDSWITCH,
    T_ENDWHILE, T_CLASS_C, T_DIR, T_IS_IDENTICAL, T_IS_EQUAL, T_DOUBLE_ARROW,
    T_ASSIGN, T_SR_EQUAL, T_SR, T_IS_GREATER_OR_EQUAL, T_GREATER);

var
  TokenInfoString: array [PHPTokenType] of string = (
    'T_END',
    'S_START',
    'T_STRING',
    'T_USE',
    'T_VAR',
    'T_REQUIRE_ONCE',
    'T_RETURN',
    'T_PROTECTED',
    'T_ISSET',
    'T_LIST',
    'T_GOTO',
    'T_IF',
    'T_ENDSWITCH',
    'T_ENDWHILE',
    'T_CLASS_C',
    'T_DIR',
    'T_IS_IDENTICAL',
    'T_IS_EQUAL',
    'T_DOUBLE_ARROW',
    'T_ASSIGN',
    'T_SR_EQUAL',
    'T_SR',
    'T_IS_GREATER_OR_EQUAL',
    'T_GREATER'
  );

var
  filelen, tmpAllocSize: Int64;
  tmpStrCode: PWideChar;

  CurrentToken: PHPTokenType;
  StrCode: PWideChar;
  Value: String;
  CurrentLenToken, i, i2, i3, i4: Cardinal;

function IsCharNext2(i: Byte): Boolean;
begin
  case PWideChar(StrCode + i)^ of
    #0, #32, #10, #13, #9, '_', '=', '>':
      Result := true;
  else
    Result := false;
  end;
end;

function IsCharNext(i: Byte): Boolean; // inline;
begin
  case PWideChar(StrCode + i)^ of
    #0, '$', '!', '@', '#', '%', '^', '&', '*', '+', '[', ']', '{', '}', ':',
      '"', '|', '\', '''', ';', '<', '>', '?', '/', '.', #32, #10, #13, #9, ',',
      '-', '=', '`':
      Result := true;
  else
    Result := false;
  end;
end;

function GetNextToken(): Boolean;
label NewStart, TokenStr;
var
  x: Integer;
begin
  CurrentToken := T_END;
NewStart:
  case PWord(StrCode)^ or $0020 of
    ord(#32), ord(#9), ord(#13), ord(#10):
      begin
        x := 0;
        while true do
        begin
          case StrCode[x] of
            #10, #13, #32, #9:
              Inc(x);
          else
            begin
              Inc(StrCode, x);

              goto NewStart;
            end;
          end;
        end;
        Inc(x);
      end;

    61: // =
      case PWord(StrCode + 1)^ or $0020 of
        61: // =
          case PWord(StrCode + 2)^ or $0020 of
            61: // =
              begin
                CurrentToken := T_IS_IDENTICAL;
                Inc(StrCode, 3);
              end;
          else
            begin
              CurrentToken := T_IS_EQUAL;
              Inc(StrCode, 2);
            end;
          end;
        62: // >
          begin
            CurrentToken := T_DOUBLE_ARROW;
            Inc(StrCode, 2);
          end;
      else
        begin
          CurrentToken := T_ASSIGN;
          Inc(StrCode, 1);
        end;
      end;
    62: // >
      case PWord(StrCode + 1)^ or $0020 of
        61: // =
          begin
            CurrentToken := T_IS_GREATER_OR_EQUAL;
            Inc(StrCode, 2);
          end;
        62: // >
          case PWord(StrCode + 2)^ or $0020 of
            61: // =
              begin
                CurrentToken := T_SR_EQUAL;
                Inc(StrCode, 3);
              end;
          else
            begin
              CurrentToken := T_SR;
              Inc(StrCode, 2);
            end;
          end;
      else
        begin
          CurrentToken := T_GREATER;
          Inc(StrCode, 1);
        end;
      end;
    95: // _
      case PWord(StrCode + 1)^ or $0020 of
        95: // _
          case PWord(StrCode + 2)^ or $0020 of
            99: // c
              case PWord(StrCode + 3)^ or $0020 of
                108: // l
                  case PWord(StrCode + 4)^ or $0020 of
                    97: // a
                      case PWord(StrCode + 5)^ or $0020 of
                        115: // s
                          case PWord(StrCode + 6)^ or $0020 of
                            115: // s
                              case PWord(StrCode + 7)^ or $0020 of
                                95: // _
                                  case PWord(StrCode + 8)^ or $0020 of
                                    95: // _
                                      begin
                                        CurrentToken := T_CLASS_C;
                                        Inc(StrCode, 9);
                                      end;
                                  else
                                    goto TokenStr;
                                  end;
                              else
                                goto TokenStr;
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
            100: // d
              case PWord(StrCode + 3)^ or $0020 of
                105: // i
                  case PWord(StrCode + 4)^ or $0020 of
                    114: // r
                      case PWord(StrCode + 5)^ or $0020 of
                        95: // _
                          case PWord(StrCode + 6)^ or $0020 of
                            95: // _
                              begin
                                CurrentToken := T_DIR;
                                Inc(StrCode, 7);
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    101: // e
      case PWord(StrCode + 1)^ or $0020 of
        110: // n
          case PWord(StrCode + 2)^ or $0020 of
            100: // d
              case PWord(StrCode + 3)^ or $0020 of
                115: // s
                  case PWord(StrCode + 4)^ or $0020 of
                    119: // w
                      case PWord(StrCode + 5)^ or $0020 of
                        105: // i
                          case PWord(StrCode + 6)^ or $0020 of
                            116: // t
                              case PWord(StrCode + 7)^ or $0020 of
                                99: // c
                                  case PWord(StrCode + 8)^ or $0020 of
                                    104: // h
                                      if IsCharNext(9) then
                                      begin
                                        CurrentToken := T_ENDSWITCH;
                                        Inc(StrCode, 9);
                                      end
                                      else
                                        goto TokenStr;
                                  else
                                    goto TokenStr;
                                  end;
                              else
                                goto TokenStr;
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
                119: // w
                  case PWord(StrCode + 4)^ or $0020 of
                    104: // h
                      case PWord(StrCode + 5)^ or $0020 of
                        105: // i
                          case PWord(StrCode + 6)^ or $0020 of
                            108: // l
                              case PWord(StrCode + 7)^ or $0020 of
                                101: // e
                                  if IsCharNext(8) then
                                  begin
                                    CurrentToken := T_ENDWHILE;
                                    Inc(StrCode, 8);
                                  end
                                  else
                                    goto TokenStr;
                              else
                                goto TokenStr;
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    103: // g
      case PWord(StrCode + 1)^ or $0020 of
        111: // o
          case PWord(StrCode + 2)^ or $0020 of
            116: // t
              case PWord(StrCode + 3)^ or $0020 of
                111: // o
                  if IsCharNext(4) then
                  begin
                    CurrentToken := T_GOTO;
                    Inc(StrCode, 4);
                  end
                  else
                    goto TokenStr;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    105: // i
      case PWord(StrCode + 1)^ or $0020 of
        102: // f
          if IsCharNext(2) then
          begin
            CurrentToken := T_IF;
            Inc(StrCode, 2);
          end
          else
            goto TokenStr;
        115: // s
          case PWord(StrCode + 2)^ or $0020 of
            115: // s
              case PWord(StrCode + 3)^ or $0020 of
                101: // e
                  case PWord(StrCode + 4)^ or $0020 of
                    116: // t
                      if IsCharNext(5) then
                      begin
                        CurrentToken := T_ISSET;
                        Inc(StrCode, 5);
                      end
                      else
                        goto TokenStr;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    108: // l
      case PWord(StrCode + 1)^ or $0020 of
        105: // i
          case PWord(StrCode + 2)^ or $0020 of
            115: // s
              case PWord(StrCode + 3)^ or $0020 of
                116: // t
                  if IsCharNext(4) then
                  begin
                    CurrentToken := T_LIST;
                    Inc(StrCode, 4);
                  end
                  else
                    goto TokenStr;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    112: // p
      case PWord(StrCode + 1)^ or $0020 of
        114: // r
          case PWord(StrCode + 2)^ or $0020 of
            111: // o
              case PWord(StrCode + 3)^ or $0020 of
                116: // t
                  case PWord(StrCode + 4)^ or $0020 of
                    101: // e
                      case PWord(StrCode + 5)^ or $0020 of
                        99: // c
                          case PWord(StrCode + 6)^ or $0020 of
                            116: // t
                              case PWord(StrCode + 7)^ or $0020 of
                                101: // e
                                  case PWord(StrCode + 8)^ or $0020 of
                                    100: // d
                                      if IsCharNext(9) then
                                      begin
                                        CurrentToken := T_PROTECTED;
                                        Inc(StrCode, 9);
                                      end
                                      else
                                        goto TokenStr;
                                  else
                                    goto TokenStr;
                                  end;
                              else
                                goto TokenStr;
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    114: // r
      case PWord(StrCode + 1)^ or $0020 of
        101: // e
          case PWord(StrCode + 2)^ or $0020 of
            113: // q
              case PWord(StrCode + 3)^ or $0020 of
                117: // u
                  case PWord(StrCode + 4)^ or $0020 of
                    105: // i
                      case PWord(StrCode + 5)^ or $0020 of
                        114: // r
                          case PWord(StrCode + 6)^ or $0020 of
                            101: // e
                              case PWord(StrCode + 7)^ or $0020 of
                                95: // _
                                  case PWord(StrCode + 8)^ or $0020 of
                                    111: // o
                                      case PWord(StrCode + 9)^ or $0020 of
                                        110: // n
                                        case PWord(StrCode + 10)^ or $0020 of
                                        99: // c
                                        case PWord(StrCode + 11)^ or $0020 of
                                        101: // e
                                        if IsCharNext(12) then
                                        begin
                                        CurrentToken := T_REQUIRE_ONCE;
                                        Inc(StrCode, 12);
                                        end
                                        else
                                        goto TokenStr;
                                        else
                                        goto TokenStr;
                                        end;
                                        else
                                        goto TokenStr;
                                        end;
                                      else
                                        goto TokenStr;
                                      end;
                                  else
                                    goto TokenStr;
                                  end;
                              else
                                goto TokenStr;
                              end;
                          else
                            goto TokenStr;
                          end;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
            116: // t
              case PWord(StrCode + 3)^ or $0020 of
                117: // u
                  case PWord(StrCode + 4)^ or $0020 of
                    114: // r
                      case PWord(StrCode + 5)^ or $0020 of
                        110: // n
                          if IsCharNext(6) then
                          begin
                            CurrentToken := T_RETURN;
                            Inc(StrCode, 6);
                          end
                          else
                            goto TokenStr;
                      else
                        goto TokenStr;
                      end;
                  else
                    goto TokenStr;
                  end;
              else
                goto TokenStr;
              end;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    117: // u
      case PWord(StrCode + 1)^ or $0020 of
        115: // s
          case PWord(StrCode + 2)^ or $0020 of
            101: // e
              if IsCharNext(3) then
              begin
                CurrentToken := T_USE;
                Inc(StrCode, 3);
              end
              else
                goto TokenStr;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
    118: // v
      case PWord(StrCode + 1)^ or $0020 of
        97: // a
          case PWord(StrCode + 2)^ or $0020 of
            114: // r
              if IsCharNext(3) then
              begin
                CurrentToken := T_VAR;
                Inc(StrCode, 3);
              end
              else
                goto TokenStr;
          else
            goto TokenStr;
          end;
      else
        goto TokenStr;
      end;
  else
  TokenStr:
    begin
      i3 := 0;

      while not IsCharNext(i3) do
        Inc(i3);

      if i3 <> 0 then
      begin
        SetLength(Value, i3);
        Move(StrCode^, Value[1], i3 * SizeOf(WideChar));
        Inc(CurrentLenToken, i3);
        Inc(StrCode, i3);
        CurrentToken := T_STRING;
      end;

    end;
  end;

  Result := CurrentToken <> T_END;
end;

function GetTokenName(FTokenId: PHPTokenType): string; inline;
begin
  Result := TokenInfoString[FTokenId];
end;

function FileSeek64(Handle: THandle; const Offset: Int64;
  Origin: Integer): Int64;
begin
  Result := Offset;
  Int64Rec(Result).Lo := SetFilePointer(Handle, Int64Rec(Result).Lo,
    @Int64Rec(Result).Hi, Origin);
  if (Int64Rec(Result).Lo = $FFFFFFFF) and (GetLastError <> 0) then
    Int64Rec(Result).Hi := $FFFFFFFF;
end;

function LoadPHPFile(PHPFile: PWideChar): Boolean;

var
  TFile: THandle;
  baf: TBytes;

begin
  TFile := FileOpen(PHPFile, $0000 or $0020);
  Result := TFile <> INVALID_HANDLE_VALUE;
  if Result then
  begin
    filelen := FileSeek64(TFile, 0, 2);

    FileSeek64(TFile, 0, 0);
    SetLength(baf, filelen);
    FileRead(TFile, baf, 0, filelen);
    FileClose(TFile);

    tmpAllocSize := (filelen + 1) * SizeOf(WideChar);

    tmpStrCode := AllocMem(tmpAllocSize);

    MultiByteToWideChar(CP_UTF8, 8, @baf[0], filelen, @tmpStrCode[0], filelen);

    StrCode := tmpStrCode;

    Finalize(baf);

  end;
end;

procedure ClosePHPFile;
begin
  FreeMem(tmpStrCode, tmpAllocSize);
  tmpAllocSize := 0;
  tmpStrCode := nil;
  StrCode := nil;
  filelen := 0;
  CurrentToken := S_START;
  CurrentLenToken := 0;
  Value := '';
end;

begin
  BeginTime;

  LoadPHPFile('1.file');

  while GetNextToken do
  begin
   // Writeln(GetTokenName(CurrentToken) + '. Value(' + IntToStr(CurrentLenToken)
   //   + '):' + Value);
  end;

  ClosePHPFile;
  EndTime;

  Readln;

end.

...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39587598
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно удалить StringCASE ... Это случайно попало - отходы промышленности
...
Рейтинг: 0 / 0
25 сообщений из 270, страница 4 из 11
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск последовательности в бинарном массиве
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]