Estou escrevendo um compilador C que segue esse padrão e se eu analisar declarações como esta:
int i;
(i) = 1;
meu compilador relatará um erro que indica que (i)
é um rvalue e não deve ser atribuído.
Eu verifiquei o código e as regras e descobri o seguinte: na atribuição semântica da expressão:
Um operador de atribuição deve ter um valor modificável como seu operando esquerdo.
Uma expressão de atribuição possui o valor do operando esquerdo após a atribuição, mas não é um valor l.
No meu caso, existem duas expressões de atribuição:
(i) = 1
e i
entre parênteses. Portanto, (i)
deve ser um rvalor.
Então, minha pergunta é: é
(i) = 1
ilegal neste padrão C?
i
entre parênteses não é uma expressão de atribuição. Expressão de atribuição não significa "expressão envolvida em uma atribuição" ou qualquer outra coisa em (i)
que se qualifique. Expressões de atribuição são atribuições .
i
é uma expressão de atribuição, a árvore AST é EXPRESSION-> ASSIGNMENT_EXPRESSION-> CONDITIONAL_EXPRESSION-> LOGICAL_OR_EXPRESSION-> CAST_EXPRESSION-> UNARY_EXPRESSION-> POSTFIX_EXPRESSION-> PRIMARY_EXPRESSION-> IDENTIFIER
assignment-expression
gramática não-terminal não é a mesma coisa que uma expressão de atribuição. Grosso modo, an assignment-expression
é uma expressão de atribuição ou qualquer coisa com maior precedência.