flex bison C lex yacc сканирует буферы строк - PullRequest
1 голос
/ 06 февраля 2011

Theres немного кода C что-то вроде:

int doCommand(char* command)
{
    // +2 on strlen is for the two extra '\0' characters
    // needed by flex when scanning strings.
    YY_BUFFER_STATE yybs = yy_scan_buffer(command, strlen(command)+2);
    yy_switch_to_buffer(yybs);
    yyparse();
    yy_delete_buffer(yybs);
}

Он вызывается в цикле примерно так (psuedocode):

read characters upto and including '\n' into a buffer;
add two '\0' characters;
call doCommand(buffer);
zero the buffer; // NOTE: same buffer will be used next loop.

Что не так, так это то, что после успешной обработки первой команды все остальные введенные команды не обрабатываются.

Я распечатал yylineno (который увеличивается, когда гибкий сканер видит '\ n'), и увеличивается только один раз после первой команды.

Я не могу разобраться, если я что-то не так делаю с flex, или это yyparse , который перестает вызывать сканер после первого запуска.

Я был бы очень рад, если бы кто-то мог точно указать, что происходит.

1 Ответ

2 голосов
/ 06 февраля 2011

Можете ли вы попробовать это с отладкой?Проверьте, какие токены читаются.Независимо от того, переключается ли он во времени, какой ввод.

Я не использую гибкие усовершенствования, потому что мне нужна мобильность, поэтому я реализую этот механизм немного иначе - через YY_INPUT.Возможно, полученные токены отличаются от ожидаемых, поэтому я советую сначала отладить лекс-часть.

...