5

構文木 (具体的な構文木) を抽象構文木に縮小するための一般的な戦略は何ですか?

たとえば、次の文法規則があります。

statement_list : statement
               | statement_list statement

これを解析ツリーのままにしておくと、次のようなファニング出力が生成されます

program
        statement_list
                statement_list
                        statement
                                definition
                                        p_type
                                        assignment
                statement
                        definition
        statement
                assign
                        assignment

各ノードの子を連結すると (ステートメント リストは解析後に固有の意味を持たないため)、次のことを実現できます。

program
        definition
                p_type
                assignment
        definition
        assign
                assignment

これはうまくいきました - しかし、私はこれを行うための「ルール」を知りません。簡素化する必要がある特定の文法規則はありますか? それは感覚の問題ですか、それとももっと機械的なプロセスがありますか?

4

1 に答える 1

5

「気持ち」の問題ではありません。抽象構文ツリーは、解析されたものの意味 (セマンティクス) に依存し、これらがルールになると思います。

  1. 意味を追加しないトークンのノードを削除します。これらは、中間キーワード ("then" など)、セパレーター (コンマなど)、ブラケット (括弧など) です。
  2. 意味のあるトークン (「if」など) を同じルール内の他のトークンの親に昇格させます。

単一のレシピはありません。ターゲット言語のフレーズが何を意味するかによって異なります。

于 2013-07-31T17:58:28.193 に答える