Наследование классов, проблемы ENUM с реализациями классов AST - PullRequest
0 голосов
/ 13 октября 2018

В настоящее время я работаю над проектом компилятора с игрушечным языком Micro, реализованным с использованием Bison с C ++.Я создал несколько классов для построения AST для оценки выражений и пытался реализовать это с наследованием.У меня есть родительский класс ASTNode, который я хотел бы определить дочерние классы, такие как AddExprNode, показанный ниже.

У меня конкретно возникают проблемы с использованием enum (ASTNodeType) из моего ASTNode.hpp в моем дочернем классе, иЯ получаю вопрос относительно имени класса.Я пытался исследовать это самостоятельно, но у меня было много проблем.

Почему g ++ не может найти имя класса и почему он не знает, что ASTNodeType был объявлен?Вот ошибки, которые я получаю, а затем мой код.

Ошибки:

In file included from src/AddExprNode.cpp:3:
src/AddExprNode.hpp:13: error: expected class-name before ‘{’ token
src/AddExprNode.hpp:18: error: ‘ASTNodeType’ has not been declared
src/AddExprNode.cpp:8: error: ‘ASTNodeType’ has not been declared
src/AddExprNode.cpp: In constructor ‘AddExprNode::AddExprNode(std::string,     int)’:
src/AddExprNode.cpp:8: error: ‘ASTNode’ has not been declared
src/AddExprNode.cpp:8: error: expected ‘{’ before ‘ASTNode’
src/AddExprNode.cpp: At global scope:
src/AddExprNode.cpp:8: error: expected constructor, destructor, or type conversion before ‘(’ token

ASTNode.hpp:

#include <string>

enum class ASTNodeType
{
    UNDEFINED,
    ADD_EXPR,
    MULT_EXPR,
    VAR_REF
};

class ASTNode
{
    public:
        ASTNodeType Type;
        ASTNode * Left;
        ASTNode * Right;

        ASTNode();
        ASTNode(ASTNodeType type);

        void setType(ASTNodeType Type);
        void setLeftChild(ASTNode * Left);
        void setRightChild(ASTNode * Right);

    private:

};

ASTNode.cpp:

#ifndef AST_H
#define AST_H
#include "ASTNode.hpp"
#endif

ASTNode::ASTNode(ASTNodeType type)
{
    Type = type;
    Left = NULL;
    Right = NULL;
}

ASTNode::ASTNode()
{
    Type = ASTNodeType::UNDEFINED;
    Left = NULL;
    Right = NULL;
}

void ASTNode::setType(ASTNodeType Type)
{
    Type = Type;
}

void ASTNode::setLeftChild(ASTNode * Left)
{
    Left = Left;
}

void ASTNode::setRightChild(ASTNode * Right)
{
    Right = Right;
}

AddExprNode.hpp:

#ifndef AST_H
#define AST_H
#include "ASTNode.hpp"
#endif

#include <string>

class AddExprNode : public ASTNode
{
    public:
        std::string add_op;

        //AddExprNode() : ASTNode(){};
        AddExprNode(std::string inputOp, ASTNodeType type);

        std::string getOp();
};

AddExprNode.cpp:

#ifndef AST_H
#define AST_H
#include "AddExprNode.hpp"
#endif

#include <string>

AddExprNode::AddExprNode(std::string inputOp, ASTNodeType type) : ASTNode::ASTNode(type){
    add_op = inputOp;
    //Type = type;
}

std::string AddExprNode::AddExprNode::getOp(){
    return add_op;
}

1 Ответ

0 голосов
/ 13 октября 2018

Вы не используете правильно включенные охранники.Определение для защиты принадлежит файлу .h, а не файлу, который его включает.

AddExprNode.cpp определяет символ AST_H.AddExprNode.hpp видит, что символ уже определен, поэтому он не включает ASTNode.hpp.Это приводит к тому, что ASTNodeType не будет определено при его использовании.

...