“ 对于该搜索引擎系列文章,以阿里在github开源的havenask引擎为例进行逐步阐述。github地址:https://github.com/alibaba/havenask”
01 Flex&Bison的名字由来
-
Flex 用于词法分析(lexical analysis,或称 scanning)。Vern Paxson 把一种用 ratfor(当时流行的一种扩展的 Fortran 语言)写成的lex版本改写为C语言的,被称为 flex,意思是“快速词法分析器生成程序”(Fast Lexical Analyzer Generator)。 -
Bison 用于语法分析(syntax analysis,或称 parsing)。bison 来源于 yacc(yet another compiler compiler ),之后,Richard Stallman 添加了大量的新特性并演化成为当前的 bison。
02 词法&语法分析的关系
03 Flex&Bison的安装
sudo apt install flex
sudo apt install bison
若缺少gcc,则 sudo apt-get install -y build-essential
04 Flex文件编写与实践
4.1 辅助定义部分
%option case-insensitive:使词法分析器忽略大小写。
%option yywrap:启用yywrap函数,用于在输入结束时进行缓冲区处理。
%option yylineno:启用行号跟踪功能,以便在出错时输出行号。
%option yyerror:指定一个自定义的错误处理函数,用于在扫描过程中出现错误时调用。
%option do-nothing-on-unbalanced-comment:在注释未正确结束时采取无操作行为(默认行为)。
%option yyllocals:启用本地变量支持,可以在规则中使用yytext等局部变量。
%option yyallow-nested-comment:允许嵌套注释。
%option yyreentrant:启用重入功能,使得多个线程可以安全地共享词法分析器。
%option bison-locations:启用Bison兼容的位置信息支持。
%option std=c99:使用C99标准进行词法分析器的编译。
%option prefix="prefix":为生成的C程序中的变量和函数添加前缀,以避免与用户定义的变量和函数冲突
%option banner:在生成的C程序顶部添加一个横幅,用于显示版权信息、版本号等。
%option yymore:启用yymore函数,用于在扫描过程中读取更多的输入字符。
%option noyywrap:禁用yywrap函数,需要在输入结束时手动调用yywrap函数进行缓冲区处理。
%{
#include <string>
#include "ha3/queryparser/BisonParser.hh"
#include "ha3/queryparser/Scanner.h"
using namespace isearch_bison;
typedef BisonParser::token token;
typedef BisonParser::token_type token_type;
#define yyterminate() return token::END
%}
DIGIT [0-9]
ID_FIRST_CHAR [_[:alpha:]]
ID_CHAR [_[:alnum:]]
SIGNED_CHAR [+-]
4.2 规则部分
AND {
AUTIL_LOG(TRACE2, "|%s|AND|",YYText());
return token::AND;
}
OR {
AUTIL_LOG(TRACE2, "|%s|OR|",YYText());
return token::OR;
}
4.3 用户子程序部分
void Scanner::setDebug(bool debug) {
yy_flex_debug = debug;
}
4.4 Flex实现wc命令
05 Bison文件编写与实践
发表评论