使用flex(lex)和bison(yacc)可以非常方便的创建词法分析和语法分析器,典型的这类程序都是
使用一些全局变量进行信息的传递,这也是程序默认的方式,比如:flex解析到一个string,可以通过
yylval传递给bison;再就是flex和bison默认是通过一些全局变量来保存解析的status信息。简单点说,
flex和bison默认创建的词法分析和语法分析的C代码都不是线程安全的,都是不可重入的。
随着多线程编码在linux上的广泛使用,我们对线程安全的词法分析和语法分析的需求也越来越强烈。
本节讨论一下实施方法。
(1) flex的可重入实施
使用flex创建C++的词法解析器时,默认就是可重入的。
需求加入:
%option c++
flex test.lex时,会自动生成lex.yy.cc文件。
root@horde1:~/test/Reentrant Parser#locate FlexLexer.h
/usr/include/FlexLexer.h
可以查看一下FlexLexer.h
里面定义了2个类:FlexLexer和yyFlexLexer
说明见:
http://dinosaur.compilertools.net/flex/flex_19.html#SEC19
范例:
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
%}
%option yylineno
%option noyywrap
%option c++
%%
insert { return CMD_INSERT; }
delete { return CMD_DELETE;}
update { return CMD_UPDATE;}
select { return CMD_SELECT;}
[ \n\t\r]+ { ; }
. { return CMD_ERROR;}
%%
我自己做了集成,把要解析的命令传给自己的class:
#ifndef _DO_H

本文介绍了如何使flex(lex)和bison(yacc)生成的词法分析器和语法分析器变得可重入和线程安全。通过在flex中使用c++选项,并在bison中使用%pure_parser标志,可以实现可重入。此外,通过定义YYPARSE_PARAM和YYLEX_PARAM宏,可以传递参数以避免全局变量,从而增强线程安全性。

2403

被折叠的 条评论
为什么被折叠?



