Разве в EBNF знак "|" определяет точную последовательность? Он ведь как оператор ИЛИ.
Фигурные скобочки означают 0 или более повторений.
Таким образом выделенный кусок правила:
DeclSeq =
{ CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}}{ProcDecl ";" | ForwardDecl ";"}.
означает что например валидна следующая последовательность:
TYPE CONST VAR CONST TYPE TYPE CONST
В общем, блоки CONST, TYPE, VAR чередуются в любой последовательности сколь угодно долго. И да, | - означает выбор альтернативы при каждом повторении выделенного куска правила между {}.
Затем, после того как мы откостились, отварились и оттайпились, вступает в игру вторая половина правила:
DeclSeq = { CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}}
{ProcDecl ";" | ForwardDecl ";"}.То есть далее у нас сколь угодно долго и в любом порядке чередуются объявления процедур и forward declaration'ы.
PS. Откровенно говоря, в этом всем нет абсолютно ничего сложного, если конечно немного интересуешься грамматиками. А тот кто не интересуется грамматиками, формальное описание грамматики и не будет читать :-)