yacc パーサーが次のコードに遭遇した場合:
int foo(int a, int b)
foo の属性として int a と int b を追加する必要がありますか? 私が今持っている方法では、a と b を別々のテーブル エントリとして入力します。
別のエントリとしてシンボル テーブルに追加しますが、foo ノードにスコープ句があります。これにより、変数のシャドウ/マスキングを報告できるようになります。したがって、C の場合、多くの場合、モジュール グローバルint aを先頭に定義し、a をパラメーターとして持つと、グローバルがマスクされます。これは、同じスコープ内の a シンボルの再宣言の取引ブレーカーに対してユーザーに警告として与えることができる便利なヒントです。
反復子が同じ名前を持つネストされた for ループのように、スコープ ルールが同じシンボルの再宣言をブロックする必要がある場合もあります。
Ivan が言うように、検出したい/検出する必要があるものと、そのチェックの最も簡単な方法に基づいて、この呼び出しを行う必要があります。
あなたの質問はかなり漠然としています。それはすべて、後でデータを何にどのように使用するかによって異なります。
それらを AST の個別のノードとして使用することも、言及したように、それらを の属性として追加することもできますfoo()
。この問題の選択は、あなた次第だと思います。