1

完全な 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*」が実際には型、つまり抽象宣言子の下のノードとして扱われる必要があります。

4

1 に答える 1

0

有名なchar* x, y;宣言を考えてみましょう。yではcharなく、char*です。その理由は、 のみに*適用されるためxです。decl-specifier確かにちょうどですchar

于 2013-04-30T01:05:24.807 に答える