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