C++,ANTLR and VECTORS

C++,ANTLR and VECTORS

本文关键字:VECTORS and ANTLR C++      更新时间:2023-10-16

我有一个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

有什么帮助吗?

我想你想做这样的事情:

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

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

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

您可以通过以下方式初始化向量:

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 个零。