1

文法のifステートメントに問題があります。これはhttp://sd-g1.archive-host.com/membres/up/24fe084677d7655eb57ba66e1864081450017dd9/CNew.txtにあります。たとえばCtrl+Dで入力すると:

  int k = 0;
  if ( k ==0 ){
       return k;
  }

ツリーパーサーは「if(」で停止し、コンソールには理由が表示されません。問題がどこから発生しているのか誰か知っていますか?

4

1 に答える 1

1

文法のエントリポイントがであると仮定するとtranslation_unit、パーサーは単一のに一致した後に停止するように見えますexternal_declarationEOFそのルールの最後に(ファイルの終わり)トークンを追加して、パーサーが入力全体と一致するように強制してみてください。

translation_unit
    : external_declaration+ EOF
    ;

ただし、文法の-ステートメント(a )とどのようexternal_declarationに一致するかはわかりません。おそらくあなたはあなたの:にを追加したいでしょうifselection_statementstatementexternal_declaration

translation_unit
scope Symbols; // entire file is a scope
@init {
  $Symbols::types = new HashSet();
}
    : (external_declaration)+ EOF
    ;

external_declaration
    : function_definition
    | declaration
    | statement
    ;

その後、入力は適切に解析されます。

于 2013-03-07T15:30:30.840 に答える