C / C ++コードを生成するときの式の関連性と優先順位?
質問
ASTを生成する基本的なコンパイラを作成しました。これは、表現のオペレーターの優先順位を正しく考慮しています。ただし、C ++コードを作成するためにコード生成を実行するとき、ブラケットの使用方法がわかりません。
この表現のために:
A - (B - c)
以下のAST:
-
/ \
A -
/ \
B C
括弧を含む以前の式を正しく生成する必要がありますが、2番目の演算子が追加演算子である場合(たとえば)、括弧は不要です。読みやすさを向上させるために、必要に応じて使用することをお勧めします。
この種の動作を決定するルールと、括弧を使用するタイミングを知る方法はありますか。プラスとマイナスは、ほとんどの言語で同じレベルの優先順位を持っているので、すべてのオペレーターにこれを機能させたいと思います。
解決
歴史的に、彼らはこれを「きれいな印刷」と呼んでいます。それに加えて「優先順位」をグーグルで検索すると、あなたを助けるためのいくつかの例を見つけるかもしれません。
非公式には、基本的なアイデアは、サブエクスペッションに再発すると、その優先順位を現在の式と比較することです。低い場合は、括弧が必要です。そうでなければ、あなたはしません。同様のチェックを実行することで連想性を処理できます。 同じ 親としての優先順位は、関連性に応じて間違った側にある場合、括弧が必要です。
他のヒント
ツリーの優先順位が高い操作が低い場合は、括弧内に入れる必要はありません。
ただし、操作の優先順位を知るだけでは十分ではありません。あなたも知る必要があります 関連性 操作の。平等な優先順位の操作を適切にグループ化できます。たとえば、減算は連想的に残されているので、そう A-B-C
に等しい (A-B)-C
, 、しかしそうではありません A-(B-C)
.
すべての操作の優先順位と関連性の表全体を書き留めて、表現を生成するときにそれを参照してください。