2

私は本 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言語ではできません。上記の文法リストに問題がありますか、それともこの表現を間違った方法で作成していますか?

4

1 に答える 1

2

文法的に正しいからといって、論理的に正しいとは限りません。この表現sizeof(int) = 7は文法的には正しいかもしれませんが、あまり意味がありません。したがって、コンパイラは、こぼれるのではなくerror: syntax error、ステートメントをトークン化して適切に解釈し、通知しますerror: cannot assign to result of sizeof

このトピックについては、C11 標準ドラフトの付録 A.1 字句文法に興味があるかもしれません。

于 2020-09-28T12:19:28.343 に答える