ホームページ  >  記事  >  バックエンド開発  >  C++ を使用して C++ 構文形式を分析する

C++ を使用して C++ 構文形式を分析する

高洛峰
高洛峰オリジナル
2016-11-21 11:50:301492ブラウズ

はじめに

最近、C++ プロジェクトではスクリプトを使用する必要があります。これは、オブジェクトをスクリプト実行環境にバインドする方法に関連しています。複数のスクリプト言語が使用されるため、既存のバインド技術ではニーズを満たすことができません。したがって、C++ ヘッダー ファイルを解析し、記述に従ってバインドすることのみを求めることができます。最初に、boost にはセットがあることがわかりましたが、boost はあまりにも肥大化しているため、プロジェクト後の開発環境の構築に一定の要件があります。私は最もシンプルなプロジェクト管理を目指しているため、ブーストは適していません。独自のセットを作成します。

テキスト

C++の構文形式の概要

#で始まるコンパイラ指令と関数を除き、すべてセミコロンで終わる必要があります

if、do/while、forを除き、コードブロックは中かっこ/花で囲まれている必要があります単一のステートメントで括弧 "{}"

コード ブロックには、名前空間、グローバル、クラス、構造体、グローバル関数、メンバー関数、ラムダ、関数内の名前のないコード ブロックの 8 種類があります

名前空間は、グローバル、宣言の前に「名前」を追加するだけです スペース::」プレフィックス

クラス宣言ブロックとグローバルブロックの違いはフレンド宣言、メンバーアクセス権です

テンプレートはクラスと関数をサポートします

関数とテンプレートにはパラメータリストがあります

セミコロンで終わる宣言は、組み込み型 (int、double など)、クラス、テンプレート クラス、typedef 型、関数ポインター、ラムダ

関数は同じ名前を持つことができます

クラスのメンバー関数アクセス 他のメンバーは、グローバル関数とは異なり、関数が定義された後に宣言できます。宣言されている必要があるため、C++ ファイルがクラス化された列挙 (enum クラス) であるかどうかをスキャンするためにポインターを使用することはできません。宣言されているスコープに可視である必要はありません。そうでない場合は、メンバーを同時にスコープに追加する必要があります。

要件には必要ありません。

テンプレート

関数本体

カンマで区切られた複数の変数をサポートしたくない

型検証

デフォルトパラメータ

union

列挙型は名前の競合を判断しない

lambda

変数名を開始できません。数字付き

クラスの継承

関数ポインタ

開発の原則

まだクロスプラットフォームではなく、VSのみで、このようにシステムAPIは使用されていません クロスプラットフォームへの変更に適しています

C++の使用

iterのみが進歩しますしかし後退はしません

構文エラーやファイルの終わりに遭遇すると例外がスローされます

{に遭遇するとブロック処理に入ります

最後に言語単位の処理が行われ、処理後は関数自体でなければなりません; と前の内容、return

最初の原則が達成できないため、メンバー関数の定義コードは解析されません、メンバー関数はまだ宣言されていない他のメンバー関数を参照する可能性があります

最高のパフォーマンスではありません、しかし、それは可能です この構造は極限まで最適化されています

完全な分析は求めていませんが、このフレームワークでは C++11 以降のバージョンのすべての機能を分析できます

コメントはありません、英語は苦手、中国語のコメントはありませんグローバリゼーションには適していません

構造の説明

バリアント、メソッド、型、コメント、列挙、列挙値はオブジェクトから継承され、それらはすべてグローバル、クラス、または構造に属することができます。

document は C++ コンパイル単位を表します。

context はコンテキストを表し、上向きに検索できるキューです。ドキュメントの解析が完了すると、解析された変数、関数、および型が保存されます。

reader、ファイルリーダー、forward char iterator は、istreambuf_iterator(ifstream) で置き換えることができます。

使用

main 関数には _DEBUG マクロ保護があるため、ライブラリ リリースとしてコンパイルすることをお勧めします。

#include

try

{

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

// todo


}

catch (logic_error& e)

{

// todo:
}

プロジェクトの場所


https://github.com/FettLuo/cpp_analysis[新しいタブで開く]

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。