parser.y revision 706f2543
1/* $XFree86$ */
2/*
3 * Copyright 2002-2003 Red Hat Inc., Durham, North Carolina.
4 *
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining
8 * a copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation on the rights to use, copy, modify, merge,
11 * publish, distribute, sublicense, and/or sell copies of the Software,
12 * and to permit persons to whom the Software is furnished to do so,
13 * subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial
17 * portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
23 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
24 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
29/*
30 * Authors:
31 *   Rickard E. (Rik) Faith <faith@redhat.com>
32 *
33 */
34
35%{
36#ifdef HAVE_DMX_CONFIG_H
37#include <dmx-config.h>
38#endif
39
40#include "dmxparse.h"
41#include <string.h>
42#include <stdlib.h>
43#define YYDEBUG 1
44#define YYERROR_VERBOSE
45#define YY_USE_PROTOS
46
47DMXConfigEntryPtr dmxConfigEntry = NULL;
48#define APPEND(type, h, t)                 \
49{                                          \
50    type pt;                               \
51    for (pt = h; pt->next; pt = pt->next); \
52    pt->next = t;                          \
53}
54%}
55
56%union {
57    DMXConfigTokenPtr      token;
58    DMXConfigStringPtr     string;
59    DMXConfigNumberPtr     number;
60    DMXConfigPairPtr       pair;
61    DMXConfigFullDimPtr    fdim;
62    DMXConfigPartDimPtr    pdim;
63    DMXConfigDisplayPtr    display;
64    DMXConfigWallPtr       wall;
65    DMXConfigOptionPtr     option;
66    DMXConfigParamPtr      param;
67    DMXConfigCommentPtr    comment;
68    DMXConfigSubPtr        subentry;
69    DMXConfigVirtualPtr    virtual;
70    DMXConfigEntryPtr      entry;
71}
72
73				/* Terminals */
74%token <token>   '{' '}' ';' '/' T_VIRTUAL T_DISPLAY T_WALL T_OPTION T_PARAM
75%token <string>  T_STRING
76%token <pair>    T_DIMENSION T_OFFSET T_ORIGIN
77%token <comment> T_COMMENT T_LINE_COMMENT
78
79                                /* Non-termials */
80%type  <token>    Display Wall Terminal Open Close
81%type  <string>   NameList Name
82%type  <pair>     Dimension Offset Origin
83%type  <pdim>     PartialDim
84%type  <fdim>     FullDim
85%type  <display>  DisplayEntry
86%type  <option>   OptionEntry
87%type  <param>    ParamEntry ParamList Param
88%type  <subentry> SubList Sub
89%type  <wall>     WallEntry
90%type  <virtual>  Virtual
91%type  <entry>    Program EntryList Entry
92
93%%
94
95Program : EntryList { dmxConfigEntry = $1; }
96        ;
97
98EntryList : Entry
99          | EntryList Entry { APPEND(DMXConfigEntryPtr,$1,$2); $$ = $1; }
100          ;
101
102Entry : Virtual        { $$ = dmxConfigEntryVirtual($1); }
103      | T_LINE_COMMENT { $$ = dmxConfigEntryComment($1); }
104      ;
105
106Virtual : T_VIRTUAL Open SubList Close
107          { $$ = dmxConfigCreateVirtual($1, NULL, NULL, $2, $3, $4); }
108        | T_VIRTUAL Dimension Open SubList Close
109          { $$ = dmxConfigCreateVirtual($1, NULL, $2, $3, $4, $5); }
110        | T_VIRTUAL Name Open SubList Close
111          { $$ = dmxConfigCreateVirtual($1, $2, NULL, $3, $4, $5); }
112        | T_VIRTUAL Name Dimension Open SubList Close
113          { $$ = dmxConfigCreateVirtual($1, $2, $3, $4, $5, $6 ); }
114        ;
115
116SubList : Sub
117        | SubList Sub { APPEND(DMXConfigSubPtr,$1,$2); $$ = $1; }
118        ;
119
120Sub : T_LINE_COMMENT { $$ = dmxConfigSubComment($1); }
121    | DisplayEntry   { $$ = dmxConfigSubDisplay($1); }
122    | WallEntry      { $$ = dmxConfigSubWall($1); }
123    | OptionEntry    { $$ = dmxConfigSubOption($1); }
124    | ParamEntry     { $$ = dmxConfigSubParam($1); }
125    ;
126
127OptionEntry : T_OPTION NameList Terminal
128              { $$ = dmxConfigCreateOption($1, $2, $3); }
129            ;
130
131ParamEntry : T_PARAM NameList Terminal
132             { $$ = dmxConfigCreateParam($1, NULL, $2, NULL, $3); }
133           | T_PARAM Open ParamList Close
134             { $$ = dmxConfigCreateParam($1, $2, NULL, $4, NULL);
135               $$->next = $3;
136             }
137           ;
138
139ParamList : Param
140          | ParamList Param { APPEND(DMXConfigParamPtr,$1,$2); $$ = $1; }
141          ;
142
143Param : NameList Terminal
144        { $$ = dmxConfigCreateParam(NULL, NULL, $1, NULL, $2); }
145      ;
146
147PartialDim : Dimension Offset
148             { $$ = dmxConfigCreatePartDim($1, $2); }
149           | Dimension
150             { $$ = dmxConfigCreatePartDim($1, NULL); }
151           | Offset
152             { $$ = dmxConfigCreatePartDim(NULL, $1); }
153           ;
154
155FullDim : PartialDim '/' PartialDim
156          { $$ = dmxConfigCreateFullDim($1, $3); }
157        | '/' PartialDim
158          { $$ = dmxConfigCreateFullDim(NULL, $2); }
159        | PartialDim
160          { $$ = dmxConfigCreateFullDim($1, NULL); }
161        ;
162
163DisplayEntry : Display Name FullDim Origin Terminal
164               { $$ = dmxConfigCreateDisplay($1, $2, $3, $4, $5); }
165             | Display FullDim Origin Terminal
166               { $$ = dmxConfigCreateDisplay($1, NULL, $2, $3, $4); }
167             | Display Name Origin Terminal
168               { $$ = dmxConfigCreateDisplay($1, $2, NULL, $3, $4); }
169
170             | Display Name FullDim Terminal
171               { $$ = dmxConfigCreateDisplay($1, $2, $3, NULL, $4); }
172             | Display FullDim Terminal
173               { $$ = dmxConfigCreateDisplay($1, NULL, $2, NULL, $3); }
174             | Display Name Terminal
175               { $$ = dmxConfigCreateDisplay($1, $2, NULL, NULL, $3); }
176             | Display Terminal
177               { $$ = dmxConfigCreateDisplay($1, NULL, NULL, NULL, $2); }
178             ;
179
180WallEntry : Wall Dimension Dimension NameList Terminal
181            { $$ = dmxConfigCreateWall($1, $2, $3, $4, $5); }
182          | Wall Dimension NameList Terminal
183            { $$ = dmxConfigCreateWall($1, $2, NULL, $3, $4); }
184          | Wall NameList Terminal
185            { $$ = dmxConfigCreateWall($1, NULL, NULL, $2, $3); }
186          ;
187
188Display : T_DISPLAY
189        | T_DISPLAY T_COMMENT { $$ = $1; $$->comment = $2->comment; }
190        ;
191
192Name : T_STRING
193     | T_STRING T_COMMENT { $$ = $1; $$->comment = $2->comment; }
194     ;
195
196Dimension : T_DIMENSION
197          | T_DIMENSION T_COMMENT { $$ = $1; $$->comment = $2->comment; }
198          ;
199
200Offset : T_OFFSET
201       | T_OFFSET T_COMMENT { $$ = $1; $$->comment = $2->comment; }
202       ;
203
204Origin : T_ORIGIN
205       | T_ORIGIN T_COMMENT { $$ = $1; $$->comment = $2->comment; }
206       ;
207
208Terminal : ';'
209         | ';' T_COMMENT { $$ = $1; $$->comment = $2->comment; }
210         ;
211
212Open : '{'
213     | '{' T_COMMENT { $$ = $1; $$->comment = $2->comment; }
214     ;
215
216Close : '}'
217      | '}' T_COMMENT { $$ = $1; $$->comment = $2->comment; }
218      ;
219
220Wall : T_WALL
221     | T_WALL T_COMMENT { $$ = $1; $$->comment = $2->comment; }
222     ;
223
224NameList : Name
225         | NameList Name { APPEND(DMXConfigStringPtr, $1, $2); $$ = $1; }
226         ;
227