2010-11-06 5 views
3

Эй, ребята, друг и я обсуждали мнимые и настоящие языки, и вопрос, который возник, был, если бы один из нас хотел создать заголовки для другого языка (возможно, D which already has a tool), что было бы простым и очень хорошим способом сделать это ?Простой способ получить прототипы функций?

Один из нас сказал, что сканирует файлы C и заголовки и игнорирует тела функций и только подсчитывает фигурные скобки внутри, чтобы выяснить, когда функция закончена. Счётчик этого был typedefs, определяет (который фигурирует, но определяет, рассматривается как тривиальная проблема) и шаблоны + специализация.

Другим решением было чтение двоичных файлов, а не фактическое exe, но объектные файлы, используемые компоновщиком. Примером тому был формат и сложность. Никто из нас ничего не знал о каком-либо объектном формате, поэтому мы не могли оценить (мы думали о gcc и VS C++).

Что вы, ребята, думаете? что проще? это должно быть подкреплено разумной логикой и фактом.

Если кто-то может ссылаться на полезный проект, то он будет разбирать файлы/заголовки C и выводит его или тот, который читает в данных эльфа и отображает информацию в примерном проекте. Я попробовал поиск по Google, но я не знал, как это будет вызвано. Я нашел libelf, но в этот момент я не смог его скомпилировать. я скоро смогу.

+0

@George Edison: Мне кажется, что ты говоришь, что я немного веселюсь с тегом для компилятора;) –

ответ

6

Вы можете использовать библиотеки clang, чтобы проанализировать исходный код C/C++ и извлечь любую информацию, которая вам нужна в определенных прототипах функций.

Из-за library-based architecture вы можете легко использовать части clang, которые вам нужны. В вашем случае это интерфейсные библиотеки (liblex, libparse, libsema). Я думаю, что это более приемлемый подход, а затем использование рукописного сканера с учетом тех трудностей, которые вы упомянули (typedefs, определяет и т. Д.).

clang также может быть использован в качестве инструмента для разбора исходного кода и вывода AST в виде XML, например, если у вас есть файл test.cpp:

void foo() {} 

int main() 
{ 
    foo(); 
} 

и вызывать clang++ -Xclang -ast-print-xml -fsyntax-only test.cpp вы получите файл test.xml аналогичным приведенные ниже (здесь неуместные части пропущены для краткости):

<?xml version="1.0"?> 
<CLANG_XML> 
    <TranslationUnit> 
    <Function id="_1D" file="f2" line="1" col="6" context="_2" 
       name="foo" type="_12" function_type="_1E" num_args="0"> 
    </Function> 
    <Function id="_1F" file="f2" line="3" col="5" context="_2" 
       name="main" type="_21" function_type="_22" num_args="0"> 
    </Function> 
    </TranslationUnit> 
    <ReferenceSection> 
    <Types> 
     <FunctionType result_type="_12" id="_1E"/> 
     <FundamentalType kind="int" id="_21"/> 
     <FundamentalType kind="void" id="_12"/> 
     <FunctionType result_type="_21" id="_22"/> 
     <PointerType type="_12" id="_10"/> 
    </Types> 
    <Files> 
     <File id="f2" name="test.cpp"/> 
    </Files> 
    </ReferenceSection> 
</CLANG_XML> 

Я не думаю, что извлечение этой информации из бинарных файлов можно по крайней мере, для символов с C связи, BECA они не имеют названия.

+0

Спасибо большое! это очень полезно! Я провел последние 30 минут, изучая вещи, и это удаляет их всех из воды. Я не хотел получать информацию от эльфа, но из объектного файла, который я упоминаю только как эльфа, потому что он выглядел так, будто он мог иметь эту информацию в таблице символов, но я не знал об этом много (один из них сказал имя и не упоминал, если это было управляемо или нет). –

+0

Знаете ли вы, есть ли способ загрузки данных на C++ или .NET? Я думаю, что я могу создать класс с использованием C# и загрузить данные через via с сериализацией XML и сделать свою грязную работу там. –

+0

@ acidzombie24: Добро пожаловать. Если вы пишете на C++, я бы использовал библиотеки clang напрямую, потому что clang находится на C++, а API - чистый и относительно простой в использовании. Если вы планируете использовать XML-загрузку C#, определенно проще. – vitaut

1

Что вы говорите, это compiling: Акт преобразования кода на одном официальном языке в другой. За этим стоит хорошая научная наука, которая, если внимательно следить, гарантирует, что ваша программа остановится с правильным аналоговым кодом.

Конечно, вы не хотите анализировать весь язык C++ (ура для этого!), Поэтому вам просто нужно определить соответствующую грамматику и определить все остальное как приемлемый шум или комментарии.

Не используйте регулярные выражения. Это не будет сделано, потому что C++ не является обычным языком.

1

Один из способов сделать это - определить свои интерфейсы в абстрактном языке (IDL) и сформировать заголовки для всех интересующих вас языков. Вы можете ограничить область своего IDL теми возможностями, которые возможны на каждом целевом языке.

Windows использует этот подход на своем языке MIDL, например. Выход

+0

Я немного смущен. Я использую IDL для генерации заголовков C? Хотя полезно, я хочу, чтобы это было наоборот. –

2

Ctags' довольно легко читать/разобрать

2

, если вы хотите, чтобы просто произвести привязку, попробуйте SWIG

1

Doxygen может помочь с этим. Это продвинутая тема и несколько документирована.