C++ 类不在bison中命名类型
这是parser.ypp文件的开头C++ 类不在bison中命名类型,c++,bison,C++,Bison,这是parser.ypp文件的开头 %{ #include <iostream> #include "hw3_output.hpp" using namespace std; using namespace output; extern int yylineno; extern int yylex(); int yyparse(); void output::errorSyn(int lineno); vo
%{
#include <iostream>
#include "hw3_output.hpp"
using namespace std;
using namespace output;
extern int yylineno;
extern int yylex();
int yyparse();
void output::errorSyn(int lineno);
void yyerror(char const* s);
output::TableStack* SymboleTableStack = new output::TableStack();
SymboleTableStack->makeTable();
output::offsetStack* st = new output::offsetStack();
st->push(0);
%}
%{
#包括
#包括“hw3_输出.hpp”
使用名称空间std;
使用名称空间输出;
外部内部yylineno;
extern int yylex();
int-yyparse();
无效输出::errorSyn(int-lineno);
无效错误(字符常量*s);
output::TableStack*SymboleTableStack=新输出::TableStack();
SymboleTableStack->makeTable();
output::offsetStack*st=新输出::offsetStack();
st->push(0);
%}
这是我的hw3_output.hpp文件。我只展示了重要的部分:
namespace output{
class SymbolTable {
vector<std::shared_ptr<SymbolNode>> Symbols;
public:
SymbolTable() : Symbols() {}
void AddSymbolToTable(std::shared_ptr<SymbolNode> symbolNode) {
Symbols.push_back(symbolNode);
}
....
class TableStack {
public:
vector<SymbolTable*> stack;
TableStack() :stack() {}
SymbolTable* topTable()
{
return *(stack.begin() + stack.size() - 1);
}
class offsetStack
{
public:
vector<int> stack;
offsetStack() :stack() {}
};
}
I keep getting the following error (and the same for the offsetStack)
名称空间输出{
类可符号化{
矢量符号;
公众:
SymbolTable():Symbols(){}
void AddSymbolToTable(std::shared_ptr symbolNode){
符号。推回(symbolNode);
}
....
类表堆栈{
公众:
矢量叠加;
TableStack():stack(){}
SymbolTable*topTable()
{
返回*(stack.begin()+stack.size()-1);
}
类偏移堆栈
{
公众:
矢量叠加;
偏移堆栈():堆栈(){}
};
}
我不断得到以下错误(offsetStack也是如此)
< p>粘贴的代码位于生成文件的顶层(例如,可以使用<代码>包含< /COD>指令)。请记住,C++程序的顶层只能包含声明和定义,而不是可执行语句。
SymboleTableStack->makeTable();
及
是可执行语句
您需要在某些函数或构造函数中进行初始化。粘贴的代码位于生成文件的顶层(例如,这使得可以使用
#include
指令)请记住,C++程序的顶层只能包含声明和定义,而不能包含可执行语句。
SymboleTableStack->makeTable();
及
是可执行语句
您需要在某些函数或构造函数中进行初始化。您正在声明
symboletastack
为指向TableStack
类型的指针,该类型不存在于您的output
命名空间中。您的意思是将symboletastack
声明为output::SymbolTable*
还是output::offsetStack*
相反?不,实际上,我有另一个上面没有包含的结构。我将进行编辑。@remylebeau您将symboletastack
声明为指向output
命名空间中不存在的类型tabletastack
的指针。您是想将symboletastack
声明为output::Symbol>吗表*<代码> >还是代码>输出:OffStSt**/C++ >实际上,我有另外一个结构,我没有上面提到。我将编辑。@ ReMyLeBuAuNi我调用顶层部分的函数。@ yasmin 12.不。这与BiSun无关。它是C++的工作方式。C++程序由声明和定义组成,没有别的。C++实际上至少允许你在构造函数中放置初始化代码,这样你就可以通过构造一个对象来实现它。尽管也有很多人不认为这是好的风格的原因。希望你有一个好的C++入门教材。我可以调用函数吗?顶层部分?@ yasmin 12.不,这与Bixon无关。它是C++的工作方式。C++程序由声明和定义组成,没有别的。你想做的任何事情都需要在函数或方法中。C++至少允许你在构造函数中放置初始化代码,这样你就可以通过构造函数来实现它。尽管有很多人认为这不是好的风格,但希望你有一本好的C++入门教材。