因为富文本过滤器要以php extension的形式安装到线程安全的apache+php环境中,因此过滤器必须是可重入的(Reentrant)。 bison + flex因为要兼容老的yacc+lex,因此修改成可重入的还是比较麻烦,很多变量都已宏的形式重新定义,并且在yyparse和yylex中传递状态参数yyscan_t
如何修改成可重入的呢,概括起来就是在词法文件lex.l内加入%option reentrant bison-bridge,在语法文件grammar.y中加入%pure_parser,再根据bison和flex生成的代码调整一些变量和函数的引用。
由于php extension会不断的被php程序所调用,每次调用因为设计到复杂的各类状态,因而很容易出现内存泄露,因此写了个内存池,过滤器开始前初始化池,过滤器结束后清除池