野牛如何在解析树中返回指针

时间:2020-01-21 13:24:42

标签: c++ parsing abstract-syntax-tree bison parse-tree

我正在尝试使用Bison创建AST。找到标识符后,我遇到了让野牛返回节点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 :(得分:0)

感谢帮助人员

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

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