我正在读一本书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我把assignment-expression放在了unary-expression assign-operator assignment-expression上。
对于一元表达式,我选择"sizeof '(' type-name ')'"。
然后我选择"="作为赋值操作符。
然后我选择"conditional-expression"作为赋值表达式。
然后我像这样推导:
conditional-expression -> binary-expression -> unary-expression ->postfix-expression -> primary-expression -> identifier
以上所有操作的结果是,我可以生成如下表达式:"sizeof(int) = 7"。
但是这个表达式在C语言中是不可能的。上面的语法列表有问题吗,或者我用错误的方式生成了这个表达式?
发布于 2020-09-28 20:19:28
语法正确并不意味着它在逻辑上是正确的。表达式sizeof(int) = 7在语法上可能是正确的,但它没有多大意义。因此,您的编译器将正确地对语句进行标记和解释,并告诉您error: cannot assign to result of sizeof,而不是溢出error: syntax error。
关于这个主题,您可能会对Annex A.1 Lexical grammar in C11 standard draft感兴趣。
https://stackoverflow.com/questions/64101540
复制相似问题