1%{
2/*
3 * Copyright (c) 1998 - 2000 Kungliga Tekniska H�gskolan
4 * (Royal Institute of Technology, Stockholm, Sweden).
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 *
18 * 3. Neither the name of the Institute nor the names of its contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35#include "make_cmds.h"
36RCSID("$Id: parse.y 21745 2007-07-31 16:11:25Z lha $");
37
38static void yyerror (char *s);
39
40struct string_list* append_string(struct string_list*, char*);
41void free_string_list(struct string_list *list);
42unsigned string_to_flag(const char *);
43
44/* This is for bison */
45
46#if !defined(alloca) && !defined(HAVE_ALLOCA)
47#define alloca(x) malloc(x)
48#endif
49
50%}
51
52%union {
53  char *string;
54  unsigned number;
55  struct string_list *list;
56}
57
58%token TABLE REQUEST UNKNOWN UNIMPLEMENTED END
59%token <string> STRING
60%type <number> flag flags
61%type <list> aliases
62
63%%
64
65file		: /* */
66		| statements
67		;
68
69statements	: statement
70		| statements statement
71		;
72
73statement	: TABLE STRING ';'
74		{
75		    table_name = $2;
76		}
77		| REQUEST STRING ',' STRING ',' aliases ',' '(' flags ')' ';'
78		{
79		    add_command($2, $4, $6, $9);
80		}
81		| REQUEST STRING ',' STRING ',' aliases ';'
82		{
83		    add_command($2, $4, $6, 0);
84		}
85		| UNIMPLEMENTED STRING ',' STRING ',' aliases ';'
86		{
87		    free($2);
88		    free($4);
89		    free_string_list($6);
90		}
91		| UNKNOWN aliases ';'
92		{
93		    free_string_list($2);
94		}
95		| END ';'
96		{
97		    YYACCEPT;
98		}
99		;
100
101aliases		: STRING
102		{
103		    $$ = append_string(NULL, $1);
104		}
105		| aliases ',' STRING
106		{
107		    $$ = append_string($1, $3);
108		}
109		;
110
111flags		: flag
112		{
113		    $$ = $1;
114		}
115		| flags ',' flag
116		{
117		    $$ = $1 | $3;
118		}
119		;
120flag		: STRING
121		{
122		    $$ = string_to_flag($1);
123		    free($1);
124		}
125		;
126
127
128
129%%
130
131static void
132yyerror (char *s)
133{
134    error_message ("%s\n", s);
135}
136
137struct string_list*
138append_string(struct string_list *list, char *str)
139{
140    struct string_list *sl = malloc(sizeof(*sl));
141    if (sl == NULL)
142	return sl;
143    sl->string = str;
144    sl->next = NULL;
145    if(list) {
146	*list->tail = sl;
147	list->tail = &sl->next;
148	return list;
149    }
150    sl->tail = &sl->next;
151    return sl;
152}
153
154void
155free_string_list(struct string_list *list)
156{
157    while(list) {
158	struct string_list *sl = list->next;
159	free(list->string);
160	free(list);
161	list = sl;
162    }
163}
164
165unsigned
166string_to_flag(const char *string)
167{
168    return 0;
169}
170