427

C++は状況依存言語であるという主張をよく耳にします。次の例を見てください。

a b(c);

これは変数定義ですか、それとも関数宣言ですか?それは記号の意味に依存しますcc変数の場合、はタイプという名前の変数をa b(c);定義します。で直接初期化されます。ただし、がの場合は、を取り、を返すという名前の関数を宣言します。bacca b(c);bca

文脈自由言語の定義を調べると、基本的に、すべての文法規則には、ちょうど1つの非終端記号で構成される左側が必要であることがわかります。一方、状況依存文法では、左側に終端記号と非終端記号の任意の文字列を使用できます。

「C++プログラミング言語」の付録Aを参照すると、左側に1つの非終端記号以外の何かがある単一の文法規則を見つけることができませんでした。これは、C++が文脈自由であることを意味します。(もちろん、すべての文脈自由言語は、文脈自由言語が文脈依存言語のサブセットを形成するという意味で文脈依存でもありますが、それは重要ではありません。)

では、C ++は文脈自由ですか、それとも文脈依存ですか?

4

20 に答える 20

364

以下は、C ++の構文解析が(おそらく)チューリング完全である理由の私の(現在の)お気に入りのデモンストレーションです。これは、指定された整数が素数である場合にのみ構文的に正しいプログラムを示しているためです。

したがって、 C++は文脈自由でも文脈依存でもないと断言します。

プロダクションの両側で任意のシンボルシーケンスを許可すると、Chomsky階層でタイプ0の文法(「無制限」)が生成されます。これは、状況依存の文法よりも強力です。無制限文法はチューリング完全です。状況依存(タイプ1)文法では、プロダクションの左側に複数のコンテキストシンボルを使用できますが、同じコンテキストをプロダクションの右側に表示する必要があります(そのため「コンテキスト依存」という名前が付けられています)。[1]状況依存の文法は、線形拘束チューリングマシンと同等です。

サンプルプログラムでは、プライム計算は線形拘束チューリングマシンで実行できるため、チューリングの同等性を完全に証明することはできませんが、構文解析を実行するためにパーサーが計算を実行する必要があることが重要です。テンプレートのインスタンス化として表現できる計算であれば、C++テンプレートのインスタンス化がチューリング完全であると信じる理由は十分にあります。たとえば、ToddL.Veldhuizenの2003年の論文を参照してください。

とにかく、C ++はコンピューターで解析できるので、チューリングマシンでも確実に解析できます。その結果、無制限文法はそれを認識することができた。実際にそのような文法を書くことは非現実的であり、それが標準がそうしようとしない理由です。(下記参照。)

特定の表現の「あいまいさ」の問題は、ほとんどが赤いニシンです。そもそも、あいまいさは特定の文法の特徴であり、言語ではありません。言語に曖昧さのない文法がないことが証明できたとしても、文脈自由文法で認識できれば、文脈自由です。同様に、文脈自由文法では認識できないが、文脈依存文法では認識できる場合は、文脈依存です。あいまいさは関係ありません。

しかし、いずれにしても、auto b = foo<IsPrime<234799>>::typen<1>();以下のプログラムの21行目(つまり)のように、式はまったくあいまいではありません。それらは、コンテキストに応じて単純に異なる方法で解析されます。問題の最も単純な表現では、特定の識別子の構文カテゴリは、それらがどのように宣言されているか(タイプや関数など)に依存します。つまり、形式言語は、2つの任意の長さの文字列が同じプログラムは同一です(宣言と使用)。これは、「コピー」文法によってモデル化できます。これは、同じ単語の2つの連続する正確なコピーを認識する文法です。ポンピング補題で証明するのは簡単ですこの言語は文脈自由ではありません。この言語の状況依存文法が可能であり、タイプ0の文法がこの質問への回答で提供されています:https ://math.stackexchange.com/questions/163830/context-sensitive-grammar-for-the-コピー言語

C ++を解析するために文脈依存(または無制限)文法を書き込もうとすると、おそらく宇宙は落書きでいっぱいになります。C ++を解析するチューリングマシンを作成することも、同様に不可能な作業です。C ++プログラムを書くことさえ困難であり、私が知る限り、どれも正しいことが証明されていません。これが、標準が完全な形式文法を提供しようとしない理由であり、解析規則の一部を技術英語で記述することを選択する理由です。

C ++標準の形式文法のように見えるのは、C++言語の構文の完全な形式定義ではありません。前処理後の言語の完全な正式な定義でさえありません。これは、形式化するのが簡単な場合があります。(ただし、それは言語ではありません。標準で定義されているC ++言語にはプリプロセッサが含まれており、文法的な形式で説明するのは非常に難しいため、プリプロセッサの動作はアルゴリズムで説明されています。このセクションにあります。語彙分解が記述されている標準の、それが複数回適用されなければならない規則を含む。)

さまざまな文法(字句解析用の2つの重複する文法、1つは前処理の前に行われ、もう1つは必要に応じて後で行われる)と「構文」文法が付録Aにまとめられており、この重要な注意事項があります(強調を追加)。

このC++構文の要約は、理解を助けることを目的としています。それは言語の正確な記述ではありません。特に、ここで説明する文法は、有効なC++構造のスーパーセットを受け入れます。式と宣言を区別するには、曖昧性解消規則(6.8、7.1、10.2)を適用する必要があります。さらに、アクセス制御、あいまいさ、および型の規則を使用して、構文的には有効であるが意味のない構造を取り除く必要があります。

最後に、これが約束されたプログラムです。IsPrime<N>21行目は、N inが素数である場合にのみ、構文的に正しいです。それ以外の場合、typenは整数であり、テンプレートではないため、構文的に有効な式ではないため、構文的に正しくないものtypen<1>()として解析されます。(typen<1)>()()

template<bool V> struct answer { answer(int) {} bool operator()(){return V;}};

template<bool no, bool yes, int f, int p> struct IsPrimeHelper
  : IsPrimeHelper<p % f == 0, f * f >= p, f + 2, p> {};
template<bool yes, int f, int p> struct IsPrimeHelper<true, yes, f, p> { using type = answer<false>; };
template<int f, int p> struct IsPrimeHelper<false, true, f, p> { using type = answer<true>; };

template<int I> using IsPrime = typename IsPrimeHelper<!(I&1), false, 3, I>::type;
template<int I>
struct X { static const int i = I; int a[i]; }; 

template<typename A> struct foo;
template<>struct foo<answer<true>>{
  template<int I> using typen = X<I>;
};
template<> struct foo<answer<false>>{
  static const int typen = 0;
};

int main() {
  auto b = foo<IsPrime<234799>>::typen<1>(); // Syntax error if not prime
  return 0;
}

[1]より技術的に言えば、状況依存文法のすべてのプロダクションは、次の形式である必要があります。

αAβ → αγβ

ここで、Aは非終端記号であり、は文法記号の空のシーケンスである可能性がありα、は空ではないシーケンスです。(文法記号は、終端記号または非終端記号のいずれかです)。βγ

A → γこれは、コンテキスト内でのみ読み取ることができます[α, β]。文脈自由(タイプ2)文法でαありβ、空である必要があります。

「単調」制限を使用して文法を制限することもできます。この場合、すべてのプロダクションは次の形式である必要があります。

α → βここで|α| ≥ |β| > 0  (|α|は「の長さ」を意味しますα

単調文法によって認識される言語のセットが状況依存文法によって認識される言語のセットとまったく同じであることを証明することは可能であり、単調文法に基づいて証明する方が簡単な場合がよくあります。したがって、「単調」を意味するかのように「コンテキスト依存」が使用されるのはかなり一般的です。

于 2013-01-29T18:18:40.330 に答える
122

まず、C++ 標準の最後にある文法には文脈依存の規則がないことを正しく観察したため、文法文脈に依存しません。

ただし、その文法は C++ 言語を正確に記述しているわけではありません。

int m() { m++; }

また

typedef static int int;

「整形式の C++ プログラムのセット」として定義されている C++ 言語は、コンテキストフリーではありません (変数の宣言を要求するだけでコンテキストフリーになることを示すことは可能です)。理論的にはチューリング完全なプログラムをテンプレートに記述し、その結果に基づいてプログラムを不正な形式にすることができるとすれば、それは文脈依存でさえありません。

現在、(無知な) 人々 (通常は言語理論家ではなく、パーサーの設計者) は通常、次のような意味で「コンテキストフリーではない」を使用します。

  • あいまいな
  • Bison で解析できません
  • LL(k)、LR(k)、LALR(k)、または彼らが選択したパーサー定義の言語クラスではありません

標準の後ろにある文法はこれらのカテゴリを満たしていません (つまり、あいまいで、LL(k) ではありません...)。そのため、C++ 文法は「文脈自由ではない」ものです。ある意味では、彼らは正しく、動作する C++ パーサーを作成するのは非常に困難です。

ここで使用されているプロパティは、文脈自由言語との関連性が弱いことに注意してください - あいまいさは文脈依存性とは関係ありません (実際、文脈依存ルールは通常、プロダクションのあいまいさを解消するのに役立ちます)。他の 2 つは文脈のサブセットにすぎません。 -無料の言語。また、文脈自由言語の解析は直線的なプロセスではありません (決定論的な言語の解析は直線的なプロセスですが)。

于 2013-01-29T18:43:17.387 に答える
62

はい。次の式は、タイプ解決されたコンテキストに応じて操作の順序が異なります。

編集:実際の操作の順序が異なる場合、装飾(型情報の伝播)の前に装飾されていないASTに解析する「通常の」コンパイラを使用することは非常に困難になります。言及されている他のコンテキストセンシティブなものは、これと比較して「かなり簡単」です(テンプレートの評価がまったく簡単ではありません)。

#if FIRST_MEANING
   template<bool B>
   class foo
   { };
#else
   static const int foo = 0;
   static const int bar = 15;
#endif

に続く:

static int foobar( foo < 2 ? 1 < 1 : 0 > & bar );
于 2009-07-23T16:46:09.733 に答える
29

質問に答えるには、2 つの異なる質問を区別する必要があります。

  1. ほとんどすべてのプログラミング言語の単なる構文は文脈自由です。通常、拡張された Backus-Naur 形式または文脈自由文法として与えられます。

  2. ただし、プログラムがプログラミング言語で定義された文脈自由文法に準拠していても、それが有効なプログラムであるとは限りません。プログラムが有効なプログラムであるために満たす必要がある、コンテキストフリーでない多くのプロパティがあります。たとえば、そのような最も単純なプロパティは変数のスコープです。

結論として、C++ が文脈自由であるかどうかは、あなたの質問次第です。

于 2013-01-29T18:52:31.027 に答える
15

Bjarne Stroustrup によるThe Design & Evolution of C++をご覧になることをお勧めします。その中で彼は、初期バージョンの C++ を解析するために yacc (または同様のもの) を使用しようとして、代わりに再帰降下を使用したかったという彼の問題について説明しています。

于 2009-07-23T17:00:16.757 に答える
13

ええ、C++ は状況に敏感で、非常に状況に敏感です。コンテキスト フリー パーサーを使用して単純にファイルを解析するだけでは、構文ツリーを構築することはできません。これは、場合によっては、決定するために以前の知識からシンボルを知る必要があるためです (つまり、解析中にシンボル テーブルを構築する)。

最初の例:

A*B;

これは乗算式ですか?

また

Bこれは、変数が 型のポインターであることを宣言していますAか?

A が変数の場合は式、A が型の場合はポインター宣言です。

2 番目の例:

A B(bar);

これは型の引数を取る関数プロトタイプbarですか?

また

Bこれは型の変数を宣言し、初期化子として定数を使用してAA のコンストラクターを呼び出しますか?bar

barが変数なのかシンボル テーブルの型なのかをもう一度知る必要があります。

3 番目の例:

class Foo
{
public:
    void fn(){x*y;}
    int x, y;
};

これは、x と y の宣言が関数定義の後に来るため、構文解析中にシンボル テーブルを作成しても役に立たない場合です。したがって、最初にクラス定義をスキャンし、2 番目のパスでメソッド定義を調べて、x*y が式であり、ポインター宣言などではないことを確認する必要があります。

于 2011-10-31T20:51:26.963 に答える
12

「文脈依存」の正式な定義と「文脈依存」の非公式な使用との間には、いくらかの混乱があるように感じます。前者には明確な意味があります。後者は、「入力を解析するためにコンテキストが必要」と言うために使用されます。

これもここで尋ねられます: コンテキスト依存性とあいまいさ

文脈自由文法は次のとおりです。

<a> ::= <b> | <c>
<b> ::= "x"
<c> ::= "x"

これはあいまいなので、入力「x」を解析するには、何らかのコンテキストが必要です(または、あいまいさを伴うか、「警告:E8271-入力は115行目であいまいです」を発行します)。しかし、それは確かに文脈依存の文法ではありません。

于 2013-01-29T18:26:16.573 に答える
10

C++ は GLR パーサーで解析されます。つまり、ソース コードの解析中に、パーサーあいまいさに遭遇する可能性がありますが、続行して、後で使用する文法規則を決定する必要があります。

また見て、

C++ を LR(1) パーサーで解析できないのはなぜですか?


文脈自由文法は、プログラミング言語構文のすべての規則を記述できるわけではないことに注意してください。たとえば、属性文法は、式の型の有効性をチェックするために使用されます。

int x;
x = 9 + 1.0;

次のルールは文脈自由文法では記述 できません:割り当ての右側は、左側と同じ型でなければなりません。

于 2009-07-23T16:37:46.333 に答える
6

Algol のような言語は、型に基づいて識別子が表示される式とステートメントを制約する規則があり、宣言と使用の間に発生する可能性のあるステートメントの数に制限がないため、文脈自由言語ではありません。

通常の解決策は、有効なプログラムのスーパーセットを実際に受け入れるコンテキストフリーのパーサーを作成し、ルールに関連付けられたアドホックな「セマンティック」コードにコンテキスト依存の部分を配置することです。

C++ は、そのチューリング完全なテンプレート システムのおかげで、これをはるかに超えています。スタック オーバーフローの質問 794015を参照してください。

于 2013-01-30T18:58:54.360 に答える
5

C ++標準のプロダクションは文脈自由で書かれていますが、私たち全員が知っているように、言語を正確に定義しているわけではありません。ほとんどの人が現在の言語のあいまいさとして見ているもののいくつかは、文脈依存の文法で明確に解決できると思います。

最も明白な例として、最も厄介な解析を考えてみましょうint f(X);。が値の場合、これはで初期化される変数としてX定義されます。が型の場合、型の単一のパラメーターを受け取る関数として定義されます。fXXfX

それを文法的な観点から見ると、次のように見ることができます。

A variable_decl ::= <type> <identifier> '(' initializer ')' ';'

B function_decl ::= <type> <identifier> '(' param_decl ')' ';'

A ::= [declaration of X as value]
B ::= [declaration of X as type]

もちろん、完全に正しいためには、他のタイプの宣言が介在する可能性を考慮して、いくつかの「もの」を追加する必要があります(つまり、AとBは両方とも実際には「Xの宣言を含む宣言」である必要があります... 、またはその順序で何か)。

ただし、これは通常のCSG(または少なくとも私が覚えているもの)とはまだかなり異なります。これは、構築されているシンボルテーブルに依存します。これはX、タイプまたは値として具体的に認識する部分であり、これに先行するあるタイプのステートメントだけでなく、正しいシンボル/識別子の正しいタイプのステートメントです。

そのため、確認するためにいくつかの作業を行う必要がありますが、少なくともこの用語が通常使用されているため、これは実際にはCSGとして適格ではないとすぐに推測します。

于 2013-01-31T00:01:07.520 に答える
5

さらに悪い場合もあります。C++に「決定不能な文法」があると言うとき、人々はどういう意味ですか?

于 2009-07-23T16:50:13.143 に答える
5

非文脈自由文法の最も単純なケースは、テンプレートを含む式の解析を含みます。

a<b<c>()

これは、次のいずれかとして解析できます

template
   |
   a < expr > ()
        |
        <
      /   \
     b     c

または

 expr
   |
   <
 /   \
a   template
     |
     b < expr > ()
          |
          c

2つのASTは、「a」の宣言を調べることによってのみ明確にすることができます。「a」がテンプレートの場合は前者のAST、そうでない場合は後者です。

于 2013-01-31T08:41:26.133 に答える
5

真実 :)

J.スタンリー・ウォーフォード。コンピューター システム。341-346 ページ。

于 2009-07-23T16:37:15.710 に答える
5

a b(c);宣言と変数の 2 つの有効な解析があるため、コンテキストに依存します。「If が型である」と言うときc、それはコンテキストです。C++ がどのようにそれに敏感であるかを正確に説明しました。c「何ですか?」という文脈がなかったら?これを明確に解析できませんでした。

ここでは、コンテキストはトークンの選択で表現されます。パーサーは、型に名前を付ける場合、識別子を型名トークンとして読み取ります。これは最も単純な解決策であり、コンテキストに依存することによる複雑さのほとんどを回避できます (この場合)。

編集:もちろん、コンテキスト感度の問題は他にもあります。私はあなたが示したものに焦点を合わせただけです。これには、テンプレートが特に厄介です。

于 2013-01-29T18:08:53.013 に答える
4

C++テンプレートはチューリングパワフルであることが示されています。正式なリファレンスではありませんが、その点については次の場所を参照してください。

http://cpptruths.blogspot.com/2005/11/c-templates-are-turing-complete.html

私は推測(60年代のALGOLがCFGによって表現できなかったことを示す民俗的で簡潔なCACM証明と同じくらい古い)を思い切って考え、したがってC++はCFGによってのみ正しく解析できないと言います。CFGは、ツリーパスまたはリダクションイベント中のさまざまなTPメカニズムと組み合わせて使用​​されます。これは別の話です。一般的な意味で、停止問題のために、正しい/正しくないことを示すことができないが、それでも正しい/正しくないC++プログラムがいくつか存在します。

{PS- Meta-Sの作者として(上記の何人かの人々が言及しました)-Thothicは機能しておらず、ソフトウェアも無料で入手できません。おそらく、私はこのバージョンの回答を、削除されたり、-3に投票されたりしないように表現しました。}

于 2009-11-15T20:54:56.327 に答える
3

C++ はコンテキスト フリーではありません。少し前にコンパイラの講義でそれを学びました。クイック検索でこのリンクが得られました。「構文またはセマンティクス」セクションでは、C および C++ がコンテキスト フリーではない理由が説明されています。

ウィキペディア トーク: 文脈自由文法

よろしく、
オバネス

于 2009-07-23T16:42:18.010 に答える
2

Meta-S" は、Quinn Tyler Jackson によるコンテキスト依存の解析エンジンです。私は使用していませんが、彼は印象的な話をしています。comp.compilers で彼のコメントを確認し、rnaparse.com/MetaS%20defined.htm を参照してください。 – アイラ バクスター 7 月 25 日 10:42

正しいリンクは解析エンジンです

Meta-S は Thothic と呼ばれる消滅した会社の所有物でした。興味のある人には Meta-S のコピーを無料で送信できます。私はこれを RNA 解析の研究に使用しました。サンプル フォルダに含まれている「pseudoknot grammar」は、非バイオインフォマティクスのアマチュア プログラマーによって書かれたものであり、基本的には機能しないことに注意してください。私の文法は別のアプローチをとっており、非常にうまく機能しています。

于 2009-09-18T11:31:35.407 に答える
2

明らかに、質問をそのまま受け取れば、識別子を持つほぼすべての言語が文脈依存です。

識別子を正しく使用するには、識別子が型名 (クラス名、typedef によって導入された名前、typename テンプレート パラメーター) であるか、テンプレート名であるか、またはその他の名前であるかを知る必要があります。例えば:

x = (name)(expression);

nameが型名の場合はキャストでnameあり、関数名の場合は関数呼び出しです。もう 1 つのケースは、変数定義と関数宣言を区別できない、いわゆる「最も厄介な解析」です (関数宣言であるというルールがあります)。

その難しさから、従属名を持つtypenameと が必要になりました。template私の知る限り、C++ の残りの部分は文脈依存ではありません (つまり、文脈自由文法を書くことは可能です)。

于 2009-07-23T17:02:05.380 に答える
-4

この回答は、C++ はコンテキストフリーではないことを示しています...解析できないという意味があります (回答者によるものではありません)。回答は、特定の定数が素数。

他の人が観察したように、言語が文脈依存/自由であるかどうかに関する質問は、特定の文法に関する同じ質問とは異なります。

解析可能性に関する問題を解決するために、C++ には文脈自由文法が存在するという経験的証拠を提供します。これは、実際に既存の GLR で解析することにより、ソース テキストの文脈自由解析の AST を生成するために使用できます。 -明示的な文法によって駆動されるパーサーベースのツール。

はい、「受け入れすぎる」ことで成功します。受け入れられるものすべてが有効な C++ プログラムであるとは限りません。そのため、追加のチェック (型チェック) が行われます。はい、型チェッカーは計算可能性の問題に遭遇する可能性があります。実際のツールにはこの問題はありません。人々がそのようなプログラムを書いた場合、誰もコンパイルしません。(標準では、実際にはテンプレートを展開する際に実行できる計算量に制限が設けられていると思います。そのため、実際には計算は実際には有限ですが、おそらくかなり大きくなります)。

あなたが言いたいのは、ソース プログラムが有効な C++ ソース プログラムのセットのメンバーであるかどうかを判断することである場合、問題がはるかに難しいことに同意します。しかし、問題は解析ではありません。

このツールは、解析されたプログラムの型チェックから解析を分離することで、この問題を解決します。(コンテキストが存在しない場合に複数の解釈が存在する場合、いくつかの可能な解析を含む解析ツリーにあいまいなノードが記録されます。型チェックにより、どれが正しいかが決定され、無効なサブツリーが削除されます)。以下の例では、(部分的な) 解析ツリーを確認できます。ツリー全体が大きすぎて SO の回答に収まりません。値 234797 または 234799 が使用されているかどうかにかかわらず、解析ツリーが得られることに注意してください。

元の値 234799 を使用して AST でツールの名前/型リゾルバーを実行すると、成功します。値が 234797 の場合、名前リゾルバーは (予想どおり) エラー メッセージ「typen は型ではありません」で失敗します。したがって、そのバージョンは有効な C++ プログラムではありません。

967 tree nodes in tree.
15 ambiguity nodes in tree.
(translation_unit@Cpp~GCC5=2#6b11a20^0 Line 1 Column 1 File C:/temp/prime_with_templates.cpp
 (declaration_seq@Cpp~GCC5=1021#6b06640^1#6b11a20:1 {10} Line 1 Column 1 File C:/temp/prime_with_templates.cpp
  (pp_declaration_seq@Cpp~GCC5=1022#6b049a0^1#6b06640:1 Line 1 Column 1 File C:/temp/prime_with_templates.cpp
   (declaration@Cpp~GCC5=1036#6b04980^1#6b049a0:1 Line 1 Column 1 File C:/temp/prime_with_templates.cpp
   |(template_declaration@Cpp~GCC5=2079#6b04960^1#6b04980:1 Line 1 Column 1 File C:/temp/prime_with_templates.cpp
   | (template_parameter_list@Cpp~GCC5=2082#6afbde0^1#6b04960:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |  (template_parameter@Cpp~GCC5=2085#6afbd80^1#6afbde0:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |   (parameter_declaration@Cpp~GCC5=1611#6afbd40^1#6afbd80:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |   |(basic_decl_specifier_seq@Cpp~GCC5=1070#6afb880^1#6afbd40:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |   | (decl_specifier@Cpp~GCC5=1073#6afb840^1#6afb880:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |   |  (trailing_type_specifier@Cpp~GCC5=1118#6afb7e0^1#6afb840:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp
   |   |   (simple_type_specifier@Cpp~GCC5=1138#6afb7a0^1#6afb7e0:1 Line 1 Column 10 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |  )trailing_type_specifier#6afb7e0
   |   | )decl_specifier#6afb840
   |   |)basic_decl_specifier_seq#6afb880
   |   |(ptr_declarator@Cpp~GCC5=1417#6afbc40^1#6afbd40:2 Line 1 Column 15 File C:/temp/prime_with_templates.cpp
   |   | (noptr_declarator@Cpp~GCC5=1421#6afbba0^1#6afbc40:1 Line 1 Column 15 File C:/temp/prime_with_templates.cpp
   |   |  (declarator_id@Cpp~GCC5=1487#6afbb80^1#6afbba0:1 Line 1 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   (id_expression@Cpp~GCC5=317#6afbaa0^1#6afbb80:1 Line 1 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   |(unqualified_id@Cpp~GCC5=319#6afb9c0^1#6afbaa0:1 Line 1 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   | (IDENTIFIER@Cpp~GCC5=3368#6afb780^1#6afb9c0:1[`V'] Line 1 Column 15 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |)unqualified_id#6afb9c0
   |   |   )id_expression#6afbaa0
   |   |  )declarator_id#6afbb80
   |   | )noptr_declarator#6afbba0
   |   |)ptr_declarator#6afbc40
   |   )parameter_declaration#6afbd40
   |  )template_parameter#6afbd80
   | )template_parameter_list#6afbde0
   | (declaration@Cpp~GCC5=1033#6b04940^1#6b04960:2 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |  (block_declaration@Cpp~GCC5=1050#6b04920^1#6b04940:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   (simple_declaration@Cpp~GCC5=1060#6b04900^1#6b04920:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   |(basic_decl_specifier_seq@Cpp~GCC5=1070#6b048e0^1#6b04900:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   | (decl_specifier@Cpp~GCC5=1073#6b048c0^1#6b048e0:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   |  (type_specifier@Cpp~GCC5=1110#6b048a0^1#6b048c0:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   |   (class_specifier@Cpp~GCC5=1761#6b04880^1#6b048a0:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   |   |(class_head@Cpp~GCC5=1763#6afb980^1#6b04880:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp
   |   |   | (class_key@Cpp~GCC5=1791#6afbca0^1#6afb980:1 Line 1 Column 18 File C:/temp/prime_with_templates.cpp)class_key
   |   |   | (IDENTIFIER@Cpp~GCC5=3368#6afbcc0^1#6afb980:2[`answer'] Line 1 Column 25 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   | (optional_base_clause@Cpp~GCC5=1872#6afba60^1#6afb980:3 Line 1 Column 32 File C:/temp/prime_with_templates.cpp)optional_base_clause
   |   |   |)class_head#6afb980
   |   |   |(member_specification@Cpp~GCC5=1794#6b042e0^1#6b04880:2 {2} Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   | (member_declaration_or_access_specifier@Cpp~GCC5=1806#6b04060^1#6b042e0:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |  (member_declaration@Cpp~GCC5=1822#6b04040^1#6b04060:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   (function_definition@Cpp~GCC5=1632#6b04020^1#6b04040:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |(function_head@Cpp~GCC5=1673#6afbec0^1#6b04020:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   | (ptr_declarator@Cpp~GCC5=1417#6afbfe0^1#6afbec0:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |  (noptr_declarator@Cpp~GCC5=1422#6afbf80^1#6afbfe0:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |   (noptr_declarator@Cpp~GCC5=1421#6afbf60^1#6afbf80:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |(declarator_id@Cpp~GCC5=1487#6afbea0^1#6afbf60:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |   | (id_expression@Cpp~GCC5=317#6afbb40^1#6afbea0:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |  (unqualified_id@Cpp~GCC5=319#6afbc80^1#6afbb40:1 Line 1 Column 34 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   (IDENTIFIER@Cpp~GCC5=3368#6afbc20^1#6afbc80:1[`answer'] Line 1 Column 34 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |   |   |  )unqualified_id#6afbc80
   |   |   |   |   | )id_expression#6afbb40
   |   |   |   |   |)declarator_id#6afbea0
   |   |   |   |   )noptr_declarator#6afbf60
   |   |   |   |   (parameter_declaration_clause@Cpp~GCC5=1559#6afbd00^1#6afbf80:2 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |(pp_parameter_declaration_list@Cpp~GCC5=1570#6afb940^1#6afbd00:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   | (pp_parameter_declaration_seq@Cpp~GCC5=1574#6afb800^1#6afb940:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |  (parameter_declaration@Cpp~GCC5=1610#6afb9a0^1#6afb800:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   (basic_decl_specifier_seq@Cpp~GCC5=1070#6afbf40^1#6afb9a0:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |(decl_specifier@Cpp~GCC5=1073#6afbfa0^1#6afbf40:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   | (trailing_type_specifier@Cpp~GCC5=1118#6afbfc0^1#6afbfa0:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |  (simple_type_specifier@Cpp~GCC5=1140#6afb860^1#6afbfc0:1 Line 1 Column 41 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |   |   |   |   | )trailing_type_specifier#6afbfc0
   |   |   |   |   |   |)decl_specifier#6afbfa0
   |   |   |   |   |   )basic_decl_specifier_seq#6afbf40
   |   |   |   |   |  )parameter_declaration#6afb9a0
   |   |   |   |   | )pp_parameter_declaration_seq#6afb800
   |   |   |   |   |)pp_parameter_declaration_list#6afb940
   |   |   |   |   )parameter_declaration_clause#6afbd00
   |   |   |   |   (function_qualifiers@Cpp~GCC5=1438#6afbce0^1#6afbf80:3 Line 1 Column 46 File C:/temp/prime_with_templates.cpp)function_qualifiers
   |   |   |   |  )noptr_declarator#6afbf80
   |   |   |   | )ptr_declarator#6afbfe0
   |   |   |   |)function_head#6afbec0
   |   |   |   |(function_body@Cpp~GCC5=1680#6b04000^1#6b04020:2 Line 1 Column 46 File C:/temp/prime_with_templates.cpp
   |   |   |   | (compound_statement@Cpp~GCC5=888#6afbee0^1#6b04000:1 Line 1 Column 46 File C:/temp/prime_with_templates.cpp)compound_statement
   |   |   |   |)function_body#6b04000
   |   |   |   )function_definition#6b04020
   |   |   |  )member_declaration#6b04040
   |   |   | )member_declaration_or_access_specifier#6b04060
   |   |   | (member_declaration_or_access_specifier@Cpp~GCC5=1806#6b042c0^1#6b042e0:2 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |  (member_declaration@Cpp~GCC5=1822#6b04820^1#6b042c0:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   (function_definition@Cpp~GCC5=1632#6b04280^1#6b04820:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   |(function_head@Cpp~GCC5=1674#6b04220^1#6b04280:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   | (basic_decl_specifier_seq@Cpp~GCC5=1070#6b040e0^1#6b04220:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   |  (decl_specifier@Cpp~GCC5=1073#6b040c0^1#6b040e0:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   |   (trailing_type_specifier@Cpp~GCC5=1118#6b040a0^1#6b040c0:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |(simple_type_specifier@Cpp~GCC5=1138#6b04080^1#6b040a0:1 Line 1 Column 49 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |   |   |   )trailing_type_specifier#6b040a0
   |   |   |   |  )decl_specifier#6b040c0
   |   |   |   | )basic_decl_specifier_seq#6b040e0
   |   |   |   | (ptr_declarator@Cpp~GCC5=1417#6b04200^1#6b04220:2 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |  (noptr_declarator@Cpp~GCC5=1422#6b041e0^1#6b04200:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   (noptr_declarator@Cpp~GCC5=1421#6b041a0^1#6b041e0:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |(declarator_id@Cpp~GCC5=1487#6b04180^1#6b041a0:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   | (id_expression@Cpp~GCC5=317#6b04160^1#6b04180:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |  (unqualified_id@Cpp~GCC5=320#6b04140^1#6b04160:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   (operator_function_id@Cpp~GCC5=2027#6b04120^1#6b04140:1 Line 1 Column 54 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |(operator@Cpp~GCC5=2070#6b04100^1#6b04120:1 Line 1 Column 62 File C:/temp/prime_with_templates.cpp)operator
   |   |   |   |   |   )operator_function_id#6b04120
   |   |   |   |   |  )unqualified_id#6b04140
   |   |   |   |   | )id_expression#6b04160
   |   |   |   |   |)declarator_id#6b04180
   |   |   |   |   )noptr_declarator#6b041a0
   |   |   |   |   (parameter_declaration_clause@Cpp~GCC5=1558#6afba40^1#6b041e0:2 Line 1 Column 65 File C:/temp/prime_with_templates.cpp)parameter_declaration_clause
   |   |   |   |   (function_qualifiers@Cpp~GCC5=1438#6b041c0^1#6b041e0:3 Line 1 Column 66 File C:/temp/prime_with_templates.cpp)function_qualifiers
   |   |   |   |  )noptr_declarator#6b041e0
   |   |   |   | )ptr_declarator#6b04200
   |   |   |   |)function_head#6b04220
   |   |   |   |(function_body@Cpp~GCC5=1680#6b04300^1#6b04280:2 Line 1 Column 66 File C:/temp/prime_with_templates.cpp
   |   |   |   | (compound_statement@Cpp~GCC5=889#6b04760^1#6b04300:1 Line 1 Column 66 File C:/temp/prime_with_templates.cpp
   |   |   |   |  (pp_statement_seq@Cpp~GCC5=894#6b04780^1#6b04760:1 Line 1 Column 67 File C:/temp/prime_with_templates.cpp
   |   |   |   |   (statement@Cpp~GCC5=857#6b04440^1#6b04780:1 Line 1 Column 67 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |(jump_statement@Cpp~GCC5=1011#6afba80^1#6b04440:1 Line 1 Column 67 File C:/temp/prime_with_templates.cpp
   |   |   |   |   | (pm_expression@Cpp~GCC5=551#6b04380^1#6afba80:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |  (cast_expression@Cpp~GCC5=543#6b04360^1#6b04380:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   (unary_expression@Cpp~GCC5=465#6b04340^1#6b04360:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |(primary_expression@Cpp~GCC5=307#6b04320^1#6b04340:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   | (id_expression@Cpp~GCC5=317#6b042a0^1#6b04320:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |  (unqualified_id@Cpp~GCC5=319#6b04260^1#6b042a0:1 Line 1 Column 74 File C:/temp/prime_with_templates.cpp
   |   |   |   |   |   |   (IDENTIFIER@Cpp~GCC5=3368#6b04240^1#6b04260:1[`V'] Line 1 Column 74 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |   |   |   |  )unqualified_id#6b04260
   |   |   |   |   |   | )id_expression#6b042a0
   |   |   |   |   |   |)primary_expression#6b04320
   |   |   |   |   |   )unary_expression#6b04340
   |   |   |   |   |  )cast_expression#6b04360
   |   |   |   |   | )pm_expression#6b04380
   |   |   |   |   |)jump_statement#6afba80
   |   |   |   |   )statement#6b04440
   |   |   |   |  )pp_statement_seq#6b04780
   |   |   |   | )compound_statement#6b04760
   |   |   |   |)function_body#6b04300
   |   |   |   )function_definition#6b04280
   |   |   |  )member_declaration#6b04820
   |   |   | )member_declaration_or_access_specifier#6b042c0
   |   |   |)member_specification#6b042e0
   |   |   )class_specifier#6b04880
   |   |  )type_specifier#6b048a0
   |   | )decl_specifier#6b048c0
   |   |)basic_decl_specifier_seq#6b048e0
   |   )simple_declaration#6b04900
   |  )block_declaration#6b04920
   | )declaration#6b04940
   |)template_declaration#6b04960
   )declaration#6b04980
  )pp_declaration_seq#6b049a0
  (pp_declaration_seq@Cpp~GCC5=1022#6b06620^1#6b06640:2 Line 3 Column 1 File C:/temp/prime_with_templates.cpp
   (declaration@Cpp~GCC5=1036#6b06600^1#6b06620:1 Line 3 Column 1 File C:/temp/prime_with_templates.cpp
   |(template_declaration@Cpp~GCC5=2079#6b065e0^1#6b06600:1 Line 3 Column 1 File C:/temp/prime_with_templates.cpp
   | (template_parameter_list@Cpp~GCC5=2083#6b05460^1#6b065e0:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |  (template_parameter_list@Cpp~GCC5=2083#6b05140^1#6b05460:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   (template_parameter_list@Cpp~GCC5=2083#6b04ee0^1#6b05140:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |(template_parameter_list@Cpp~GCC5=2082#6b04cc0^1#6b04ee0:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   | (template_parameter@Cpp~GCC5=2085#6b04ca0^1#6b04cc0:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |  (parameter_declaration@Cpp~GCC5=1611#6b04c80^1#6b04ca0:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |   (basic_decl_specifier_seq@Cpp~GCC5=1070#6b04a40^1#6b04c80:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |   |(decl_specifier@Cpp~GCC5=1073#6b04a20^1#6b04a40:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |   | (trailing_type_specifier@Cpp~GCC5=1118#6b04a00^1#6b04a20:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp
   |   |   |  (simple_type_specifier@Cpp~GCC5=1138#6b049e0^1#6b04a00:1 Line 3 Column 10 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |   | )trailing_type_specifier#6b04a00
   |   |   |)decl_specifier#6b04a20
   |   |   )basic_decl_specifier_seq#6b04a40
   |   |   (ptr_declarator@Cpp~GCC5=1417#6b04c40^1#6b04c80:2 Line 3 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   |(noptr_declarator@Cpp~GCC5=1421#6b04be0^1#6b04c40:1 Line 3 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   | (declarator_id@Cpp~GCC5=1487#6b04bc0^1#6b04be0:1 Line 3 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   |  (id_expression@Cpp~GCC5=317#6b04b60^1#6b04bc0:1 Line 3 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   |   (unqualified_id@Cpp~GCC5=319#6b04ac0^1#6b04b60:1 Line 3 Column 15 File C:/temp/prime_with_templates.cpp
   |   |   |   |(IDENTIFIER@Cpp~GCC5=3368#6b049c0^1#6b04ac0:1[`no'] Line 3 Column 15 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |   )unqualified_id#6b04ac0
   |   |   |  )id_expression#6b04b60
   |   |   | )declarator_id#6b04bc0
   |   |   |)noptr_declarator#6b04be0
   |   |   )ptr_declarator#6b04c40
   |   |  )parameter_declaration#6b04c80
   |   | )template_parameter#6b04ca0
   |   |)template_parameter_list#6b04cc0
   |   |(template_parameter@Cpp~GCC5=2085#6b04ec0^1#6b04ee0:2 Line 3 Column 19 File C:/temp/prime_with_templates.cpp
   |   | (parameter_declaration@Cpp~GCC5=1611#6b04ea0^1#6b04ec0:1 Line 3 Column 19 File C:/temp/prime_with_templates.cpp
   |   |  (basic_decl_specifier_seq@Cpp~GCC5=1070#6b04b40^1#6b04ea0:1 Line 3 Column 19 File C:/temp/prime_with_templates.cpp
   |   |   (decl_specifier@Cpp~GCC5=1073#6b04ba0^1#6b04b40:1 Line 3 Column 19 File C:/temp/prime_with_templates.cpp
   |   |   |(trailing_type_specifier@Cpp~GCC5=1118#6b04c60^1#6b04ba0:1 Line 3 Column 19 File C:/temp/prime_with_templates.cpp
   |   |   | (simple_type_specifier@Cpp~GCC5=1138#6b04580^1#6b04c60:1 Line 3 Column 19 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |   |)trailing_type_specifier#6b04c60
   |   |   )decl_specifier#6b04ba0
   |   |  )basic_decl_specifier_seq#6b04b40
   |   |  (ptr_declarator@Cpp~GCC5=1417#6b04e60^1#6b04ea0:2 Line 3 Column 24 File C:/temp/prime_with_templates.cpp
   |   |   (noptr_declarator@Cpp~GCC5=1421#6b04e40^1#6b04e60:1 Line 3 Column 24 File C:/temp/prime_with_templates.cpp
   |   |   |(declarator_id@Cpp~GCC5=1487#6b04de0^1#6b04e40:1 Line 3 Column 24 File C:/temp/prime_with_templates.cpp
   |   |   | (id_expression@Cpp~GCC5=317#6b04d80^1#6b04de0:1 Line 3 Column 24 File C:/temp/prime_with_templates.cpp
   |   |   |  (unqualified_id@Cpp~GCC5=319#6b04ce0^1#6b04d80:1 Line 3 Column 24 File C:/temp/prime_with_templates.cpp
   |   |   |   (IDENTIFIER@Cpp~GCC5=3368#6b04560^1#6b04ce0:1[`yes'] Line 3 Column 24 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |  )unqualified_id#6b04ce0
   |   |   | )id_expression#6b04d80
   |   |   |)declarator_id#6b04de0
   |   |   )noptr_declarator#6b04e40
   |   |  )ptr_declarator#6b04e60
   |   | )parameter_declaration#6b04ea0
   |   |)template_parameter#6b04ec0
   |   )template_parameter_list#6b04ee0
   |   (template_parameter@Cpp~GCC5=2085#6b05120^1#6b05140:2 Line 3 Column 29 File C:/temp/prime_with_templates.cpp
   |   |(parameter_declaration@Cpp~GCC5=1611#6b05100^1#6b05120:1 Line 3 Column 29 File C:/temp/prime_with_templates.cpp
   |   | (basic_decl_specifier_seq@Cpp~GCC5=1070#6b04d20^1#6b05100:1 Line 3 Column 29 File C:/temp/prime_with_templates.cpp
   |   |  (decl_specifier@Cpp~GCC5=1073#6b04dc0^1#6b04d20:1 Line 3 Column 29 File C:/temp/prime_with_templates.cpp
   |   |   (trailing_type_specifier@Cpp~GCC5=1118#6b04e80^1#6b04dc0:1 Line 3 Column 29 File C:/temp/prime_with_templates.cpp
   |   |   |(simple_type_specifier@Cpp~GCC5=1140#6b046e0^1#6b04e80:1 Line 3 Column 29 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |   )trailing_type_specifier#6b04e80
   |   |  )decl_specifier#6b04dc0
   |   | )basic_decl_specifier_seq#6b04d20
   |   | (ptr_declarator@Cpp~GCC5=1417#6b05080^1#6b05100:2 Line 3 Column 33 File C:/temp/prime_with_templates.cpp
   |   |  (noptr_declarator@Cpp~GCC5=1421#6b05020^1#6b05080:1 Line 3 Column 33 File C:/temp/prime_with_templates.cpp
   |   |   (declarator_id@Cpp~GCC5=1487#6b05000^1#6b05020:1 Line 3 Column 33 File C:/temp/prime_with_templates.cpp
   |   |   |(id_expression@Cpp~GCC5=317#6b04fa0^1#6b05000:1 Line 3 Column 33 File C:/temp/prime_with_templates.cpp
   |   |   | (unqualified_id@Cpp~GCC5=319#6b04f00^1#6b04fa0:1 Line 3 Column 33 File C:/temp/prime_with_templates.cpp
   |   |   |  (IDENTIFIER@Cpp~GCC5=3368#6b046c0^1#6b04f00:1[`f'] Line 3 Column 33 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   | )unqualified_id#6b04f00
   |   |   |)id_expression#6b04fa0
   |   |   )declarator_id#6b05000
   |   |  )noptr_declarator#6b05020
   |   | )ptr_declarator#6b05080
   |   |)parameter_declaration#6b05100
   |   )template_parameter#6b05120
   |  )template_parameter_list#6b05140
   |  (template_parameter@Cpp~GCC5=2085#6b05440^1#6b05460:2 Line 3 Column 36 File C:/temp/prime_with_templates.cpp
   |   (parameter_declaration@Cpp~GCC5=1611#6b05420^1#6b05440:1 Line 3 Column 36 File C:/temp/prime_with_templates.cpp
   |   |(basic_decl_specifier_seq@Cpp~GCC5=1070#6b05160^1#6b05420:1 Line 3 Column 36 File C:/temp/prime_with_templates.cpp
   |   | (decl_specifier@Cpp~GCC5=1073#6b04fe0^1#6b05160:1 Line 3 Column 36 File C:/temp/prime_with_templates.cpp
   |   |  (trailing_type_specifier@Cpp~GCC5=1118#6b050e0^1#6b04fe0:1 Line 3 Column 36 File C:/temp/prime_with_templates.cpp
   |   |   (simple_type_specifier@Cpp~GCC5=1140#6b050c0^1#6b050e0:1 Line 3 Column 36 File C:/temp/prime_with_templates.cpp)simple_type_specifier
   |   |  )trailing_type_specifier#6b050e0
   |   | )decl_specifier#6b04fe0
   |   |)basic_decl_specifier_seq#6b05160
   |   |(ptr_declarator@Cpp~GCC5=1417#6b053e0^1#6b05420:2 Line 3 Column 40 File C:/temp/prime_with_templates.cpp
   |   | (noptr_declarator@Cpp~GCC5=1421#6b053c0^1#6b053e0:1 Line 3 Column 40 File C:/temp/prime_with_templates.cpp
   |   |  (declarator_id@Cpp~GCC5=1487#6b05360^1#6b053c0:1 Line 3 Column 40 File C:/temp/prime_with_templates.cpp
   |   |   (id_expression@Cpp~GCC5=317#6b05280^1#6b05360:1 Line 3 Column 40 File C:/temp/prime_with_templates.cpp
   |   |   |(unqualified_id@Cpp~GCC5=319#6b051a0^1#6b05280:1 Line 3 Column 40 File C:/temp/prime_with_templates.cpp
   |   |   | (IDENTIFIER@Cpp~GCC5=3368#6b046a0^1#6b051a0:1[`p'] Line 3 Column 40 File C:/temp/prime_with_templates.cpp)IDENTIFIER
   |   |   |)unqualified_id#6b051a0
   |   |   )id_expression#6b05280
   |   |  )declarator_id#6b05360
   |   | )noptr_declarator#6b053c0
   |   |)ptr_declarator#6b053e0
   |   )parameter_declaration#6b05420
   |  )template_parameter#6b05440
   | )template_parameter_list#6b05460
于 2016-05-29T04:37:12.740 に答える