Liste des Groupes | Revenir à cl c |
On 31/08/2024 23:31, Keith Thompson wrote:Bart <bc@freeuk.com> writes:>
[...]Given this:[...]
>
x + y = z;
(x + y) = z;
>
My compiler produces the same AST for the LHS of '=' in both cases.
If that's the case (and I don't doubt that it is), then your
compiler is
not following the grammar specified by the ISO C standard. Since
`x + y` is not a unary-expression, `x + y = z` is not a syntactically
valid assignment expression.
Yet no compiler out of the dozen I tried reported a syntax error
(except SDCC).
>
So what AST is produced by gcc, if any?
Most compilers, including mine, complain that an lvalue is expected.
A parser that strictly follows the ISO C grammar would reject>
(diagnose, flag, whatever) `x + y = z;` just as it would reject `x = y +;`.
Which one does that (apart from SDCC)?
This is an observation, not a complaint. It doesn't imply that your>
compiler is non-conforming or buggy. A parser that doesn't strictly
follow the ISO C grammar could still be part of a conforming compiler.
I can also say that the C grammar is buggy:
>
assignment-expression:
conditional-expression
unary-expression asssignment-operator assignment-expression
>
When attempting to parse an assignment-expression, do you go for a
conditional-expression or unary-expression?
>
The latter is a subset of the former. If you go for a
conditional-expression and find that an assignment-operator follows,
now you have to perform some analysis on the LHS to see if that
conditional-expression contains only a unary-expression.
>
However, if it's not a unary-expression, it will fail for other reasons
anyway, because all those other things that a conditional-expression
will be, can't be lvalues.
>
That also applies to many unary-expressions, such as 42, or a++; those
can't be lvalues either, even though the syntax is valid.
>
So it makes sense to do only an lvalue test.
Les messages affichés proviennent d'usenet.