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