Hi, Fred,

1)

For the C standard, I think you can refer to the C grammar page in the ANTLR
website:
http://www.antlr.org/grammar/1153358328744/C.g

I have checked this ANTRL C grammar file with the C standard PDF file,
for the "assignment_expression" & the "multiplicative_expression",
the productions of the 2 in this 2 files are equivalent.
So I think you can refer to that page for the C standard grammar.

And you will see that the C grammar used by TCC is different from the
standard C grammar, and I don't know why.

I have tried many grammar transformations I know to transform the C standard
grammar to the one TCC used, however, all tries have failed.

It seems that the C standard grammar to break the "assignment_expression" to
many smaller "assignment_expression", but TCC tries to break the
"assignment_expression" to "conditional_expression".

It seems that the C standard grammar to break the
"multiplicative_expression" to many "cast_expression", but TCC tries to
break the "multiplicative_expression" to many "assignment_expression" !!!

2)

The following program you mentioned does be compiled by TCC (however, it is
wrong).
========================
#include <stdio.h>

int
main() {
  int x, y;

  x = 3;
  y = 3 * x = 2;

  printf("x = %d, y = %d\n", x, y);

  return 0;
}
=======================

And the output from the executable is

=======================
x = 2, y = 6
=======================


Wei Hu
http://www.csie.ntu.edu.tw/~r88052/
http://wei-hu-tw.blogspot.com/


2009/9/6 Fred Weigel <[email protected]>

>  Wei
>
> Not looking at the standard right now, but the following is valid:
>
> x = 1, 2, 3; // x gets 3
>
> A test for the second case would be
>
> x = 3;
> y = 3 * x = 2;
>
> This should be an error, because 3 * x is not an lvalue.
>
> Does this compile with tcc? (don't know, the machine I am on doesn't
> have the compiler).
>
>
> On Sat, 2009-09-05 at 01:05 +0800, Wei wrote:
>
> Hi, TCC stackholders,
>
> I am tracing TCC's source codes, and find something I don't understand.
> What I don't understand is about the grammar.
>
> From the C89 or C99 standard:
>
> ======================================================================
> assignment_expression
> : lvalue assignment_operator *assignment_expression*
> | conditional_expression
> ;
> ======================================================================
>
> However, in TCC,
>
> ======================================================================
> static void gexpr(void)
> {
> while (1) {
> *expr_eq();*
> if (tok != ',')
> break;
> vpop();
> next();
> }
> }
> ======================================================================
>
> and expr_eq( ) seems to parse C conditional expression (ie, xxx ? xxx :
> xxx).
> It seems that it doesn't parse codes like "a = b = c = d = 4;".
>
> And in the C standard,
>
> ======================================================================
> multiplicative_expression
> : (*cast_expression*) ('*' *cast_expression* | '/'* cast_expression *| '%'
> *cast_expression*)*
> ;
> ======================================================================
>
> However, in TCC, the function to parse "multiplicative_expression" is
> expr_prod( ):
>
> ======================================================================
> static void expr_prod(void)
> {
> int t;
>
> *uneq();*
> while (tok == '*' || tok == '/' || tok == '%') {
> t = tok;
> next();
> *uneq();*
> gen_op(t);
> }
> }
> ======================================================================
>
> and *uneq( ) *seems to parse the so-call "assignment_expression.", not the
> standard-defined "cast_expression"
>
> Why TCC uses such a grammar? it seems not compatible with the C standard.
>
> Wei.
>
>
>  _______________________________________________Tinycc-devel mailing 
> [email protected]http://lists.nongnu.org/mailman/listinfo/tinycc-devel
>
>
> _______________________________________________
> Tinycc-devel mailing list
> [email protected]
> http://lists.nongnu.org/mailman/listinfo/tinycc-devel
>
>
_______________________________________________
Tinycc-devel mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to