Приводимый ниже пример содержит полную спецификацию простой программы-калькулятора. Калькулятор содержит 26 регистров, называемых буквами от a до z, и воспринимает арифметические выражения, составленные из операций +, -, *, /, % (остаток), & (побитовое И), | (побитовое ИЛИ), = (присваивание). Если операция верхнего уровня есть присваивание, значение не выводится. Как и в Си, числа, начинающиеся с 0, считаются восьмеричными, в противном случае - десятичными. Данный пример спецификации демонстрирует применение предшествования и неоднозначности, простой способ восстановления после ошибки. Существенное упрощение заключается в том, что фаза лексического анализа гораздо проще, чем в большинстве программ, а вывод генерируется построчно. Обратите внимание на способ ввода десятичных и восьмеричных чисел. Такого рода действия лучше делать в лексическом анализаторе.

%{
#include <stdio.h> 
#include <ctype.h>

int regs[26];
int base;
%}

%start list
%token DIGIT LETTER %left '|'
%left '&'
%left '+' '-'
%left '*' '/' '%'
%left UMINUS

%%         /* раздел правил */
list :
          |  list stat '\n'
          |  list error '\n'
              { yyerrok;}
          ;
stat :    expr
              { printf("%d\n", $1); }
          |  LETTER '=' expr
                      { regs[$1] = $3;} ;
expr :    '(' expr ')'
              { $$=$2;}
          |  expr '+' expr
              { $$=$1+$3;}
          |  expr '-' expr
              { $$=$1-$3;}
          |  expr '*' expr
              { $$=$1*$3;}
          |  expr '/' expr
              { $$=$1/$3;}
          |  expr '%' expr
              {$$=$1%$3;}
          |  expr '&' expr
              {$$=$1&$3;}
          |  expr '|' expr     
              {$$=$1|$3;} 
          |  '-'expr%prec UMINUS 
              {$$=-$2;}
          |  LETTER
              {$$=regs[$1];}
          |  number
          ;
number :  DIGIT {$$=$1;base=($1==0)|8:10;}
          | number DIGIT {$$=base*$1+$2;}
          ;
%%         /* начало программы */

yylex() { 

/* Программа лексического анализа возвращает LETTER для строчной буквы, yylval - от 0 до 25, возвращает DIGIT для цифры, yylval -от 0 до 9, все остальные символы возвращаются непосредственно */
int c;

while ((c = getchar()) == ' ') {

   /* пропуск пробелов */
               ;
         if (islower(c)) {
                  yylval = c-'a'; return (LETTER);
         }
         if (isdigit(C)) {
                  yylval = c-'0'; return(DIGIT);
         }
         return(c);
}