5

構文木(具体的な構文木)を抽象構文木に縮小する一般的な戦略は何ですか?パーズツリーを抽象構文ツリーに縮小するにはどうすればよいですか?

、解析ツリーとして残した場合、私はの子を連結した場合

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

のような出力をあおる生成します

statement_list : statement 
       | statement_list statement 

例えば、私は次の文法規則を持っています各ノード(構文解析後の文リストには固有の意味がないため)は次のようになります。

program 
     definition 
       p_type 
       assignment 
     definition 
     assign 
       assignment 

これはうまくいきましたが、私はこれを行うための "ルール"を知らないです。私が簡素化するために探しているはずの具体的な文法規則はありますか?それは感じの問題なのですか、それとももっと機械的なプロセスがありますか?

+1

あなたはかすかな "ルックアンドフィール"に行くことができますが、それは大部分の作業です。これは、文法を使用して再生成できるノードを削除することによって、基本的に機械的に行うことができます。 http://stackoverflow.com/a/1916687/120163 –

答えて

3

「気分」の問題ではありません。抽象構文木は、解析されたものの意味(セマンティクス)に依存します。これらは規則であると思います。

  1. 意味を追加しないトークンのノードを削除します。それらは中間キーワード(「then」など)、セパレータ(カンマなど)、および かっこ(括弧のようなもの)などの です。
  2. 意味のあるトークン(「if」など)を同じルール内の他のトークンの親にすることを促進します。

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

+0

を参照してください。私は答えを感謝しますが、あなたは自分自身と矛盾しているように感じます。あなたは「それは「気分」の問題ではない」と言っていますが、あなたのルールは言語に依存しています。これまでにいくつかの測定基準があったなら、それは感情の問題ではないと私は同意するだろうが、それは確かにそのように感じる。 – sdasdadas

+0

私はデザイン(特に言語デザイン)が50/50エンジニアリング/フィールであることをいつでも認めます。それはいいですか? – Apalala

+0

はい、もちろん、申し訳ありません - 私はこの質問に戻って忘れました。助けてくれてありがとう。 – sdasdadas

関連する問題