在没有文件i / o的情况下检索重入lexing的结果

时间:2011-10-12 18:08:16

标签: c++ c flex-lexer

我在C ++项目中有一个我想从多个线程调用的flex模块。 我的.lex文件的选项包括堆栈和可重入。 假设可以同时从不同的线程上调用yylex不同的扫描程序对象而没有一个lexing序列阻塞另一个(我认为是这种情况,但我不完全确定),怎么做我恢复了每个的输出?我看到的唯一设施是yyset_out(FILE * handle,yyscan_t scanner),但我不想必须使用文件,因为我只想要lexing的结果而不必写文件。

我将输入设置为:

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然后访问文件缓冲区,但在我看来好像应该有一个更漂亮(更少hackish)的解决方案。

2 个答案:

答案 0 :(得分:1)

好吧,如果您使用的是默认输出,它会转到FILE,但是没有必要这样做 - 您只需编写动作即可将输出发送到任何您想要的地方。您可以定义自己的YY_EXTRA_TYPE数据结构,并使用yyget_extra / yyset_extra来操作它,如果您需要一些额外的每个扫描仪状态来跟踪输出的去向。

答案 1 :(得分:0)