%{
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "y.tab.h"
%}
CLASS           class
INTEGER         int
NUM             [0-9]+
iDENTIFIER      [a-z][0-9a-zA-Z]*
IDENTIFIER      [A-Z][0-9a-zA-Z]*
LP              "("
RP              ")"
LB              "{"
RB              "}"
SM              ";"
%%
{CLASS}         {
                        strcpy(yylval.sval, yytext);
                        return TOK_CLASS;
                }
{INTEGER}       {
                        strcpy(yylval.sval, yytext);
                        return TOK_INT;
                }
{iDENTIFIER}    {
                        strcpy(yylval.sval, yytext);
                        return TOK_iD;
                }
{IDENTIFIER}    {
                        strcpy(yylval.sval, yytext);
                        return TOK_ID;
                }
{NUM}           {
                        yylval.ival= atoi(yytext);  
                        return TOK_NUM;
                }
{LP}            {
                        strcpy(yylval.sval, yytext);
                        return TOK_LP;
                }
{RP}            {
                        strcpy(yylval.sval, yytext);
                        return TOK_RP;
                }
{LB}            {
                        strcpy(yylval.sval, yytext);
                        return TOK_LB;
                }
{RB}            { 
                        strcpy(yylval.sval, yytext);
                        return TOK_RB;
                }
{SM}            {
                        strcpy(yylval.sval, yytext);
                        return TOK_SM;
                }
[ \t\n]+          /* eat up whitespace */
.               {
                        printf( "Unrecognized character: %s\n", yytext );
                }
%%
/* The following two definitions are needed under Linux */
int yyerror (char *s) {
printf ("%s\n", s);
}
int main(void) { 
yyparse(); 
}
Observe or recall that
%{
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int att = 0;
char theClass[256];
int yywrap()
{
  return 1;
}
%}
%union{
        int  ival;
        char sval[256];
      };
%token <ival> TOK_NUM
%token <sval> TOK_CLASS TOK_INT TOK_iD TOK_ID TOK_LP TOK_LB TOK_RP TOK_RB TOK_SM
%%
program         :            {printf("Parsing program ... \n"); } 
                  classDecs  
                             {printf(" Program parsed.\n");}
                ;
classDecs       : classDec  classDecs   
                | /* empty word */
                ;
classDec        : TOK_CLASS 
                  TOK_ID
                             {strcpy(theClass, $2);
                              printf("   Parsing class %s ...\n", theClass); 
                              att = 1; } 
                  TOK_LB 
                  attributes 
                  TOK_RB 
                            {printf("   Class parsed.\n"); }
                ;
attributes      :  attribute attributes
                | /* empty word */
                ;
attribute       :            {printf("      Attribute %d of class %s ", 
                                     att, 
                                     theClass) ; } 
                   TOK_INT
                   TOK_iD 
                            {printf("has type %s \n", $2);}
                   TOK_SM 
                             { att++; }
                 |            {printf("      Attribute %d of class %s ", 
                                     att, 
                                     theClass) ; } 
                   TOK_ID
                   TOK_iD 
                            {printf("has type %s \n", $2);}
                   TOK_SM 
                             { att++; }
                 ;
%%
[moreno@iguanodon yacc]$ make mool
------------------------------------------------------------
Building mool in /home/moreno/src/Courses/CS447/yacc/bin
/home/moreno/src/Courses/CS447/yacc/src/mool.l: In function `yyerror':
/home/moreno/src/Courses/CS447/yacc/src/mool.l:74: warning: control reaches end of non-void function
/home/moreno/src/Courses/CS447/yacc/src/mool.l: In function `main':
/home/moreno/src/Courses/CS447/yacc/src/mool.l:77: warning: implicit declaration of function `yyparse'
/home/moreno/src/Courses/CS447/yacc/src/mool.l:78: warning: control reaches end of non-void function
/home/moreno/src/Courses/CS447/yacc/src/mool.l: At top level:
lex.yy.c:1064: warning: `yyunput' defined but not used
y.tab.c: In function `yyparse':
y.tab.c:234: warning: implicit declaration of function `yylex'
y.tab.c:275: warning: implicit declaration of function `yyerror'
------------------------------------------------------------
[moreno@iguanodon yacc]$ more test/p1.mool 
class Pair {
        int left;
        int right;
}
class ThreeByTwo {
        Pair left;
        Pair middle;
        Pair right;
}
[moreno@iguanodon yacc]$ ./bin/mool < ./test/p1.mool 
Parsing program ... 
   Parsing class Pair ...
      Attribute 1 of class Pair has type int 
      Attribute 2 of class Pair has type int 
   Class parsed.
   Parsing class ThreeByTwo ...
      Attribute 1 of class ThreeByTwo has type Pair 
      Attribute 2 of class ThreeByTwo has type Pair 
      Attribute 3 of class ThreeByTwo has type Pair 
   Class parsed.
 Program parsed.