前言
最近C++項目需要用到指令碼,這就關係到如何綁定對象到指令碼運行環境。因使用到多套指令碼語言,所以現有的綁定技術,都不能滿足需求。所以只能尋求解析C++的標頭檔,再根據描述進行綁定。起初發現boost有一套,但boost實在太臃腫了,對項目之後開發環境的搭建有一定要求。我力求最簡明的專案管理,boost不太適合。自己寫套吧。
本文
C++的文法格式總結
除編譯器指令#開頭與函數外,均必須要求分號結尾
代碼塊除單條語句的if、do/while、for都必須在大括弧/花括弧“{}”
代碼塊有8種,命名空間,全域,類,結構,全域函數,成員函數,lambda,函數內無名代碼塊
命名空間與全域相同,僅在聲明前加“命名空間::”首碼
類聲明塊與全域塊的區別有,友元聲明,成員存取權限
模板支援類與函數
函數與模板有參數列表
分號結尾的聲明可以是內建類型(int、double等)、類、模板類、typedef出來的類型、函數指標、lambda
函數可以重名
類的成員函數訪問其他成員可以在此函數定義之後聲明,並不像全域函數那樣必須已經聲明,所以用指標掃描一次C++檔案是否合法是做不到的
若是類化的枚舉(enum class),不需要對聲明所在範圍可見,否則同時要把成員也同時添加到所屬範圍
我不打算支援的,對於需求沒有必要性的
命名空間
模板
函數體
逗號分割的多個變數我不想很好的支援
類型的校正
預設參數
union
枚舉不判斷名稱衝突
lambda
變數名不能以數字開始
類的繼承
函數指標
開發的原則
暫不跨平台,僅VS,不使用系統API這樣適於修改為跨平台
使用C++
iter只進不退
遇到語法錯誤或檔案結尾,拋異常
遇到{則進入塊處理
處理;結尾的語言單元,函數必須自己處理完;及之前的內容再返回
成員函數定義代碼不分析,因為第一條原則做不到,成員函數可能會引用還未聲明的其他成員函數
不為最好的效能,但可以在這個結構上最佳化到極致
不求完整解析,但在這個架構上可以做到解析全部c++11與更高的版本特性
無注釋,英文不好,中文注釋又不適合全球化
結構描述
variant,method,type,comment,enumeration,enumeration_value從object繼承,它們都可以屬於全域或類或結構體。
document表示一個c++編譯單元。
context表示一個上下文,是一個可以向上尋找的隊列。document完成解析後儲存解析出來的變數、函數、類型。
reader,檔案讀取器,一個向前的char迭代器,可以用istreambuf_iterator<char>(ifstream)替代。
使用
main函數有_DEBUG宏保護,建議編譯為庫release使用。
#include <cpp_analysis.h>
try
{
auto result = cpp_analysis::analysis("[cpp_header_file]");
// todo
}
catch (logic_error& e)
{
// todo:
}
項目位置
https://github.com/FettLuo/cpp_analysis[新標籤開啟]