我正在阅读一本名为 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 语言中是不可能的。上面的语法列表是否有问题,或者我以错误的方式产生这个表达式?