Flex Bison 可重入 C++ 解析器:yyscanner 未声明的标识符
Flex Bison Reentrant C++ Parser: yyscanner undeclared identifier
我正在尝试使用带有 flex 和 bison 的 C++ 创建可重入解析器。我也在使用驱动程序 class Driver
。我在 lex 方面收到错误 'yyscanner' : undeclared identifier
。我认为它与 flex 中的可重入选项有关,这很奇怪,因为我假设 driver
会被用在它的位置,因为我将 yylex
声明为 yylex(Driver& driver)
在 driver.h
。我在下面的代码中做错了什么以获得此错误消息吗?任何帮助将不胜感激。
parser.y
%require "3.2"
%define parse.error verbose
%locations
%param { Driver& driver }
%language "c++"
%define api.value.type variant
%code requires {
class Driver;
}
%code {
#include "driver.h"
}
...
lexer.l
%option noyywrap noinput nounput
%option nodefault
%option nounistd
%option reentrant
%{
#include <iostream>
#include <string>
#include "driver.h"
#include "parser.tab.h"
%}
%%
%{
yy::location& loc = driver.location;
%}
...
driver.h
#ifndef DRIVER_HH
#include "parser.tab.h"
#define YY_DECL \
int yylex(Driver& driver)
YY_DECL;
class Driver
{
public:
Driver() {}
yy::location location;
};
#endif // ! DRIVER_HH
如果生成可重入扫描器,则必须定义其原型以包含类型为 yyscan_t
的名为 yyscanner
的参数。您需要使用该参数调用扫描仪。您不能替换为 yyscan_t
参数定义的某些类型,因为您的类型不包括 flex 生成的扫描器使用的数据成员。并且您必须使用名称 yyscanner
,因为这就是 Flex 生成的代码引用数据成员的方式。
如果你想要一个只需要一个参数的 yylex
,“官方”方法是将你的数据成员(或指向它们的指针)放入 yyscan_t
。但是只使用两个参数可能更容易。
我正在尝试使用带有 flex 和 bison 的 C++ 创建可重入解析器。我也在使用驱动程序 class Driver
。我在 lex 方面收到错误 'yyscanner' : undeclared identifier
。我认为它与 flex 中的可重入选项有关,这很奇怪,因为我假设 driver
会被用在它的位置,因为我将 yylex
声明为 yylex(Driver& driver)
在 driver.h
。我在下面的代码中做错了什么以获得此错误消息吗?任何帮助将不胜感激。
parser.y
%require "3.2"
%define parse.error verbose
%locations
%param { Driver& driver }
%language "c++"
%define api.value.type variant
%code requires {
class Driver;
}
%code {
#include "driver.h"
}
...
lexer.l
%option noyywrap noinput nounput
%option nodefault
%option nounistd
%option reentrant
%{
#include <iostream>
#include <string>
#include "driver.h"
#include "parser.tab.h"
%}
%%
%{
yy::location& loc = driver.location;
%}
...
driver.h
#ifndef DRIVER_HH
#include "parser.tab.h"
#define YY_DECL \
int yylex(Driver& driver)
YY_DECL;
class Driver
{
public:
Driver() {}
yy::location location;
};
#endif // ! DRIVER_HH
如果生成可重入扫描器,则必须定义其原型以包含类型为 yyscan_t
的名为 yyscanner
的参数。您需要使用该参数调用扫描仪。您不能替换为 yyscan_t
参数定义的某些类型,因为您的类型不包括 flex 生成的扫描器使用的数据成员。并且您必须使用名称 yyscanner
,因为这就是 Flex 生成的代码引用数据成员的方式。
如果你想要一个只需要一个参数的 yylex
,“官方”方法是将你的数据成员(或指向它们的指针)放入 yyscan_t
。但是只使用两个参数可能更容易。