英語版
このページの英語版を見る

dmd.cparse

レキシカルストリームをレキシカルパーサーから取得し、抽象構文木に解析する。

仕様 C11

Authors:

ソースcparse.d

適用範囲 https://codecov.io/gh/dlang/dmd/src/master/src/dmd/cparse.d

class CParser(AST): Parser!AST;
bool addFuncName;
関数シンボルテーブルに_func_の宣言を追加する
bool importBuiltins;
Cコンパイラのビルトイン関数の使用が見られたので、_importc_builtinsをインポートする。
Array!(void*) typedefTab;
AST.Type[Identifier]の配列、Identifierでインデックスされた型定義
AST.Dsymbols* parseModule();
翻訳単位の解析。 C11 6.9 翻訳単位: 外部宣言 翻訳単位外部宣言
外部宣言: 関数定義 宣言
Returns:
宣言されたDシンボルの配列
AST.Statement cparseStatement(int flags, const(char)** endPtr = null, Loc* pEndloc = null);
文パーサー
C11 6.8 文: ラベル付き文 複合文 式文 選択文 反復文 ジャンプ文 "expression-statement"式"
Parameters:
int flags PSxxxx
const(char)** endPtr 閉じ波括弧の格納場所
Loc* pEndloc if { ...文... }, 閉じ波括弧の位置、それ以外は文の最後のトークンの位置
Returns:
解析された文
AST.Expression cparseExpression();
式パーサー
C11 6.5.17 式: 代入式 式 , 代入式
AST.Expression cparsePrimaryExp();
C11 6.5.1 基本式: 識別子 定数 文字列リテラル (式) 汎用選択 _builtin_va_arg(代入式, 型)
AST.Expression cparseAssignExp();
C11 6.5.16 代入式: 条件式 単項式代入演算子代入式
代入演算子: = *= /= %= += -= <<= >>= &= ^= |=
void cparseDeclaration(LVL level);
宣言パーサー
C11 6.7 宣言: 宣言指定子 init-declarator-list (オプション) ; static_assert-declaration
init-declarator-list: init-declarator init-declarator-list , init-declarator
init-declarator: declarator declarator = initializer ==
Parameters:
LVL level 宣言コンテキスト
AST.Dsymbol cparseFunctionDefinition(Identifier id, AST.TypeFunction ft, ref Specifier specifier);
C11 関数定義 関数定義 宣言指定子 宣言子宣言リスト(オプション) 複合文
宣言リスト: 宣言 宣言リスト宣言
宣言リスト(opt)まではすでに解析済みである。 そこから再開する。
Parameters:
Identifier id 関数識別子
AST.TypeFunction ft 関数型
Specifier specifier 関数指定子
Returns: 関数用の記号
関数用の記号
AST.Initializer cparseInitializer();
C11 初期化 初期化子: 代入式 { } // C23 6.7.10 追加 {初期化子リスト} {初期化子リスト, }
初期化子リスト: 指定 (オプション) 初期化子 初期化子リスト , 指定 (オプション) 初期化子
指定: 指定子リスト =
指定子リスト: 指定子 指定子リスト 指定子
指定子: [ 常数式 ] . 識別子
Returns:
初期化子
MOD cparseTypeQualifierList();
C11 6.7.3 型修飾子: const restrict volatile Atomic _stdcall
AST.Type cparseTypeName();
C11 6.7.7
AST.Type cparseSpecifierQualifierList(LVL level, ref Specifier specifier);
C11 6.7.2.1 指定子修飾子リスト: 型指定子 指定子修飾子リスト (オプション) 型修飾子 指定子修飾子リスト (オプション)
Parameters:
LVL level 宣言コンテキスト
Specifier specifier 指定子 in および out
Returns: 結果の型、指定されていない場合はnull
結果の型、指定されていない場合はnull
AST.ParameterList cparseParameterList();
C11 6.7.6.3 ( parameter-type-list ) ( identifier-list (opt) )
void cparseStructDeclaration(AST.Dsymbols* members);
C11 6.7.2.1 構造体宣言のメンバを解析する。 struct-declaration: specifier-qualifier-list struct-declarator-list (opt) ; static_assert-declaration
struct-declarator-list: struct-declarator struct-declarator-list , struct-declarator
struct-declarator: declarator declarator (opt) : constant-expression
Parameters:
AST.Dsymbols* members フィールド(メンバ)を配置する場所
bool isDeclarationList(ref Token* pt);
宣言リストが存在するか確認する。
Returns:
宣言リストが存在する場合、たとえ空であってもtrueとする
enum LVL;
さらに
宣言コンテキスト
global
グローバル
parameter
関数パラメータ(関数識別子リストの宣言)
prototype
関数プロトタイプ
local
ローカル
member
構造体メンバ
enum DTR;
解析する宣言子の型
xdirect
C11 6.7.6 直接宣言子
xabstract
C11 6.7.7 抽象宣言子
xparameter
パラメータ宣言子は直接または抽象のいずれかである可能性がある
enum SCW: uint;
C11 6.7.1 記憶クラス指定子
enum MOD: uint;
C11 6.7.3 "型修飾子"
struct Specifier;
すべてのさまざまな指定子に対する集約子
bool noreturn;
ノーリターン属性
bool naked;
ネイキッド属性
bool _nothrow;
nothrow属性
bool _pure;
純粋属性
bool dllimport;
dllimport属性
bool dllexport;
dllexport属性
bool _deprecated;
非推奨属性
AST.Expression depMsg;
非推奨メッセージ
uint vector_size;
2のべき乗 基本型の倍数 型サイズ
SCW scw;
ストレージクラス指定子
MOD mod;
型修飾子
AST.Expressions* alignExps;
アラインメント
structalign_t packalign;
#pragma pack alignment 値
StorageClass specifiersToSTC(LVL level, const ref Specifier specifier);
C言語の指定子をD言語のストレージクラスに変換する
Parameters:
LVL level 宣言、コンテキスト
Specifier specifier 指定子、コンテキストなど。
Returns: 対応するDストレージクラス
対応するDストレージクラス
void specifiersToFuncDeclaration(AST.FuncDeclaration fd, const ref Specifier specifier);
指定子から関数に属性を追加する
Parameters:
AST.FuncDeclaration fd 関数に適用する
Specifier specifier 指定子に
void specifiersToVarDeclaration(AST.VarDeclaration vd, const ref Specifier specifier);
指定子から変数に属性を追加する
Parameters:
AST.VarDeclaration vd 関数に適用する
Specifier specifier 指定子に適用する
void panic();
エラーが発生した後、右中括弧またはセミコロンが見つかるまで、またはファイルの終わりまで前方にスキャンする。
bool isFunctionTypedef(AST.Type t);
typedefTab シンボルテーブル
型 t が関数型であるかどうかを決定する。
Parameters:
AST.Type t 型をテストする
Returns:
関数を表している場合は true を返す
bool isTypedef(Identifier id);
が型定義のシンボルであるかどうかを判断します。 idシンボルが型定義のシンボルであるかどうかを判断します。
Parameters:
Identifier id 可能な typedef
Returns:
id が型である場合は true を追加する
void insertIdToTypedefTab(Identifier id);
idtypedefTab[]に追加するが、既存のtypedefをマスクする場合のみとする。
Parameters:
Identifier id 非型定義シンボル用の識別子
void insertTypedefToTypedefTab(Identifier id, AST.Type t);
typedefTab[]に追加 idtypedefTab[]に追加する
Parameters: typedefシンボル用の識別子をtypedefTab[]に追加する
Identifier id typedefシンボル用の識別子
AST.Type t 型定義シンボルの型
AST.Type* lookupTypedef(Identifier id);
typedefTab[]でidを検索する。
Returns:
見つからなければ null。 見つかれば Type*。 参照解除すると、それが typedef でなければ null が返され、 typedef であれば型が返される。
bool parseSpecialTokenSequence();
ディレクティブパーサー
void addDefines();
#define Parser
定義バッファ内の #define を順に調べ、Dシンボルに変換できるものがないか確認する。 変換できたものは、symbols[]に追加される。