Bison解析器:多解析器、冲突处理与状态管理
1. 多解析器的实现
在单个程序中包含两个完整的解析器时,由于Bison解析器通常有相同的入口点yyparse()、调用相同的词法分析器yylex(),并使用相同的标记值变量yylval,以及解析表和解析栈都存于全局变量中,直接编译和链接两个语法文件会导致大量符号重复定义的问题。解决办法是改变Bison使用的函数和变量名。
1.1 使用%name - prefix或-p标志
可以在Bison源代码中使用声明来更改生成解析器中名称的前缀,例如:
%name - prefix "pdq"这样会生成一个入口点为pdqparse()的解析器,它会调用词法分析器pdqlex()等。受影响的名称包括yyparse()、yylex()、yyerror()、yylval、yychar和yydebug。也可以使用-p标志在命令行指定前缀,-b标志指定生成的C文件的前缀,示例命令如下: