Ich schreibe einen C-Compiler, der diesem Standard folgt , und wenn ich Anweisungen wie diese analysiere:
int i;
(i) = 1;
Mein Compiler meldet einen Fehler, der darauf hinweist, dass (i)
es sich um einen Wert handelt, der nicht zuweisbar sein sollte.
Ich habe den Code und die Regeln überprüft und Folgendes festgestellt: In der Semantik des Zuweisungsausdrucks:
Ein Zuweisungsoperator muss einen modifizierbaren Wert als linken Operanden haben.
Ein Zuweisungsausdruck hat den Wert des linken Operanden nach der Zuweisung, ist jedoch kein l-Wert.
In meinem Fall gibt es zwei Zuweisungsausdrücke:
(i) = 1
und i
in Klammern. Das (i)
sollte also ein Wert sein.
Meine Frage lautet also: Ist
(i) = 1
dieser C-Standard illegal?
i
in Klammern steht kein Zuweisungsausdruck. Zuweisungsausdruck bedeutet nicht "Ausdruck, der an einer Zuweisung beteiligt ist" oder irgendetwas anderes, wo (i)
dies qualifiziert wäre. Zuweisungsausdrücke sind Zuweisungen .
i
ist ein Zuweisungsausdruck wird der AST Baum EXPRESSION-> ASSIGNMENT_EXPRESSION-> CONDITIONAL_EXPRESSION-> LOGICAL_OR_EXPRESSION-> CAST_EXPRESSION-> UNARY_EXPRESSION-> POSTFIX_EXPRESSION-> PRIMARY_EXPRESSION-> IDENTIFIER
assignment-expression
Grammatik-Nichtterminal ist nicht dasselbe wie ein Zuweisungsausdruck. In etwa assignment-expression
ist ein Zuweisungsausdruck oder etwas mit höherer Priorität.