Зубр как вернуть указатель в дерево разбора - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь создать AST с Bison. У меня возникают проблемы с получением Bison для возврата указателя узла var - после того, как идентификатор найден.

Вот ошибка:

Error   C2664   'VarDel::VarDel(VarDel &&)': cannot convert argument 1 from 'Var' to 'Node *'

Вот фрагмент из файла Bison:

%union {
    Node *node;
    Block *block;
    //NExpression *expr;
    //NStatement *stmt;
    Statement *stmt;
    Num *num;
    Var *ident;
    VarDel *var_decl;
    std::string *string;
    int token;
}


%token <string> TIDENTIFIER TINTEGER TDOUBLE
%token <token> TCEQ TCNE TCLT TCLE TCGT TCGE TEQUAL
%token <token> TLPAREN TRPAREN TLBRACE TRBRACE TCOMMA TDOT
%token <token> TPLUS TMINUS TMUL TDIV


%type <ident> ident
%type <num> numeric num 
%type <block> program block stmts
%type <node> stmt var_decl
%type <token> comparison

...

var_decl : ident ident { $$ = new VarDel(*$1, *$2); }
         ;

ident : TIDENTIFIER { $$ = new Var($1->c_str()); delete $1; }
      ;

И вот классы задействованных узлов:


class VarDel : public Node {
public:
    Node* typenode;
    Node* varnode;
    Node* assignNode;

    VarDel(Node* ctypenode, Node* cvarnode) {
        Node::nodeType = NODETYPE::VARDEL;
        typenode = ctypenode;
        varnode = cvarnode;
    }
    VarDel(Node* ctypenode, Node* cvarnode, Node* cassignnode) {
        Node::nodeType = NODETYPE::VARDEL;
        typenode = ctypenode;
        varnode = cvarnode;
        assignNode = cassignnode;
    }
    std::string toString() {
        return "VarDel Node";
    }
};

class Var : public Node {
public:
    std::string identfier;
    Var();
    Var(std::string cidentfier) {
        Node::nodeType = NODETYPE::VAR;
        identfier = cidentfier;
    }
    std::string toString() {
        return "Var Node";
    }
};

Почему я получаю эту ошибку? Конечно, я создаю указатель из ident с ключевым словом new?

1 Ответ

0 голосов
/ 21 января 2020

Спасибо за помощь, ребята

var_decl : ident ident { $$ = new VarDel($1, $2); }
         ;                               ^   ^

ident : TIDENTIFIER { $$ = new Var($1->c_str()); delete $1; }
      ;
...