%{
#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.