1 %{ 2 /* $DragonFly: src/libexec/dma/aliases_parse.y,v 1.2 2008/02/03 11:06:17 matthias Exp $ */ 3 4 #include <err.h> 5 #include <string.h> 6 #include "dma.h" 7 8 extern int yylineno; 9 static void yyerror(const char *); 10 int yywrap(void); 11 int yylex(void); 12 13 static void 14 yyerror(const char *msg) 15 { 16 warnx("aliases line %d: %s", yylineno, msg); 17 } 18 19 int 20 yywrap(void) 21 { 22 return (1); 23 } 24 25 %} 26 27 %union { 28 char *ident; 29 struct stritem *strit; 30 struct alias *alias; 31 } 32 33 %token <ident> T_IDENT 34 %token T_ERROR 35 %token T_EOF 0 36 37 %type <strit> dests 38 %type <alias> alias aliases 39 40 %% 41 42 start : aliases T_EOF 43 { 44 LIST_FIRST(&aliases) = $1; 45 } 46 47 aliases : /* EMPTY */ 48 { 49 $$ = NULL; 50 } 51 | alias aliases 52 { 53 if ($2 != NULL && $1 != NULL) 54 LIST_INSERT_AFTER($2, $1, next); 55 else if ($2 == NULL) 56 $2 = $1; 57 $$ = $2; 58 } 59 ; 60 61 alias : T_IDENT ':' dests '\n' 62 { 63 struct alias *al; 64 65 if ($1 == NULL) 66 YYABORT; 67 al = calloc(1, sizeof(*al)); 68 if (al == NULL) 69 YYABORT; 70 al->alias = $1; 71 SLIST_FIRST(&al->dests) = $3; 72 $$ = al; 73 } 74 | error '\n' 75 { 76 yyerrok; 77 $$ = NULL; 78 } 79 ; 80 81 dests : T_IDENT 82 { 83 struct stritem *it; 84 85 if ($1 == NULL) 86 YYABORT; 87 it = calloc(1, sizeof(*it)); 88 if (it == NULL) 89 YYABORT; 90 it->str = $1; 91 $$ = it; 92 } 93 | T_IDENT ',' dests 94 { 95 struct stritem *it; 96 97 if ($1 == NULL) 98 YYABORT; 99 it = calloc(1, sizeof(*it)); 100 if (it == NULL) 101 YYABORT; 102 it->str = $1; 103 SLIST_NEXT(it, next) = $3; 104 $$ = it; 105 } 106 ; 107 108 %% 109