3

ここで見つけることができるC文法の関数定義に問題がありますhttp://www.archive-host.com/files/1959635/24fe084677d7655eb57ba66e1864081450017dd9/cAST.txt、正しく定義されておらず、乗算できませんそれを何かで。入力しようとしているコードは次のとおりです。

int factorielle(int n)
  { int x;
   if ( n == 0)
  return 1;
   else return n*factorielle(n-1);
  }

関数定義は次のとおりです。

function_definition
    : declaration_specifiers declarator compound_statement
    | declarator compound_statement
    ;

definition_specifiers は int にリンクされ、declarator は factorielle(int n) にリンクされている必要があります。これを行うには、これを置き換えました。

direct_declarator
: ID ((direct_declarator '[' ']') | (direct_declarator '(' parameter_type_list ')') | (direct_declarator '(' identifier_list ')') | (direct_declarator '(' ')') )*

direct_declarator
: ID ((direct_declarator '[' ']') | (direct_declarator '(' parameter_type_list ')') | (direct_declarator '(' identifier_list ')') | (direct_declarator '(' ')')  | '(' parameter_type_list ')' )*

しかし、それはあまり役に立ちません。

乗算に関しては、競合を起こさずに行う方法がわかりません。これを修正する方法はありますか?

4

2 に答える 2

1

純粋な ANTLR を使用した純粋な文法を使用して、実際の C コードを解析するのは困難な場合があります。

その理由は、特定の宣言が正当な実行ステートメントのように見えるからです。(参照されている回答はLR(1)パーサーに関するものであるように見えますが、実際にはあいまいさを処理できないパーサーに関するものです。ANTLRはできません)。

それらを区別する唯一の方法は、以前のシンボル宣言から入手できるコンテキスト情報を使用することです。そのため、構文解析時にシンボル タイプを収集し、その情報を文法規則の縮約で調べて、そのようなインスタンスがステートメントまたは宣言であるかどうかを判断する必要があります。(可能だと信じていますが、ANTLRでこれをどのように実装するかはわかりません)。

于 2013-03-09T08:59:01.557 に答える
0

交換することで、問題の最初の部分の解決策を見つけたかもしれません

compound_statement
  : '{' '}'
  | '{' statement_list '}'
  ;

compound_statement
  : '{' '}'
  | '{' statement_list '}'
  | '{' external_declaration+ '}'
  ;

これを direct_declarator に追加します。

| ID '(' parameter_type_list ')'

しかし、それがいくつかの紛争をもたらすかどうかはわかりません。

于 2013-03-09T07:11:35.863 に答える