完全な C++ 文法をパーサー ジェネレーターにコピーしましたが、C++ 宣言の解析に問題があります。char* varnameのようなポインター型宣言を解析するとき、 decl-specifierをどのように解釈する必要がありますか?
例として MSDN の c++ 文法を使用http://msdn.microsoft.com/en-us/library/0aah9xbf%28v=vs.71%29.aspx :
指定子は次のようなものです。
decl-specifiers :
decl-specifiersopt decl-specifier
decl-specifier :
storage-class-specifier
type-specifier
fct-specifier
friend
typedef
__declspec ( extended-decl-modifier-seq )
そのmsdnの説明によるとchar *lpszAppName; decl-specifier = "char * "、name = " lpszAppName " が必要です。しかし、私のテスト実行では、 decl-specifier はchar、宣言子 (名前) は" * lpszAppName"である必要があることが示されています。名前の前にアスタリスクが付いていることに注意してください。このテスト結果は、 decl-specifier の下では妥当なようです。ポインターを定義するものは何も見つかりません。つまり、decl-speciiferの下にptr-operatorにつながる規則はありません。
これを解析するために、仕様からコピーされた完全な C++ 文法を使用して、ANTLR4 パーサー ジェネレーターでテストしました。
char *
testfunction(int *cx)
{
return;
}
結果の解析ツリーは次のようになります。
明らかに、戻り値の型「char *」は実際には戻り値の型「char」、つまり decl-specifier の下のノードとして解析されますが、* は関数名、つまり宣言子の下のノードに関連付けられています。(int* cx ) パラメーター宣言も型 "int" と見なされますが、ポインター * は cx の宣言子の下のノードです。
私のテストは正しいですか?はいの場合、__cdecl、__stdcall、または __fastcall などの Visual C++ 固有の関数修飾子キーワードをサポートする必要がある場合、文法は次のようになります。
char * __fastcall
testfunction(int *cx)
{
return;
}
明らかに、この構文では、「char*」が実際には型、つまり抽象宣言子の下のノードとして扱われる必要があります。