使用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>
%}
用flex & bison (lex & yacc)创建可重入(线程安全)的词法分析和语法解析器
最新推荐文章于 2024-08-27 20:30:00 发布
本文介绍了如何使flex(lex)和bison(yacc)生成的词法分析器和语法分析器变得可重入和线程安全。通过在flex中使用c++选项,并在bison中使用%pure_parser标志,可以实现可重入。此外,通过定义YYPARSE_PARAM和YYLEX_PARAM宏,可以传递参数以避免全局变量,从而增强线程安全性。
摘要由CSDN通过智能技术生成