私は本 namad A Retargetable C Compiler: Design and Implementation を読んでいます。この本では、C 言語の文法は次のように規定されています。
expression:
assignment-expression { , assignment-expression }
assignment-expression:
conditional-expression
unary-expression assign-operator assignment-expression
assign-operator:
one of= += -= *= /= %= <<= >>= &= A= I=
conditional-expression:
binary-expression [ ? expression : conditional-expression ]
binary-expression:
unary-expression { binary-operator unary-expression }
binary-operator:
one of || && '|' A & == ! = < > <= >= << >> + - * | %
unary-expression:
postfix-expression
unary-opera tor unary-expression
'(' type-name ')' unary-expression
sizeof unary-expression
sizeof '(' type-name ')'
unary-operator:
one of ++ -- & * + - - !
postfix-expression:
primary-expression { postfix-operator }
postfix-operator:
'[' expression ']'
'(' [ assignment-expression { , assignment-expression } ] ')'
. identifier
-> identifier
++
--
primary-expression:
identifier
constant
string-literal
'(' expression ')'
私が観察したことについて質問があります:
expression:
assignment-expression
に入れunary-expression assign-operator assignment-expression
ましたassignment-expression
。
"sizeof '(' type-name ')'"
単項式を選択します。
次に"="
、代入演算子を選択します。
次に"conditional-expression"
、代入式を選択しました。
次に、次のように導出します。
conditional-expression -> binary-expression -> unary-expression ->postfix-expression -> primary-expression -> identifier
上記のすべての結果として、次のような式を生成できます
"sizeof(int) = 7"
。
しかし、この表現はC言語ではできません。上記の文法リストに問題がありますか、それともこの表現を間違った方法で作成していますか?