C ++, ANTLR и ВЕКТОРЫ

У меня есть правило 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, что не разрешено и выдает ошибку.

Если я сгенерирую вывод C ++ antlr и попытаюсь скомпилировать с моим проектом, это выдаст ошибку.

Я вручную перешел к анализируемому файлу, который выводит 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

Любая помощь?

1

Решение

Я думаю, что вы хотите сделать что-то вроде этого:

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

Затем ANTLR может инициализировать возвращаемое значение в NULL, что, я думаю, всегда происходит. Блок @init создает пустой вектор для использования.

Конечно, вы захотите использовать умный указатель, такой как shared_ptr, чтобы избежать возможных утечек памяти.

3

Другие решения

Вы можете инициализировать векторы следующим образом:

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);

должен сделать работу, вектор будет содержать 2 нуля.

0

По вопросам рекламы [email protected]