1*8734Ssam %{ 2*8734Ssam #ifndef lint 3*8734Ssam static char sccsid[] = "@(#)parse.y 4.1 (Berkeley) 10/20/82"; 4*8734Ssam #endif 5*8734Ssam 6*8734Ssam #include "htable.h" 7*8734Ssam %} 8*8734Ssam 9*8734Ssam %union { 10*8734Ssam int number; 11*8734Ssam struct addr *addrlist; 12*8734Ssam struct name *namelist; 13*8734Ssam } 14*8734Ssam %start Table 15*8734Ssam 16*8734Ssam %token END 17*8734Ssam %token <number> NUMBER KEYWORD 18*8734Ssam %token <namelist> NAME 19*8734Ssam 20*8734Ssam %type <namelist> Names Cputype Opsys Protos Proto 21*8734Ssam %type <addrlist> Addresses Address 22*8734Ssam %% 23*8734Ssam Table : Entry 24*8734Ssam | Table Entry 25*8734Ssam ; 26*8734Ssam 27*8734Ssam Entry : KEYWORD ':' Addresses ':' Names ':' END 28*8734Ssam = { 29*8734Ssam do_entry($1, $3, $5, NONAME, NONAME, NONAME); 30*8734Ssam } 31*8734Ssam | KEYWORD ':' Addresses ':' Names ':' Cputype ':' END 32*8734Ssam = { 33*8734Ssam do_entry($1, $3, $5, $7, NONAME, NONAME); 34*8734Ssam } 35*8734Ssam | KEYWORD ':' Addresses ':' Names ':' Cputype ':' Opsys ':' END 36*8734Ssam = { 37*8734Ssam do_entry($1, $3, $5, $7, $9, NONAME); 38*8734Ssam } 39*8734Ssam | KEYWORD ':' Addresses ':' Names ':' Cputype ':' Opsys ':' ':' END 40*8734Ssam = { 41*8734Ssam do_entry($1, $3, $5, $7, $9, NONAME); 42*8734Ssam } 43*8734Ssam | KEYWORD ':' Addresses ':' Names ':' Cputype ':' Opsys ':' Protos ':' END 44*8734Ssam = { 45*8734Ssam do_entry($1, $3, $5, $7, $9, $11); 46*8734Ssam } 47*8734Ssam | error END 48*8734Ssam | END /* blank line */ 49*8734Ssam ; 50*8734Ssam 51*8734Ssam Addresses: Address 52*8734Ssam = { 53*8734Ssam $$ = $1; 54*8734Ssam } 55*8734Ssam | Address ',' Addresses 56*8734Ssam = { 57*8734Ssam $1->addr_link = $3; 58*8734Ssam $$ = $1; 59*8734Ssam } 60*8734Ssam ; 61*8734Ssam 62*8734Ssam Address : NUMBER '.' NUMBER '.' NUMBER '.' NUMBER 63*8734Ssam = { 64*8734Ssam $$ = alloc_addr(); 65*8734Ssam $$->addr_val = ($1) | ($3 << 8) | ($5 << 16) | ($7 << 24); 66*8734Ssam $$->addr_link = NOADDR; 67*8734Ssam } 68*8734Ssam ; 69*8734Ssam 70*8734Ssam Names : NAME 71*8734Ssam = { 72*8734Ssam $$ = $1; 73*8734Ssam } 74*8734Ssam | NAME ',' Names 75*8734Ssam = { 76*8734Ssam $1->name_link = $3; 77*8734Ssam $$ = $1; 78*8734Ssam } 79*8734Ssam ; 80*8734Ssam 81*8734Ssam Cputype : /* empty */ 82*8734Ssam = { 83*8734Ssam $$ = NONAME; 84*8734Ssam } 85*8734Ssam | NAME 86*8734Ssam = { 87*8734Ssam $$ = $1; 88*8734Ssam } 89*8734Ssam ; 90*8734Ssam 91*8734Ssam Opsys : /* empty */ 92*8734Ssam = { 93*8734Ssam $$ = NONAME; 94*8734Ssam } 95*8734Ssam | NAME 96*8734Ssam = { 97*8734Ssam $$ = $1; 98*8734Ssam } 99*8734Ssam ; 100*8734Ssam 101*8734Ssam Protos : Proto 102*8734Ssam = { 103*8734Ssam $$ = $1; 104*8734Ssam } 105*8734Ssam | Proto ',' Protos 106*8734Ssam = { 107*8734Ssam $1->name_link = $3; 108*8734Ssam $$ = $1; 109*8734Ssam } 110*8734Ssam ; 111*8734Ssam 112*8734Ssam Proto : NAME 113*8734Ssam = { 114*8734Ssam $$ = $1; 115*8734Ssam } 116*8734Ssam ; 117*8734Ssam %% 118*8734Ssam 119*8734Ssam #include <stdio.h> 120*8734Ssam 121*8734Ssam extern int yylineno; 122*8734Ssam 123*8734Ssam yyerror(msg) 124*8734Ssam char *msg; 125*8734Ssam { 126*8734Ssam fprintf(stderr, "\"%s\", line %d: %s\n", infile, yylineno, msg); 127*8734Ssam } 128