我在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)的解决方案。
答案 0 :(得分:1)
好吧,如果您使用的是默认输出,它会转到FILE,但是没有必要这样做 - 您只需编写动作即可将输出发送到任何您想要的地方。您可以定义自己的YY_EXTRA_TYPE
数据结构,并使用yyget_extra / yyset_extra来操作它,如果您需要一些额外的每个扫描仪状态来跟踪输出的去向。
答案 1 :(得分:0)