получение результатов реентерабельного лексинга без файлового ввода-вывода - PullRequest
1 голос
/ 12 октября 2011

У меня есть flex-модуль в проекте C ++, который я хочу вызывать из нескольких потоков. Опции моего .lex файла включают в себя стек и повторный вход. Предполагая, что можно вызывать yylex на разных объектах сканера из разных потоков одновременно и не иметь одного блока лексической последовательности для другого (что, как я думаю , но я не совсем уверен), как мне это сделать? восстановить вывод для каждого из них? Единственное средство, которое я вижу для этого, это yyset_out (дескриптор FILE *, сканер yyscan_t), но я не хочу использовать файлы, потому что мне нужны только результаты лексинга без необходимости записи в файл.

Я установил вход с помощью:

void scanProcedure(...threadInfo...) {
   yyscan_t tscanner;

   yylex_init(tscanner);
   yy_scan_string(threadInfo->lexMe, tscanner);
   yylex(tscanner);

   /* how to retrieve results of lexing in a 
      reentrant manner ( no global state info ) 
      without having to do any file i/o */

   /* threadInfo-> ?? */

   yylex_destroy(tscanner);
}

...

pthread_create( ... scanProcedure ... threadInfoA ... );
pthread_create( ... scanProcedure ... threadInfoB ... );
pthread_create( ... scanProcedure ... threadInfoC ... );

pthread_join( ... );

Кроме того, я понимаю, что мог бы вызвать yyset_out для временного файла и затем получить доступ к файловому буферу, но мне кажется, что должно быть более красивое (менее хакерское) решение, чем это.

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Что ж, если вы используете вывод по умолчанию, он идет в ФАЙЛ, но в этом нет необходимости - вы можете просто написать свои действия, чтобы отправить вывод куда угодно. Вы можете определить свою собственную YY_EXTRA_TYPE структуру данных и использовать yyget_extra / yyset_extra, чтобы манипулировать ею, если вам нужно дополнительное состояние для каждого сканера, чтобы отслеживать, куда направляется вывод.

0 голосов
/ 12 октября 2011
...