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