В настоящее время я занимаюсь разработкой простого языка программирования для простого создания проектов C ++. Он позволяет вводить некоторый короткий C ++ -подобный код и автоматически генерирует файлы .h и .cpp.
Мне нужен какой-то способ сопоставить тип, например из стандартной библиотеки, в соответствующий заголовочный файл. Это позволяет просто использовать тип в моем языке и автоматически определять, какие заголовки включать в сгенерированный код.
Вот пример языка, который есть сейчас:
class Car {
std::string print()
members:
int i, j
std::array<Wheel, 4> wheels
}
При обработке этого кода я нахожу типы std::string
а также std::array
которые должны быть сопоставлены с их заголовочными файлами. Как я могу добиться этого сопоставления?
Может быть, база данных общедоступна? Конечно, я не хочу анализировать все заголовки самостоятельно (что, как я полагаю, заключается в том, как это делают IDE).
Помимо поддержки только стандартной библиотеки, конечно, было бы полезно иметь возможность поддерживать и другие библиотеки, но это только вторичная цель.
Ну, есть несколько отличных ссылок, которые вы можете использовать для создания своей собственной базы данных. Поскольку стандарты меняются медленно, вы можете создать карту для них, используя ссылки. Вот хороший C ++ ссылка
Трудно просто искать в заголовочных файлах, поскольку они обычно создаются с использованием внутренних битов, которые вы не хотите использовать в своем коде, и вы не можете различить их.
Если бы я строил это, я бы построил базовую карту, используя стандартную библиотечную ссылку, а не анализируя файлы заголовков; Например, в примере автомобиля выше, вы должны #include <string>
право?
Если вы должны были проанализировать файл заголовка <string>
для данного компилятора вы можете обнаружить, что он состоит только из внутренних битов, которые, в свою очередь, включают другие файлы;
В g ++ версии 4.6 <string>
выглядит так:
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
// 2005, 2006, 2007, 2009, 2010, 2011
// Free Software Foundation, Inc.
// GPL version 3.1 or later ... etc...
#ifndef _GLIBCXX_STRING
#define _GLIBCXX_STRING 1
#pragma GCC system_header
#include <bits/c++config.h>
#include <bits/stringfwd.h>
#include <bits/char_traits.h> // NB: In turn includes stl_algobase.h
#include <bits/allocator.h>
#include <bits/cpp_type_traits.h>
#include <bits/localefwd.h> // For operators >>, <<, and getline.
#include <bits/ostream_insert.h>
#include <bits/stl_iterator_base_types.h>
#include <bits/stl_iterator_base_funcs.h>
#include <bits/stl_iterator.h>
#include <bits/stl_function.h> // For less
#include <ext/numeric_traits.h>
#include <bits/stl_algobase.h>
#include <bits/range_access.h>
#include <bits/basic_string.h>
#include <bits/basic_string.tcc>
#endif /* _GLIBCXX_STRING */
Проблема сейчас становится очевидной. Например, это <string>
канонический для std::ios_base
?
Много думать, у меня могут быть другие мысли об этом позже.
Других решений пока нет …