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