1

我有一个 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 选项并再次编译,一切都解决了。

我可能会找到解决此问题的方法:

1)自己从ANTLR初始化向量(不知道如何初始化向量)

2)防止ANTLR初始化我的向量(不确定是否可以完成)

3)总是手动去改变初始化(不好的做法)

4)找到另一种返回向量的方法,尝试返回指向数组的指针我得到以下错误:

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

有什么帮助吗?

4

2 回答 2

3

我想你想做这样的事情:

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

然后 ANTLR 可以将您的返回值初始化为 NULL,我认为它总是这样做的。@init 块创建一个空向量供您使用。

当然,您还需要实际使用像 shared_ptr 这样的智能指针来避免潜在的内存泄漏。

于 2012-12-06T18:29:45.573 回答
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 将包含 2 个零。

于 2012-12-02T01:40:53.930 回答