我正在使用Flex + Bison来生成C ++扫描器/解析器,但遇到了生成的代码和包含的头文件中缺少flex函数的问题。
使用g ++编译失败,并带有以下内容:
parser.cxx: In member function 'virtual int yy::parser::parse()':
parser.cxx:465:38: error: 'yylex' was not declared in this scope
symbol_type yylookahead (yylex (yylval, yylloc));
这是一个错误,因为它不应该使用全局自由函数yylex(...)
而是我的扫描仪的yy::scanner::yylex(...)
函数,实现如下:
#include <FlexLexer.h>
#include "parser.hxx"
#undef YY_DECL
#define YY_DECL yy::parser::symbol_type yy::scanner::yylex(yy::parser::semantic_type* yylval, yy::parser::location_type* yylloc)
namespace yy {
class scanner final: public yyFlexLexer
{
public:
scanner(std::istream *in, std::ostream* out): yyFlexLexer(in, out) {}
parser::symbol_type yylex(yy::parser::semantic_type* yylval, yy::parser::location_type* yylloc);
};
这些参数在.y文件中配置为:
%param {parser::semantic_type* yylval} {parser::location_type* yylloc}
flex(.l)和bison(.y)文件都使用标志进行编译,以生成C ++代码并使用g ++编译为:
g++ -lfl parser.cxx scanner.cxx -o lang
由于parser.cxx
和scanner.cxx
是生成的文件。我缺少什么,如何修复解析器应该调用的函数而不是yylex()
?