私はコンパイラに関する研究を行ってきました。レクサーは非常に単純なようです:「文章」を取り出し、それを単語(またはトークン)に分解してください。正しい文法を保証するためには、パーサーが必要です。パーサーは一般にトークンを取り、ルートノード(文章、段落、ページなどの単語)を生成するツリーを構築します。抽象構文木または具象構文木をいつ使用するか?
this questionからパーサがASTを構築するようです。 ASTにはコードを実行するために必要なものだけが含まれているため、演算子の優先順位がASTに組み込まれているため、かっこのようなものは不要です。 ASTはおそらくすべてのコンパイラに必要です。
しかし、ある言語から別の言語へのコードの変換はどうですか?作成された言語(文法)または既存の文法をとり、それを別のものに変換すると、演算子優先順位の規則は異なる場合があります。演算子の優先順位はCSTにも組み込まれていますか?
たとえば、言語を作成し、それをPHPコードに翻訳したかったとします。ほとんどの言語の三項演算子には、右から左への連想があります。 PHPでは、左から右への結合性が間違って使用されています(see more about this here)。私は "私の言語"を右から左に使いたいが、結果のPHPコードは括弧を入れてPHPで正しい結果を得なければならない(link to Wikipediaで結果は "馬"の代わりに "train"にする必要がある)。
言語変換のためにCSTは良いでしょうか?演算子の優先順位は通常CSTに組み込まれていますか?間に何かがありますか?両方の木を単純な代数方程式と比較する例はありますか?三項演算子を示す例は何ですか?
は(?。Google検索がメディアを変換立ち上げる「トランスコード」「プログラミング言語翻訳」の正しい用語です)
私が把握しようとしている何である:1を使用することがより適切である場合にはもう一方では?
言語間の翻訳に具体的な構文ツリーが必要な理由がわかりません。具体的な構文は正確には、最も異なる可能性が高いものです。同様の*セマンティクス*を持つプログラムを別の言語で作成したい場合は、元のプログラムの*セマンティクス*だけが必要なため、ASTはそれほどクラッタのないものを提供します。 – delnan
ああ、私はあなたが意味するものを参照してください。だから、いつ具体的なツリーが使用され、抽象的なツリーよりも適切であると考えられ、具体的なツリーは優先順位を気にしますか? – Luke