課題 3(または課題 5)で作成したパーサを拡張して構文木を生成するようにし, 生成した構文木を次のように表示するプログラム(基本構造は先順の木の走査を行なうプログラム)を作成せよ.
そして構文木が正しく生成されていることを,特に優先順位と結合性について確認せよ.
また,課題 3 で示した expressionの生成規則から,演算子の優先順位と結合性を反映した構文木が作成できる理由を説明せよ.
% cat test1.tc
int gcd(int a, int b)
{
if (a == b) return a;
else if (a > b) return gcd(a-b, b);
else return gcd(a, b-a);
}
% ./tcc < test1.tc
((int gcd) ((int a)(int b))
(
(IF (== a b)
(RETURN a)
(IF (> a b)
(RETURN (FCALL gcd (- a b) b))
(RETURN (FCALL gcd a (- b a)))
)
)
))
[注意] この表示例はあくまでも一例であり,このスタイルに従う必要はない.
インデントや改行などの工夫も必須ではない.
ただし,構文木が正しく生成されていることを正確に確認できるような表示方法にしなければならない.