程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 用C++對C++語法格式進行分析,語法

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

編輯:C++入門知識

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


前言

最近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[新標簽打開]

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved