2013-02-20 3 views
2

Я хочу расширить C++ некоторыми ключевыми словами, например, «свойство», чтобы добавить свойства к классу/объекту (например, Visual Studio расширяет C++ в «управляемой» версии). Пример кода:Расширение C++ с новым ключевым словом

class Example { 
    public: 
     [...] 
     property int size { 
      get: { 
        return __size; 
        } 
      set: { 
        if(value > 0) 
         __size = value; 
        else 
         throw new Exception("Invalid Size"); 
        } 
     }; 
}; 

Использование:

[...] 
    int totalSize = example1.size + example2.size + example3.size; 
    example1.size = 2 * example1.size; 

То, что я хочу, чтобы использовать форму переводчика для перевода на C++ «расширенный» исходный код для «нормального» исходного кода, как QT MOC do, он анализирует исходный код C++ и генерирует другой исходный код C++, а QT «вещи» переведены на голый C++. Конечно, мне нужно будет расширить переводчик (напишите код, чтобы он мог понять, что делать с «ключевым словом свойства»). Знаете ли вы о «переводчике», который я могу использовать, чтобы делать то, что хочу?

+3

Как насчет #define – stark

+0

Noop. Я хочу добавить другие ключевые слова рядом с «свойством». Кроме того, как расширить, например, пример1.size использует только определяет? – user2089799

+0

C++ - достаточно сложный язык для синтаксического анализа (или даже просто tokenize), что это будет довольно сложно. Выполнение этой идеи как «плохой» как «свойство» было бы совершенно безумным. Если вы потратите время на это, я надеюсь, что другие вещи, которые вы хотите, больше подходят для оправдания работы, чем «свойство». –

ответ

0

Я думаю, вы должны взглянуть на boost::wave и LLVM. Бывший намного легче и гораздо более ограничен, но, возможно, это то, что вам нужно.

+0

Я изучу 2, спасибо. Я видел [это видео в Youtube - link] (http://youtu.be/yuIOGfcOH0k), об использовании clang/LLVM для рефакторинга C++, я буду играть с ними. Благодарю. – user2089799

2

Обработка заголовка может быть выполнена просто с использованием pyparsing. Это Python-lib, который является мощным, но простым решением. Я сам использую его на работе для синтаксического анализа файла описания C и создания из него действительного C-кода. Например, вы можете просто скопировать свой файл заголовка, но переписать определение свойства, например. используя что-то вроде этого:

property := Literal('property') id id Literal('{') [getter] [setter] 
      Literal('}') Literal(';') 
getter := Literal('get:') Literal('{') cpp_block Literal('}') 
setter := Literal('set:') Literal('{') cpp_block Literal('}') 
id  := Word(alphas + '_', alphanums + '_') 
cpp_block := ... don't know probably just match everything a la .*? ... 

Затем можно прикрепить к действиям setter и getter, чтобы переписать cpp_block в метод.

Сложность начинается с перезаписи кода на C++. Простой парсер не будет знать, является ли example1.size доступ к полю struct (который не должен быть изменен), вызов свойства-get или набор свойств. Значит, вам нужно знать тип example1, но также если вы получаете доступ к значению lvalue или rvalue, потому что example1.size = 1 необходимо перевести на example1.set_size(1), но int a = example1.size должен стать int a = example1.get_size().

Так что для перевода кода вам необходим AST и таблица символов для поиска типа переменной. ANTLR имеет синтаксический анализатор C++ (см. here), но я не уверен, что он также генерирует для вас таблицу символов.

+0

Я изучу его, спасибо. – user2089799

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