К нетерминальным символам или лексемам обращаются по именам. Yacc требует непосредственного объявления имен лексем. В дополнение, по причинам, объясняемым ниже, часто желательно включение лексического анализатора как части файла спецификации. Может оказаться полезным и включения ряда других программ. Таким образом, любой файл спецификации состоит из трех частей: объявлений, правил и программ. Части (или разделы) разделяются двойным знаком процента (%%). (Символ процента часто применяется в спецификациях в виде специального символа.)
Другими словами, полная спецификация может быть записана следующим образом:

объявления
%%
правила
%%
программы

Раздел объявлений может быть пустым. Более того, если опускается раздел программ, то второй разделитель %% можно не указывать. Тогда минимальная спецификация выглядит как

%%
правила

Пробелы, табуляции и переводы строк игнорируются. Они также не могут появляться в именах или многолитерных зарезервированных символах. Комментарии могут появляться в любой позиции имени, их синтаксис совпадает с синтаксисом комментариев в С.
Раздел правил состоит из одного или более грамматических правил. Грамматическое правило записывается в формате

A : BODY ;

A представлет собой нетерминальное имя, BODY -последовательность имен и литералов (возможно пустую).
Имена могут быть произвольной длины и составляются из букв, точки, подчеркивания и цифр. Цифры в начале имени не допускаются. Прописные и строчные буквы считаются различными. Имена, используемые в теле грамматического правила, могут являться как лексемами, так и нетерминальными символами.
Литерал представляет собой символ, заключенный в апострофы. Так же, как и в С, обратная дробная черта служит механизмом экранирования внутри литералов, распознаются все специальные последовательности языка С:

\n     Перевод строки
\r     Возврат каретки
\'     Апостроф
\      Обратная дробная черта
\t     Табуляция
\b     Шаг назад
\f     Перевод формата
\xxx   Восьмеричное число xxx

По ряду причин символ NUL (ПУС, \0 или 0) никогда не должен использоваться в грамматических правилах. Если у нескольких правил одинаковая левая часть, во избежание ее повторения может применяться символ |. Точка с запятой в конце правила перед вертикальной чертой может опускаться. Таким образом, следующие правила:

A:B C D;
A:E F ;
A:G ;

могут быть записаны как

A:B C D;
|E F
|G
;

Хотя и необязательно, чтобы все правила с одинаковой левой частью находились рядом, это делает спецификации более читаемыми и облегчает внесение изменений. Если нетерминальный символ соответствует пустой строке, можно записать следующую конструкцию:

empty:;

Имена, представляющие лексемы, должны объявляться явно. Это можно сделать в разделе объявлений:

%token name1 name2 ...

(Более подробно это описано в разделах 3, 5 и 6 этой главы.) Каждый нетерминальный символ должен появиться в левой части хотя бы одного правила. Из всех нетерминальных символов один, называемый начальным, играет особую роль. Анализатор строится так, чтобы распознавать начальный символ; таким образом, он должен описывать самую большую, наиболее общую структуру, представляемую грамматическими правилами. По умолчанию, начальным символом считается левая часть первого грамматического правила в разделе правил. Возможно и желательно явно объявить начальный символ в разделе объявлений с помощью ключевого слова %start:

%start symbol

Конец ввода анализатора отмечается специальной лексемой, называемой конечным маркером. Если лексемы вплоть до конечного маркера (но не включая его) образуют структуру, удовлетворяющую определению начального символа, функция анализатора возвращает управление вызывающей программе. Если конечный маркер распознается в другом контексте, это считается ошибкой. Возврат конечного маркера - задача разрабатываемой пользователем функции лексического анализа; об этом подробно изложено в разделе 3. Обычно конечный маркер соответствует некоторому очевидному состоянию ввода-вывода: концу файла или концу записи.