В настоящее время я работаю над проектом компилятора с игрушечным языком 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;
}