- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在我的小项目中使用 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:
#include <string>
#include <iostream>
#ifndef EXAMPLE_H_
#define EXAMPLE_H_
namespace ExNameSpace {
/* global namespace variable */
extern std::ostream *err;
class Example {
public:
bool parse_file (const std::string &file);
};
}
#endif /* EXAMPLE_H_ */
示例.cpp:
#include "Example.h"
namespace ExNameSpace {
std::ostream *err = &std::cout;
Example::Example() {}
Example::~Example() {}
}
解析器.y:
%{
#include <stdio.h>
#include "Example.h"
void yyerror (const char *);
int yylex();
using namespace ExNameSpace;
%}
%%
/* bison rules */
%%
void yyerror(const char *message)
{
extern int yylineno;
*err << "(line " << yylineno << ") " << message << std::endl;
}
bool Example::parse_file(const std::string &file)
{
extern FILE* yyin;
if(!(yyin=fopen(file.c_str(), "r")))
{
*err << "Could not open " << file << std::endl;
return true;
}
int result=yyparse();
fclose(yyin);
return result;
}
扫描仪.l:
%{
#include "parser.hpp"
#include "Example.h"
using namespace ExNameSpace;
%}
%%
/* flex rules */
%%
生成文件:
all: app
app: scanner.l parser.y
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
clean:
rm parser.hpp parser.cpp scanner.cpp
最佳答案
问题是声明
extern FILE* yyin;
在函数 Example::ParseFile
中。由于此声明器没有显式范围,并且包含方法是命名空间 ExNameSpace
的一部分,因此声明隐式位于该命名空间中。但是,由于您从未在任何地方定义 ExNameSpace::yyin
,因此您会遇到链接失败的情况。 bison 创建的默认 yyin
在全局命名空间中。所以你需要把这一行改成
extern FILE * ::yyin;
或者干脆完全去掉它,因为 yyin
的文件范围声明此时在文件中应该已经可见,所以不需要局部声明来隐藏文件-范围一。
关于c++ - 在另一个命名空间中使用外部 yyin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14464935/
我正在尝试在我的小项目中使用 flex 和 bison 工具。为了正确理解和使用我正在编写迷你计算器的工具。 问题是我无法在我在另一个命名空间中声明的类的函数中使用变量 yyin。 main() 函数
我从这个问题中遇到了一个新问题:Call a function in a Yacc file from another c file所以这一次,我遇到了 Lex 和 Yacc 中的 yyin 函数问题
我正在使用 Yacc 和 lex 来解析 C 类型语言, 我已经使用 C++ 构建了数据结构。 一切正常,但我无法在 main.cpp 中使用 yyin 读取输入文件。 以下是代码: 请帮忙 ! #i
我正在用 flex + bison 编写一种基本语言,用于我自己的个人研究/运行简单的脚本以获得乐趣。 它通过命令行获取用户输入,对其进行解析,然后执行所需的结果。我想添加功能加载文件。 例如,当“l
我有一个 C 库,我想在不修改库的情况下将其与 C++ 代码进行交互。它有一个从 yyin 读取的 yacc 生成的前端,它是一个 FILE *。我想将 yyin 设置为从内存中读取的 FILE *
编辑:下面接受的解决方案。 我在这里处理 Bison mfcalc 示例: https://www.gnu.org/software/bison/manual/bison.html#Mfcalc-Ma
我正在从事 Flex & Bison 项目。我的 flex & bison 运行良好,但我正在尝试将 argv 作为输入 (yyin)。所以我改变了 yyin 以便它接受 argv[1] 但它实际上不
我将传递给 yacc 中的 main 的参数存储在一个文件中。现在我希望 lex 从这个文件而不是终端读取它的输入。我知道我可以将 yyin 指向一个文件像 yyin = fopen("fn","r"
我想报告一个错误的解决方案在 Mac OS X El Capitan 版本 10.11.2 中安装 OpenFOAM 3.0.1 时得到错误是: "error: member reference ty
您好,我收到以下错误 main.c: undefined reference to yyin main.c: undefined reference to yyparse 这就是我正在做的我有一个 l
我知道在 flex 中你只需要执行 yyin = fopen(filename, "r"); 来读取文件,但是如果你想从 bison 中读取文件怎么可能呢?我正在尝试将 flex 和 bison 结合
我正在尝试使用 flex 和 bison 来创建一个编译器。但是当我尝试编译时收到错误。 这是错误: flex --header-file=lex.h --outfile=lex.cc lex.ll
我是一名优秀的程序员,十分优秀!