2013-02-20 70 views
2

我想用一些關鍵字來擴展C++,例如「property」,以向類/對象(如Visual Studio在「managed」版本中擴展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做的,它分析一個C++源代碼並生成另一個C++源代碼,並將QT「東西」轉換爲裸C++。 當然,我需要擴展翻譯器(編寫代碼,以便理解如何處理「property關鍵字」)。 你知道我可以用來做我想做的「翻譯」嗎?

+3

#define – stark 2013-02-20 05:32:55

+0

Noop。我想在「屬性」旁邊添加其他關鍵字。另外,如何擴展,例如,只使用example1.size定義? – user2089799 2013-02-20 05:46:58

+0

C++是一種足夠強大的語言來解析(甚至只是標記),這將是相當困難的。這樣做是爲了實現一個'不好'作爲'財產'的想法,這完全是瘋狂的。如果你花時間在上面,我希望你想做的其他事情能夠比「財產」所希望的更能證明這項工作的合理性。 – 2013-02-20 06:17:54

回答

0

我想你應該看看boost::waveLLVM。前者更容易,更受限制,但也許是你需要的東西。

+0

我會研究2,謝謝。我看到[Youtube上的這個視頻 - 鏈接](http://youtu.be/yuIOGfcOH0k),關於使用clang/LLVM重構C++,我會和他們一起玩。謝謝。 – user2089799 2013-02-22 02:08:47

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 .*? ... 

你可以再附上行動settergetter重新寫的cpp_block進入一個方法。

難度始於重寫C++代碼。簡單的解析器將不知道example1.size是否可以訪問struct字段(不應該更改),屬性獲取或屬性集調用。 所以你需要知道example1的類型,而且如果你訪問一個左值或右值,因爲example1.size = 1必須翻譯爲example1.set_size(1),但int a = example1.size必須變成int a = example1.get_size()

所以,基本上,代碼翻譯你需要AST和符號表來查找變量的類型。 ANTLR有一個C++解析器(請參閱here),但我不確定它是否也會爲您生成符號表。

+0

我會研究它,謝謝。 – user2089799 2013-02-22 02:04:30