Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在另一个命名空间中使用外部yyin_C++_Linker_Bison_Extern_Flex Lexer - Fatal编程技术网

C++ 在另一个命名空间中使用外部yyin

C++ 在另一个命名空间中使用外部yyin,c++,linker,bison,extern,flex-lexer,C++,Linker,Bison,Extern,Flex Lexer,我试图在我的小项目中使用flex和bison工具。 为了正确理解和使用这些工具,我正在编写迷你计算器 问题是我无法在我在另一个命名空间中声明的类的函数中使用变量yyin main()函数应该读取运行参数,并在命名空间ExNameSpace中使用Example::parse_file() 链接我得到的编译文件时: make all bison --defines=parser.hpp --output=parser.cpp parser.y flex --outfile=scanner.cpp s

我试图在我的小项目中使用flex和bison工具。 为了正确理解和使用这些工具,我正在编写迷你计算器

问题是我无法在我在另一个命名空间中声明的类的函数中使用变量
yyin

main()
函数应该读取运行参数,并在命名空间
ExNameSpace
中使用
Example::parse_file()

链接我得到的编译文件时:

make all
bison --defines=parser.hpp --output=parser.cpp parser.y
flex --outfile=scanner.cpp scanner.l
g++ -o program scanner.cpp parser.cpp Example.cpp -lfl 
/tmp/ccyQN7z9.o: In function `ExNameSpace::Example::parse_file(std::string const&)':
parser.cpp:(.text+0xabc): undefined reference to `ExNameSpace::yyin'
parser.cpp:(.text+0xac3): undefined reference to `ExNameSpace::yyin'
parser.cpp:(.text+0xb3e): undefined reference to `ExNameSpace::yyin'
collect2: error: ld returned 1 exit status
make: *** [app] Error 1
我的建议是,变量
yyin
由flex在外部定义,但没有正确地移植到
ExNameSpace
名称空间

附加我使用的源文件

示例。h:

#包括
#包括
#ifndef示例_
#定义示例_
命名空间ExNameSpace{
/*全局命名空间变量*/
外部标准::ostream*err;
课例{
公众:
bool parse_文件(const std::string和file);
};
}
#endif/*示例*/
示例。cpp:

#包括“Example.h”
命名空间ExNameSpace{
std::ostream*err=&std::cout;
示例::示例(){}
示例::~Example(){}
}
parser.y:

%{
#包括
#包括“Example.h”
无效错误(常量字符*);
int-yylex();
使用名称空间ExNameSpace;
%}
%%
/*野牛规则*/
%%
无效错误(常量字符*消息)
{
外部内部yylineno;

*错误问题在于声明

extern FILE* yyin;
在函数
Example::ParseFile
中。由于此声明符没有显式作用域,且包含的方法是命名空间
ExNameSpace
的一部分,因此该声明隐式位于该命名空间中。但由于您从未在任何地方定义
ExNameSpace::yyin
,因此会出现链接失败。默认的
yyin
是在y bison位于全局命名空间中。因此需要将此行更改为

extern FILE * ::yyin;

或者干脆把它全部去掉,因为
yyin
的文件范围声明此时应该已经在文件中可见,所以不需要本地声明来隐藏文件范围声明。

问题在于声明

extern FILE* yyin;
在函数
Example::ParseFile
中。由于此声明符没有显式作用域,且包含的方法是命名空间
ExNameSpace
的一部分,因此该声明隐式位于该命名空间中。但由于您从未在任何地方定义
ExNameSpace::yyin
,因此会出现链接失败。默认的
yyin
是在y bison位于全局命名空间中。因此需要将此行更改为

extern FILE * ::yyin;

或者干脆把它全部去掉,因为
yyin
的文件范围声明此时应该已经在文件中可见,所以不需要本地声明来隐藏文件范围声明。

可以尝试
extern“C”FILE*yyin;
…现在我得到了:
parser.y:在成员函数'bool ExNameSpace::Example::parse_FILE(const string&)中“:解析器。y:62:10:错误:字符串常量解析器之前应为非限定id。y:63:8:错误:“yyin”未在此作用域解析器中声明。y:72:10:错误:“yyin”未在此作用域中声明
请查看“信息性弹出窗口”在标记问题之前,请先在标记上单击。我删除了Flex标记,因为这与Adobe/Apache UI框架无关,并添加了gnu Flex标记,它用于词法分析器。也许可以尝试
extern“C”FILE*yyin;
…现在我得到了:
parser.y:在成员函数'bool ExNameSpace::Example::parse_FILE(const string&)“:解析器。y:62:10:错误:字符串常量解析器之前应为非限定id。y:63:8:错误:“yyin”未在此作用域解析器中声明。y:72:10:错误:“yyin”未在此作用域中声明
请查看“信息性弹出窗口”我删除了Flex标记,因为这与Adobe/ApacheUI框架无关,并添加了GNUflex标记,用于词法分析器。