LINUX.ORG.RU

lex + «async»


0

0

Хмм сам я новичок с этим инструментом, но как я понимаю я где-то описываю регэкспы и потом из этого генерирую код C в который я могу использовать как

while (yylex()) { do_smth_with_lexem(); }

при этом автомагически все работает хорошо ловя самые длинные match'и. Это то что мне нужно (самые длинные match'и) но способ работы это не то что мне нужно...

А нужно мне как-то так:

for (;;;) {
....c = get_char_from_somewhere();
....give_this_char_to_lex_somehow(c)
....if (yylex_async()) { do_smth_with_lexem(); }
}

Возможно ли это в lex?

Re: lex + "async"

> Возможно ли это в lex?
То есть можно конечно скомпилировать лексер и потом ему кидать эти char'ы через pipe или сделать что-нибудь вроде stdin=file, но может можно как-то прямее?

dissident ()

Re: lex + "async"

А вам точно асинхронность нужна?
Просто если ваша функция get_char_from_somewhere() блокируется, то оба ваших фрагмента эквивалентны по действию,
не блокируется -- второй вариант жрет 100% cpu
Другое дело, если
c = get_char_from_somewhere();
give_this_char_to_lex_somehow(c)
if (yylex_async()) { do_smth_with_lexem(); }
было бы расположено в обработчике события, а не в цикле.

Если же нужно просто читать символы с произвольного источника:
создайте функцию
int yywrap()
{
char buf[BS];
int len;
YY_BUFFER_STATE new_buffer;

len=read_chars_somewhere(buf, sizeof(buf));
if (0>=len)
return 1;
new_buffer=yy_scan_bytes(buf, len);
yy_delete_buffer(YY_CURRENT_BUFFER);
yy_switch_to_buffer(new_buffer);
return 0;
}
и продолжайте использовать while (yylex()) { do_smth_with_lexem(); }

Dr_ZLO ()

Re: lex + "async"

Нужно переопределить макрос YY_INPUT в lex-файле.

k_andy ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.