%{ /* * * IRBOX, an Ivy driver for infra-red remote controls * * Copyright 1998-1999 * Centre d'Etudes de la Navigation Aerienne * * This is the grammar for reading tables * * $Id$ * */ extern const char* const ResWords; #include #include #include #include "irtable.h" extern int yyparse (); extern int yylex (); extern int LineNo; static char id_buf [1024]; /* Yeech */ static char id_list_buf [4096]; /* Barf */ static const char* filename = 0; static IrTable* cur_table; %} %union { const char *name; int integer; } %token Y_NAME Y_TYPE Y_BRAND Y_EOL %token Y_ID Y_STRING %token Y_INT %type id id_list %% instr_list: /* empty */ | instr_list instr ; id: Y_ID { strcpy (id_buf, $1); free ((char*) $1); /* was allocated by strdup in lex file */ $$ = id_buf; } | Y_INT { sprintf (id_buf, "%d", $1); $$ = id_buf; } ; id_list: id { strcpy (id_list_buf, $1); $$ = $1; } | id_list id { strcat (id_list_buf, " "); strcat (id_list_buf, $2); $$ = id_list_buf; } ; instr: Y_EOL | Y_NAME Y_ID Y_EOL { IrTableName (cur_table, $2); } | Y_TYPE ':' Y_ID Y_EOL { IrTableType (cur_table, $3); } | Y_BRAND ':' id_list Y_EOL { IrTableAddBrand (cur_table, $3); } | id_list ':' Y_INT Y_INT Y_INT Y_INT Y_INT Y_INT Y_EOL { IrTableAddKey (cur_table, $1, $3, $4, $5, $6, $7, $8); } ; %% #include int _DoTee = 0; int tee (int x) { if (_DoTee) { char *s; switch (x) { case ':': s = ":"; break; case Y_EOL: s = "Y_EOL\n"; break; case Y_STRING: s = "STRING"; break; case Y_INT: s = "INT"; break; case Y_ID: s = "ID"; break; case Y_TYPE: s = "TYPE"; break; case Y_BRAND: s = "BRAND"; break; /* case Y_: s = ""; break; */ default : s = "???"; break; } printf ("%s ", s); } return x; } int yyerror (const char *s) { fprintf (stderr, "%s in %s, line %d\n", s, filename, LineNo); return (0); } int yywrap () { return 1; } IrTable* IrTableReadFile (const char* file) { extern void LexInit (); extern FILE *yyin; int result; LexInit (); filename = file; if (!(yyin = fopen (file,"r"))) { char err [1024]; fprintf (stderr, "Cannot open %s\n", file); return 0; } cur_table = IrCreateTable (); if (yyparse ()) { result = 0; } fclose (yyin); return cur_table; }