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

%%
printf("0)\t");          /* Нумерация начальной строки */
\n       {               /* Правило нумерации входных строк */
          static int number = 0;       /* Номер строки */
          putchar('\n');
          printf("%d)\t", ++number);
         }

В этом примере первое правило без регулярного выражения нумерует начальную строку входного потока нулем. Блок действий второго правила обеспечивает последнюю нумерацию всех последующих строк, входного потока. Номер очередной входной строки устанавливается по значению целочисленной статической переменной number, которая определена в блоке действий и инициализирована нулем. Ее значение увеличивается на 1 после ввода каждой очередной строки. Отображение номеров строк обеспечивает вызов библиотечной функции printf системы программирования C.