2017-01-10 5 views
1

Я пытаюсь создать код для определенного языка, используя bison, flex и llvm. Вот часть коды (многоточие относится к коду, не связанному с вопросом) для объединения и секции правил:нет совпадений для 'operator * для экземпляров

%union { 
    Node *node; 
    NBlock *block; 
    NMethodCall* methodcall; 
    . 
    . 
    . 
    std::vector<NIdentifier*> idetListvec; 
    std::vector<NRecordItem*> recdListvec; 
    . 
    . 

} 
. 
. 
type   <expr>    numeric  
%type   <expr>    CondExpression 
%type   <idetListvec>  IdentifierList 
%type   <recdListvec>  RecordItemList VarDefnList FormalParmSecList VarDefns FormalParameterList 

. 
. 
%% 
. 
. 

FormalParameterList : TLPAREN FormalParmSecList TRPAREN {$$ = $2;} 
        ; 

FormalParmSecList : FormalParmSecList TSEMICOLON FormalParmSec { $1->push_back($3);} 
        | FormalParmSec         {$$ = new NRecordItemList(); $$->push_back($1);} 
        ; 


FormalParmSec : ValueParmSpec          {$$ = $1;} 
       | VariableParmSpec         {$$ = $1;} 
       ; 

%% 

я имел отдельный файл для так называемого Abstract Syntax Tree (AST) для реализация классов. Следующий класс я хочу спросить о:

#include <iostream> 
#include <vector> 
class NStatement; 
. 
classNRecordItem; 
classModule; 
. 
. 
typedef std::vector<NRecordItem*> NRecordItemList; 
typedef std::vector<NConstantDeclaration*> NConstantDeclarationList; 
typedef std::vector<NTypDefn> NTypDefnList; 
typedef std::vector<Module> NModuleList; 

class Node { 
public: 
    virtual ~Node() {} 
    //virtual llvm::Value* codeGen(CodeGenContext& context) { return NULL; } 
}; 


class NExpression : public Node { 
}; 

class NStatement : public Node { 
}; 

class NInteger : public NExpression { 
public: 
    int value; 
    NInteger(int value) : value(value) { } 
    //virtual llvm::Value* codeGen(CodeGenContext& context); 
}; 
. 
. 
class NRecordItem : public NStatement { 
public: 
    const NIdentifier& type; 
    NIdentifierList arguments; 
    NRecordItem(NIdentifierList& arguments, const NIdentifier& type) : 
     type(type), arguments(arguments) { } 
    //virtual llvm::Value* codeGen(CodeGenContext& context); 
}; 

при выполнении кода, он дает мне следующую ошибку:

parser.y:256:26: error: no match for ‘operator=’ (operand types are ‘std::vector<NRecordItem*>’ and ‘NRecordItemList* {aka int*}’) 
        | FormalParmSec   {$$ = new NRecordI 
         ^
In file included from /usr/include/c++/5/vector:69:0, 
       from node.h:2, 
       from parser.y:2: 
/usr/include/c++/5/bits/vector.tcc:167:5: note: candidate: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = NRecordItem*; _Alloc = std::allocator<NRecordItem*>] 
    vector<_Tp, _Alloc>:: 
    ^
/usr/include/c++/5/bits/vector.tcc:167:5: note: no known conversion for argument 1 from ‘NRecordItemList* {aka int*}’ to ‘const std::vector<NRecordItem*>&’ 
In file included from /usr/include/c++/5/vector:64:0, 
       from node.h:2, 
       from parser.y:2: 
/usr/include/c++/5/bits/stl_vector.h:448:7: note: candidate: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(std::vector<_Tp, _Alloc>&&) [with _Tp = NRecordItem*; _Alloc = std::allocator<NRecordItem*>] 
     operator=(vector&& __x) noexcept(_Alloc_traits::_S_not 
    ^
/usr/include/c++/5/bits/stl_vector.h:448:7: note: no known conversion for argument 1 from ‘NRecordItemList* {aka int*}’ to ‘std::vector<NRecordItem*>&&’ 
/usr/include/c++/5/bits/stl_vector.h:470:7: note: candidate: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(std::initializer_list<_Tp>) [with _Tp = NRecordItem*; _Alloc = std::allocator<NRecordItem*>] 
     operator=(initializer_list<value_type> __l) 
    ^

Мой вопрос о правиле «FormalParmSecList». Я сохранил значение параметров в векторном классе, но он дает эту ошибку. любая идея!

ответ

0

Вы пытаетесь присвоить std::vector указатель на std::vector (aka std::vector*).

Снимите new от линии ошибки, чтобы получить {$$ = NRecordItemList(); $$->push_back($1)}

+1

Это не сработает, так как '$$' скорее всего содержит случайный мусор, а не действительный построенный 'std :: vector'. Вам нужно что-то вроде 'new (& $$) NRecordItemList();', bvut, который по-прежнему не обрабатывает уничтожение должным образом. –

1
$$ = new NRecordItemList(); 

Этот оператор создает указатель на NRecordItemList объекта и присваивает его $$. Однако где-то вы заявили, что $$ - это NRecordItemList, а не указатель на один. Вам либо нужно удалить new из этого оператора, либо изменить объявление типа для этого правила грамматики, чтобы $$ имел правильный тип. Я не вижу, где вы указали тип этого правила в коде, который вы разместили здесь. Вам нужно найти это и исправить. (Это также было время, так как я использовал зубр.)

+0

$$ относится к FormalParmSecList, который имеет тип std :: vector . Определяется:% тип \t \t \t \t FormalParmSecList. где 'recdListvec' объявлен в секции% union, например: std :: vector recdListvec; , это указатель правильно? –

+0

@rationalrose: 'std :: vector ' - вектор указателей на элементы. 'std :: vector *' - указатель на вектор элементов. 'std :: vector *' - указатель на вектор указателей на элементы. Поскольку 'std :: vector' не может быть членом союза, вы хотите либо второй, либо третий, возможно второй. – rici

+0

@RationalRose 'std :: vector ' - вектор указателей, но сам по себе не является указателем. Вам, вероятно, понадобится 'std :: vector *' или эквивалентно 'NRecordItemList *'. –

2

Вы пытаетесь поставить std::vector объектов непосредственно в вашем %union. Это не сработает, поскольку они не собираются строить и разрушать должным образом. Вы должны изменить %union использовать указатели:

%union { 
    : 
    std::vector<NIdentifier*> *idetListvec; 
    std::vector<NRecordItem*> *recdListvec; 

Вы уже пытаетесь сохранить указатели на векторы в своих действиях, так это выглядит, как вы пытаетесь сделать это уже, вы просто пропустили объявление.

+0

Я выложу весь мой код .. Из-за этого есть много подобных ошибок ..Я не знаю, как решить проблему. –

+0

Вы правы, но у меня нет достаточной репутации. Спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^