2012-12-02 47 views
1

我有一個ANTLR規則會返回一個向量:C++,ANTLR和載體

main returns [std::vector<int> v] 
     : 
     ('ERROR' t3=INT{v.push_back(atoi((const char*)$t3.text->chars));} 
     '='t4=INT{v.push_back(atoi((const char*)$t4.text->chars));} 
     ); 

然後我把它從C++,並得到矢量數據。

但是,我的問題是,ANTLR3自動將向量v初始化爲NULL,這是不允許的,並給我一個錯誤。

如果我生成antlr的C++輸出並嘗試使用我的項目進行編譯,它會給出錯誤。

我手動去的那ANTLR輸出和刪除設置爲NULL選項,再編譯,一切工作的parsedfile。

我都不可能看到解決這個問題:

1)初始化從ANTLR矢量自己(不知道如何從初始化我的矢量(不知道是否INITIALIZE向量)

2)防止ANTLR這是可以做到)

3)始終手動去更改初始化(不是好的做法)

4)找到另一種方式來回報向量,試圖返回一個指針數組,我得到以下錯誤:

error: conversion from ‘std::vector<int, std::allocator<int> >*’ to non-scalar type ‘std::vector<int, std::allocator<int> >’ requested 

任何幫助?

+0

如果我正確讀取規則,它看起來像是聲明一個向量,然後向向量添加數據。是否有任何理由不能使用矢量模板的填充構造函數來添加所需的數據?這將消除必須首先實例化v的問題,然後直接調用它。 http://www.cplusplus.com/reference/vector/vector/vector/ – cowboydan

+0

可以請您解釋更多... –

+0

我認爲如果您使用「@init」將t2和t3的數字表示添加到v,你應該很好。在ANTLR文檔中查看「@init」。 – cowboydan

回答

3

我想你想要做這樣的事情:

main returns [std::vector<int> *v] 
: 
@init { v = new std::vector<int>(); } 
(rule content, using *v in actions); 

ANTLR然後可以初始化你的返回值NULL,我認爲它總是這樣。 @init塊創建一個空向量供您使用。

當然,您會希望實際使用像shared_ptr這樣的智能指針以避免潛在的內存泄漏。

+0

這是真的......在之前工作,忘記更新我的問題! –

0

可以初始化向量是這樣的:

vector<int> a(2,3); //vector a contains 2 elements: 3 and 3 
a[0] = 4;//vector a contains 2 elements: 4 and 3 
vector<int> b; 
b = a; 

還有一些其他的方法,你可以點擊這裏:http://www.cplusplus.com/reference/vector/vector/vector/

編輯:

如果你想用零來初始化:

vector<int> a(2); 

應該做的工作,向量a將包含n 2個零。

+0

仍然這並沒有指定如何初始化它與零元素 –