I'm trying to nail down the difference between concrete and abstract
syntax trees. In my C parser (http://code.google.com/p/pycparser/) I
construct an AST directly from the parser (which uses the yacc-like
PLY Python module), and I'm not sure where the concrete syntax tree is
in that process.

Is this correct to say that if I semi-mechanically translate the BNF
of a language to a yacc grammar, what I'll get from parsing is a
concrete syntax tree? If so, this tree is almost useless for any kind
of interesting interaction (especially for languages like C where some
things like types don't fit hierarchically in a way that resembles the
concrete syntax). Is this right?

Also, do compilers more commonly go through the concrete-syntax stage
or do they usually build the AST directly in the parser?