There are some packages out there that can produce so called Railroad diagrams.
Phillips has a package called Elegant (you can see some examples in this document)
Then there is LaTeX-style rail.sty online, where the results are quite ok as well (the png image is scaled to 600pt in width, so the real quality is better) :
So, how does one read the diagram? For the start form left to right :-) Words in rounded boxes are terminals (i.e. words that you put literally in your code) Words in normal boxes are non-terminals that refer to other diagrams. A construct like in the start with "AVG", "MAX", ... is a switch statement, where you can choose one ot the options. You will see that above "DISTINCT" is a line without a box. This means that "DISTINCT" is optional.
And this is basically all about reading those diagrams.
Unfortunately, this package does not directly know about the 'ususal' EBNF syntax ( AggreagateExpression ::= ....), but uses its own, which looks like the following for the above example
AggregateExpression : ("AVG" |"MAX" |"MIN" |"SUM")
'DISTINCT' ? StateFieldPathExpression
) | 'COUNT'
'DISTINCT' ? IdentificationVariable
Perhaps I am going to write some translator between the formats in Perl ...