C++ 类不在bison中命名类型

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

这是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);
    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++入门教材。