Below there is the input file for Bison, to generate the parser which parses Osiris datafile in Controller module to load up stored logic.
The generated parser cooperates with the scanner described in Appendix E.
%{
/* C declarations */
#include <gtk/gtk.h>
#include <glib.h>
#include "../opensave.h"
/* verbose error reporting */
#define YYERROR_VERBOSE
/* global variables */
extern FILE *yyin;
extern GList *yylist;
%}
/* bison declarations */
%union{
gint integer;
gint32 int32;
gchar *string;
graph_object *obj;
enum type_of_object type;
GList *list;
}
/* terminals */
%token <string> STRING
%token <integer> INTEGER
%token PREAMBLE "<?xml version=\"1.0\"?>"
%token OSIRISB "<osiris>"
%token OSIRISE "</osiris>"
%token PROJECTB "<project>"
%token PROJECTE "</project>"
%token OUTPUTFNB "<outputfn>"
%token OUTPUTFNE "</outputfn>"
%token VALIDATORB "<validator>"
%token VALIDATORE "</validator>"
%token GENERATORB "<generator>"
%token GENERATORE "</generator>"
%token LAUNCHERB "<launcher>"
%token LAUNCHERE "</launcher>"
%token OBJECTB "<object>"
%token OBJECTE "</object>"
%token IDB "<id>"
%token IDE "</id>"
%token XB "<x>"
%token XE "</x>"
%token YB "<y>"
%token YE "</y>"
%token WIDTHB "<width>"
%token WIDTHE "</width>"
%token HEIGHTB "<height>"
%token HEIGHTE "</height>"
%token TYPEB "<type>"
%token TYPEE "</type>"
%token COLSB "<cols>"
%token COLSE "</cols>"
%token ROWSB "<rows>"
%token ROWSE "</rows>"
%token TABLEB "<table>"
%token TABLEE "</table>"
%token CONNECTIONB "<connection>"
%token CONNECTIONE "</connection>"
%token LASTIDB "<lastid>"
%token LASTIDE "</lastid>"
/* non terminals */
%type <int32> id
%type <integer> x
%type <integer> y
%type <integer> width
%type <integer> height
%type <integer> cols
%type <integer> rows
%type <list> table
%type <obj> object
%type <type> type
%type <list> connection
%type <string> output_filename
%type <string> validator_fn
%type <string> generator_fn
%type <string> launcher_fn
%type <string> table_contents
%type <obj> connection_contents
%type <int32> lastid
%%
/* grammar rules */
preamble: PREAMBLE OSIRISB body OSIRISE
;
body: project
| body object
;
project: PROJECTB
output_filename
validator_fn
generator_fn
launcher_fn
lastid
PROJECTE
{
output_filename=$2;
validator_fn=$3;
generator_fn=$4;
launcher_fn=$5;
last_ID=$6;
}
;
lastid: LASTIDB INTEGER LASTIDE {$$=$2;}
output_filename: OUTPUTFNB
STRING
OUTPUTFNE {$$=g_strdup($2);}
;
validator_fn: VALIDATORB
STRING
VALIDATORE {$$=g_strdup($2);}
;
generator_fn: GENERATORB
STRING
GENERATORE {$$=g_strdup($2);}
;
launcher_fn: LAUNCHERB
STRING
LAUNCHERE {$$=g_strdup($2);}
;
object: OBJECTB
id
x
y
width
height
type
cols
rows
table
connection
OBJECTE
{$$=restore_object($2,$3,$4,$5,$6,$7,$8,$9,$10,$11);}
;
id: IDB INTEGER IDE {$$=$2;}
;
x: XB INTEGER XE {$$=$2;}
;
y: YB INTEGER YE {$$=$2;}
;
width: WIDTHB INTEGER WIDTHE {$$=$2;}
;
height: HEIGHTB INTEGER HEIGHTE {$$=$2;}
;
type: TYPEB STRING TYPEE
{$$=(strcmp($2,"action")==0?ACTION:ATTRIBUTE);}
;
cols: COLSB
INTEGER
COLSE {$$=$2;}
;
rows: ROWSB
INTEGER
ROWSE {$$=$2;}
;
table: TABLEB table_contents TABLEE
{$$=g_list_append(NULL,$2);}
| table TABLEB table_contents TABLEE
{$$=g_list_append($1,$3);}
;
table_contents: {$$=NULL;}
| STRING {$$=g_strdup($1);}
| INTEGER {$$=g_strdup_printf("%d",$1);}
;
connection: CONNECTIONB connection_contents CONNECTIONE
{$$=g_list_append(NULL,NULL);
$$=g_list_append($$,$2);}
| connection CONNECTIONB connection_contents CONNECTIONE
{$$=g_list_append($1,$3);}
;
connection_contents: {$$=NULL;}
| object {$$=$1;}
;
%%
/* additional C code */