>僕が混乱したのは、きっと、1次式の定義に「式」という1次式を含む未定義の
>クラスが登場したと受け止めたからだと思います。
その受け止め方は正解です。そして再帰的定義というのはそういうものです。
ちょうどうちのページにこんな文書がありまして、簡易的な電卓の構文規則を載せています。
http://kmaebashi.com/programmer/devlang/yacclex.html
7: expression /* 「式」とは… */
8: : term /* 「項」、 */
9: | expression ADD term /* または、「式」 + 「項」 */
10: | expression SUB term /* または、「式」 - 「項」 */
11: ;
12: term /* 「項」とは、 */
13: : primary_expression /* 「一次式」、 */
14: | term MUL primary_expression /* または、「項」 * 「一次式」 */
15: | term DIV primary_expression /* または、「項」 / 「一次式」 */
16: ;
17: primary_expression /* 「一次式」とは… */
18: : DOUBLE_LITERAL /* 実数のリテラル */
19: ;
この電卓は括弧が使えないのでprimary_expressionの定義は異なりますが、
この電卓でも、式の定義にはやっぱり式が登場します。
K&Rをお持ちであれば、巻末の構文規則(p.298あたり)でCの式の構文が定義されています。
>式は1次式から構成されるものなのでしょうが、どのように構成されるものをそう言うのか、
>そこでの記述では不明だと思います。定義になっていないのでは。
ポインタ完全制覇における式の定義に関する説明は、
・「式には1次式と呼ばれるものがあります」
・「式に対して演算子を適用したり、演算子でもって式と式をつなぎ合わせたもののことも、
また式と呼びます」
となっています。
Cには関数呼び出し等を含めたくさんの演算子がありますし、sizeof(型)はどうなるのか等、この定義では曖昧すぎるというご意見はあるかと思いますが、この場所でそれを延々と書くのもよろしくないと判断した、のだと思います。ずいぶん前の話なので記憶が曖昧ですが。