Re: FLEX в многопоточном окружении

From
Igor Plekhov ()
To
Pertzel Family
Date
2002-11-05T10:15:55Z
Area
RU.ALGORITHMS
From: penguin@tcp.gnezdo.vlad.ru (Igor Plekhov)

On Fri, 1 Nov 2002 09:43:22 +0000 (UTC), Pertzel Family <voldemar@relhum.org> wrote:
> 
> > Интересует следующий вопрос : насколько возможно использование flex  в
> > многопоточном окружении. Необходимо поместить парсер в DLL, из которой его
> > могут вызвать множество клиентов.
> 
> flex, собака, использует глобальные переменные,
> причем, принципиально важные, вроде YYTEXT.
> При необходимости создания нескольких
> независимых парсеров, используется опция -P,
> которая переименовывает глобальные переменные
> в сгенерированном Ц-шном коде.

это в данном случае не поможет.  такое переименование полезно, когда нужно
иметь много разных анализаторов.  а тут нужен один анализатор для многих
клиентов.

> Если клиенты при обращении к парсеру всегда
> начинают и заканчивают работу по точной границе
> лексемы и не оставляют в буффере ввода flex
> (речть о flex -- у lex отдельного буфера нет),
> то проблем никаких просто не будет. Если же
> ситуация не такова, да еще при асинхронной
> работе, flex в чистом виде непригоден. *По*
> *слухам* для этого есть в самом пакете добавка
> -- flex++, которой я сам не пользовался.

flex может делать C++ scanner class:

       You  can  also  use  flex to generate a C++ scanner class,
       using the -+ option (or, equivalently, %option c++), which
       is  automatically  specified  if the name of the flex exe-
       cutable ends in a '+', such as flex++.   When  using  this
       option,  flex  defaults  to  generating the scanner to the
       file lex.yy.cc instead of lex.yy.c.  The generated scanner
       includes  the  header  file FlexLexer.h, which defines the
       interface to two C++ classes.

       ...

       Note that a yyFlexLexer object contains its  entire  scan-
       ning state.  Thus you can use such objects to create reen-
       trant scanners.  You can instantiate multiple instances of
       the  same yyFlexLexer class, and you can also combine mul-
       tiple C++ scanner classes together  in  the  same  program
       using the -P option discussed above.

не знаю, что есть из доков под виндой, а в юниксовом мане всё описано.
я сам этой штукой не пользовался.

Игорь
-- 
Registered Linux User #124759
Hi! I'm a .signature virus! Copy me into your ~/.signature to help me spread!
--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)