- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#include <string>
std::string SearchPushString(char StartVkPage[])
{
char push[] = {'p','o', 's', 't'};
char http[] = {'h','t', 't', 'p'};
unsigned int* ipush = (unsigned int*)push;
unsigned long j = 0;
do
{
char* p = &StartVkPage[j];
unsigned int* nextFourSymbol = (unsigned int*)p;
if(nextFourSymbol[0]==ipush[0])
{
if(*p=='p')
ipush = (unsigned int*)http;
else
{
char* postString = new char[650];
memset(postString,0,650);
short int u = 0;
do
{
postString[u] = p[u];
}
while(p[++u]!='"'&&u!=650);
std::string url(postString);
delete [] postString;
return url;
}
}
}
while(StartVkPage[j++]);
return std::string("error");
}
Я все никак не выучу регулярных выражений, ИЧСХ - обхожусь.
в данном случае код и так извратный - и дырявый. регулярки автору бы однозначно помогли.
лексеры это именно то место где регулярками никто не пользуется. потому что производительность сразу в ж. `n` возможных токенов проверяются `m` (длина ввода) раз - это достаточно близко к квадратичной производительности.
внутри этого конечного автомата проверки делаются уже без регулярок.
Ну это уже деталь реализации. А с точки зрения юзера flex'а - там именно регулярки для каждого токена.
Девелопер lex'а - тот, кто пилит сам lex.
Юзер lex'а - другой девелопер, который пилит свою прогу, а lex, внезапно, кхм, юзает.
Что не так то? :)
регулярка - это есть множество строк.
проверка регулярки - проверка является ли строка членом этого множества.
типичная реализация регулярок - автомат, динамически генерируемый в памяти.
лексер как правило состоит из множества токенов. каждый токен регулярка. после генерации ты из кучи автоматов создается один, что бы каждый раз ввод проверять не через Н автоматов, а только через один. и часто этот автомат создается статически (а не динамически) и еще в добавок оптимизируется компилятором. но если это производительность не нужна, то можно и ручками, конечно.
>лексер как правило состоит из множества токенов. каждый токен регулярка.
Так всё же?
Т.е. все-таки регулярки при токенизации используются :)
Короче спор ни о чем.
Не, я же злобный ханжа, любящий самоутверждаться за счет унижения людей (но при этом делающий вид, что помогает им) и глядящий на них как на говно.
P.S. Может быть вместо return "error" стоит выбросить исключение?
НА-ХУ-Я
А-НА-ЛО-ГИЧ-НО.
Ради одного нолика весь массив забивать нулями...
Да еще и цикл, который там ниже по тексту, забагуется и вылезет за границы буфера, если закрывающей " нету.
P.S. Я чуть выше написал как правильно превращать кусок const char * в std::string.