首頁  >  文章  >  後端開發  >  用C++對C++語法格式進行分析

用C++對C++語法格式進行分析

高洛峰
高洛峰原創
2016-11-21 11:50:301445瀏覽

前言

最近C++專案需要用到腳本,這就關係到如何綁定物件到腳本運行環境。因使用到多套腳本語言,所以現有的綁定技術,都無法滿足需求。所以只能尋求解析C++的頭文件,再根據描述進行綁定。起初發現boost有一套,但boost實在太臃腫了,對專案之後開發環境的搭建有一定要求。我力求最簡潔的專案管理,boost不太適合。自己寫套吧。

正文

C++的語法格式總結

除編譯器指令#開頭與函數外,均必須要求分號結尾

程式碼區塊除單一語句的if、do/while、for都必須在大括號/花括號“{}”

程式碼區塊有8種,命名空間,全局,類,結構,全局函數,成員函數,lambda,函數內無名代碼區塊

命名空間與全局相同,僅在聲明前加「命名空間::”前綴

類別聲明區塊與全域區塊的區別有,友元聲明,成員存取權限

模板支援類別與函數

函數與模板有參數列表

分號結尾的聲明可以是內​​建類型(int、double等)、類別、模板類別、typedef出來的類型、函數指標、lambda

函數可以重名

類別的成員函數存取其他成員可以在此函數定義之後聲明,並不像全域函數那樣必須已經聲明,所以用指標掃描C++檔案是否合法是做不到的

若是類化的枚舉(enum class),不需要對聲明所在範圍可見,否則同時要把成員也同時加入所屬範圍

我不打算支援的,對於需求沒有必要性的

命名空間

模板

函數體

逗號分割的多個變數我不想很好的支援

類型的校驗

逗號分割的多個變數我不想很好的支援

類型的校驗

逗號

union

枚舉不判斷名稱衝突

lambda

變數名稱不能以數字開始

類別的繼承

函數指標

開發的原則

函數指標

適於修改為跨平台

使用C++

iter只進不退

遇到語法錯誤或檔案結尾,拋異常

遇到{則進入區塊處理

處理;處理完;及之前的內容再返回

成員函數定義代碼不分析,因為第一條原則做不到,成員函數可能會引用還未聲明的其他成員函數

不為最好的性能,但可以在這個結構上優化到極致

不求完整解析,但在這個框架上可以做到解析全部c++11與更高的版本特性

無註釋,英文不好,中文註釋又不適合全球化

 

結構描述

variant,method,type,comment,enumeration,enumeration_value從object繼承,它們都可以屬於全局或類別或結構體。

document表示一個c++編譯單元。

context表示一個上下文,是一個可以往上找到的佇列。 document完成解析後儲存解析出來的變數、函數、型別。

reader,檔案讀取器,一個向前的char迭代器,可以用istreambuf_iterator(ifstream)取代。

 

使用

main函數有_DEBUG宏保護,建議編譯為函式庫release使用。

#include

try

{

 auto result = cpp_analysis::analysis("[cpp_header_file]");

/ / todo:

}


專案位置

https://github.com/FettLuo/cpp_analysis[新標籤開啟]

 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn