Я пишу переводчик на с ++ в качестве курсовой работы в универе.
По сути, я сам перевожу этот интерпретатор Python на c ++ с помощью Google.
с использованием посетителя для переводчика У меня есть 2 класса
BinOp : public AST
Number : public AST
В моем классе переводчиков есть 2 метода
class Interpreter : public NodeVisitor
int visitBinOp(BinOp* node)
{
//example if the operation is +
//return this->visit(node->left) + this->visit(node->right)
}
int visitNumber(Number* node)
{
//returns the int value that's in the node.
//return node->value;
}
и 1 метод в NodeVisitor, который интерпретатор наследует
class NodeVisitor
int visit(AST* node)
{
//if node is BinOp properFunction is pointer to visitBinOp
//if node is Number properFunction is pointer tp visitNumber
//return properFunction(node)
}
Вопрос 1 : Какой лучший способ проверить, является ли AST BinOp или номером
if(typeid(node) == typeid(BinOp*)
или
через некоторое приведение (при попытке dynamic_cast я получаю ошибку, что классы не полиморфны).
Основная проблема : Мне нужно как-то создать указатель на эти функции, но я не знаю, как это сделать.
РЕДАКТИРОВАТЬ 1
Добавил этот код в NodeVisitor, но из-за него, включая «Interpreter.h»
и переводчик, включая "NodeVisitor.h", я получаю
ошибка C2504: «NodeVisitor»: базовый класс не определен.
unsigned long int NodeVisitor::visit(AST* node)
{
std::function<unsigned long int(Number* node)> visitNumber = std::bind(&Interpreter::VisitNumber);
std::function<unsigned long int(BinaryOperation* node)> visitBinOp = std::bind(&Interpreter::VisitBinOp);
if (typeid(node) == typeid(Number*))
{
visitNumber((Number*)node);
}
if (typeid(node) == typeid(BinaryOperation*))
{
visitBinOp((BinaryOperation*)node);
}
}
Я думаю, что мне нужно добавить extern "C", чтобы посещать функции BinOp и visitNumber и использовать
этот подход, упомянутый в здесь
void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY);
FunctionType *fptr = (FunctionType *)dlsym(handle, "visitBinOp/visitNumber");
fptr();
Но я не совсем уверен, как это работает.