2013-05-18 3 views
2

В настоящее время я разрабатываю простой язык программирования для легкого создания проектов на C++. Он позволяет вводить короткий код на языке C++ и автоматически генерировать файлы .h и .cpp.C++ сопоставление типа с его заголовочным файлом

Мне нужно как-то до map a type, например. из стандартной библиотеки в соответствующий заголовочный файл. Это позволяет просто использовать тип на моем языке и автоматически выводить, какие заголовки включать в сгенерированный код.

Вот пример языка, как это прямо сейчас:

class Car { 
    std::string print() 

    members: 
     int i, j 
     std::array<Wheel, 4> wheels 
} 

При обработке этого кода я найти типы std::string и std::array, которые должны быть отображены в их заголовочных файлах. Как достичь этого соответствия?

Возможно, база данных общедоступна? Я не хочу, конечно, самостоятельно анализировать все заголовки (что я предполагаю, как это делают IDE).

Помимо поддержки стандартной библиотеки, конечно, было бы полезно иметь возможность поддерживать и другие библиотеки, но это только вторичная цель.

+1

Для стандартной библиотеки вы можете просто запрограммировать его. Для произвольных заголовков вы можете использовать парсер C++ (например, Clang's front end) для анализа заголовков. Если вы разрабатываете проект как амбициозный, как вы говорите, использование стороннего анализатора C++ не должно быть проблематичным. – Angew

+0

Что вы подразумеваете под жестким кодированием? STL включает тысячи типов, как я должен это делать (а не вручную)? Мне нравится ваше второе предложение! Вы когда-нибудь делали что-то подобное и могли указать мне на что-то, что помогло бы мне использовать парсер Clang в моем проекте? – user1286875

+0

Создайте какой-то файл сопоставления или что-то в этом роде. Он будет требовать обновления только каждые 3 или около того лет, когда стандарт изменится. Разумеется, вы также можете использовать синтаксический анализатор для стандартных заголовков. – Angew

ответ

1

Ну, есть несколько отличных ссылок, которые вы можете использовать для создания собственной базы данных. По мере медленного изменения стандартов вы можете создать карту для них, используя ссылки. Вот хороший c++ reference

Трудно просто искать в заголовках файлы, поскольку они обычно создаются с использованием двоичных битов, которые вы не хотите использовать в своем коде, и вы не можете различать их.

Если бы я должен был построить это, я бы построил базовую карту, используя стандартную ссылку на библиотеку, а не синтаксический анализ файлов заголовков; Например, в приведенном выше примере автомобиля вы должны #include <string> правильно?

Если вы должны разобрать файл заголовка <string> для данного компилятора, вы можете обнаружить, что он состоит только из внутренних битов, которые в свою очередь включают другие файлы;

В г ++ версии 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? Много думать, у меня могут быть другие мысли по этому поводу позже.

+0

Это очень хорошая идея, ваш вопрос очень важен. Следующий вопрос, который возникает, - это: Как вы собираетесь строить карту с веб-сайта? Я не веб-разработчик и понятия не имею, как преобразовать информацию и поместить ее в мою собственную базу данных? – user1286875

+0

@ user1286875 хорошо, если вы достаточно квалифицированы, чтобы написать парсер, тогда это не сложный вопрос, на который нужно ответить; загрузите ref из источника и проанализируйте его с помощью perl; или если вы новичок; Я бы предложил начать с подмножества языка, создать базу данных вручную, всего около 100 базовых объектов, а затем построить ее по мере продвижения; –

+0

Еще раз спасибо за ваш ответ, мне удалось создать базу данных после 'wget'ing refrence, глядя на html-файлы и написав небольшую функцию python, чтобы пройти через дерево файлов и извлечь все типы и соответствующие заголовки. – user1286875

Смежные вопросы