1 %{ 2 #ifndef lint 3 static char sccsid[] = "@(#)parse.y 4.1 (Berkeley) 10/20/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 $$ = alloc_addr(); 65 $$->addr_val = ($1) | ($3 << 8) | ($5 << 16) | ($7 << 24); 66 $$->addr_link = NOADDR; 67 } 68 ; 69 70 Names : NAME 71 = { 72 $$ = $1; 73 } 74 | NAME ',' Names 75 = { 76 $1->name_link = $3; 77 $$ = $1; 78 } 79 ; 80 81 Cputype : /* empty */ 82 = { 83 $$ = NONAME; 84 } 85 | NAME 86 = { 87 $$ = $1; 88 } 89 ; 90 91 Opsys : /* empty */ 92 = { 93 $$ = NONAME; 94 } 95 | NAME 96 = { 97 $$ = $1; 98 } 99 ; 100 101 Protos : Proto 102 = { 103 $$ = $1; 104 } 105 | Proto ',' Protos 106 = { 107 $1->name_link = $3; 108 $$ = $1; 109 } 110 ; 111 112 Proto : NAME 113 = { 114 $$ = $1; 115 } 116 ; 117 %% 118 119 #include <stdio.h> 120 121 extern int yylineno; 122 123 yyerror(msg) 124 char *msg; 125 { 126 fprintf(stderr, "\"%s\", line %d: %s\n", infile, yylineno, msg); 127 } 128