/[svn]/linuxsampler/trunk/src/network/lscp.y
ViewVC logotype

Contents of /linuxsampler/trunk/src/network/lscp.y

Parent Directory Parent Directory | Revision Log Revision Log


Revision 705 - (show annotations) (download)
Wed Jul 20 21:43:23 2005 UTC (18 years, 8 months ago) by schoenebeck
File size: 33533 byte(s)
* support for muting sampler channels and solo mode of the same, two new
  LSCP commands ("SET CHANNEL MUTE" and "SET CHANNEL SOLO") and two new
  fields ("MUTE" and "SOLO") for command "GET CHANNEL INFO" were
  introduced for this (patch by Grigor Iliev, a bit adjusted)

1 /***************************************************************************
2 * *
3 * LinuxSampler - modular, streaming capable sampler *
4 * *
5 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 * Copyright (C) 2005 Christian Schoenebeck *
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the Free Software *
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21 * MA 02111-1307 USA *
22 ***************************************************************************/
23
24 /* Note: don't forget to run 'make parser' after you changed this file, */
25 /* otherwise the parser will not be regenerated! */
26
27 %{
28
29 #include "lscpparser.h"
30 #include "lscpserver.h"
31 #include "lscpevent.h"
32
33 // to save us typing work in the rules action definitions
34 #define LSCPSERVER ((yyparse_param_t*) yyparse_param)->pServer
35
36 // clears input buffer
37 void restart(yyparse_param_t* pparam, int& yychar);
38 #define RESTART restart((yyparse_param_t*) YYPARSE_PARAM, yychar)
39
40 // we provide our own version of yyerror() so we don't have to link against the yacc library
41 void yyerror(const char* s);
42
43 static char buf[1024]; // input buffer to feed the parser with new characters
44 static int bytes = 0; // current number of characters in the input buffer
45 static int ptr = 0; // current position in the input buffer
46
47 // external reference to the function which actually reads from the socket
48 extern int GetLSCPCommand( void *buf, int max_size);
49
50 // custom scanner function which reads from the socket
51 int yylex(YYSTYPE* yylval) {
52 // check if we have to read new characters
53 if (ptr >= bytes) {
54 bytes = GetLSCPCommand(buf, 1023);
55 ptr = 0;
56 if (bytes < 0) {
57 bytes = 0;
58 return 0;
59 }
60 }
61 return (int) buf[ptr++];
62 }
63
64 %}
65
66 // reentrant parser
67 %pure_parser
68
69 %type <Char> char digit
70 %type <Dotnum> dotnum volume_value boolean
71 %type <Number> number sampler_channel instrument_index audio_channel_index device_index midi_input_channel_index midi_input_port_index
72 %type <String> string text stringval digits param_val_list param_val filename engine_name command create_instruction destroy_instruction get_instruction list_instruction load_instruction set_chan_instruction load_instr_args load_engine_args audio_output_type_name midi_input_type_name set_instruction subscribe_event unsubscribe_event
73 %type <FillResponse> buffer_size_type
74 %type <KeyValList> key_val_list
75
76 %start input
77
78 %%
79
80 //TODO: return more meaningful error messages
81
82 /*
83 The LSCP specification input file (Documentation/lscp.xml) is automatically
84 updated with this file using the scripts/update_grammar.pl script. Do not
85 modify or delete the GRAMMAR_BNF_BEGIN and GRAMMAR_BNF_END lines !
86 */
87
88 // GRAMMAR_BNF_BEGIN - do NOT delete or modify this line !!!
89
90 input : line LF
91 | line CR LF
92 ;
93
94 line : /* epsilon (empty line ignored) */ { return LSCP_DONE; }
95 | comment { return LSCP_DONE; }
96 | command { LSCPSERVER->AnswerClient($1); return LSCP_DONE; }
97 | error { LSCPSERVER->AnswerClient("ERR:0:Unknown command.\r\n"); RESTART; return LSCP_SYNTAX_ERROR; }
98 ;
99
100 comment : '#'
101 | comment '#'
102 | comment SP
103 | comment number
104 | comment string
105 ;
106
107 command : ADD SP CHANNEL { $$ = LSCPSERVER->AddChannel(); }
108 | GET SP get_instruction { $$ = $3; }
109 | CREATE SP create_instruction { $$ = $3; }
110 | DESTROY SP destroy_instruction { $$ = $3; }
111 | LIST SP list_instruction { $$ = $3; }
112 | LOAD SP load_instruction { $$ = $3; }
113 | REMOVE SP CHANNEL SP sampler_channel { $$ = LSCPSERVER->RemoveChannel($5); }
114 | SET SP set_instruction { $$ = $3; }
115 | SUBSCRIBE SP subscribe_event { $$ = $3; }
116 | UNSUBSCRIBE SP unsubscribe_event { $$ = $3; }
117 | SELECT SP text { $$ = LSCPSERVER->QueryDatabase($3); }
118 | RESET SP CHANNEL SP sampler_channel { $$ = LSCPSERVER->ResetChannel($5); }
119 | RESET { $$ = LSCPSERVER->ResetSampler(); }
120 | QUIT { LSCPSERVER->AnswerClient("Bye!\r\n"); return LSCP_QUIT; }
121 ;
122
123 subscribe_event : CHANNEL_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_channel_count); }
124 | VOICE_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_voice_count); }
125 | STREAM_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_stream_count); }
126 | BUFFER_FILL { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_buffer_fill); }
127 | CHANNEL_INFO { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_channel_info); }
128 | MISCELLANEOUS { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_misc); }
129 ;
130
131 unsubscribe_event : CHANNEL_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_channel_count); }
132 | VOICE_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_voice_count); }
133 | STREAM_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_stream_count); }
134 | BUFFER_FILL { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_buffer_fill); }
135 | CHANNEL_INFO { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_channel_info); }
136 | MISCELLANEOUS { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_misc); }
137 ;
138
139 get_instruction : AVAILABLE_ENGINES { $$ = LSCPSERVER->GetAvailableEngines(); }
140 | AVAILABLE_MIDI_INPUT_DRIVERS { $$ = LSCPSERVER->GetAvailableMidiInputDrivers(); }
141 | MIDI_INPUT_DRIVER SP INFO SP string { $$ = LSCPSERVER->GetMidiInputDriverInfo($5); }
142 | MIDI_INPUT_DRIVER_PARAMETER SP INFO SP string SP string { $$ = LSCPSERVER->GetMidiInputDriverParameterInfo($5, $7); }
143 | MIDI_INPUT_DRIVER_PARAMETER SP INFO SP string SP string SP key_val_list { $$ = LSCPSERVER->GetMidiInputDriverParameterInfo($5, $7, $9); }
144 | AVAILABLE_AUDIO_OUTPUT_DRIVERS { $$ = LSCPSERVER->GetAvailableAudioOutputDrivers(); }
145 | AUDIO_OUTPUT_DRIVER SP INFO SP string { $$ = LSCPSERVER->GetAudioOutputDriverInfo($5); }
146 | AUDIO_OUTPUT_DRIVER_PARAMETER SP INFO SP string SP string { $$ = LSCPSERVER->GetAudioOutputDriverParameterInfo($5, $7); }
147 | AUDIO_OUTPUT_DRIVER_PARAMETER SP INFO SP string SP string SP key_val_list { $$ = LSCPSERVER->GetAudioOutputDriverParameterInfo($5, $7, $9); }
148 | AUDIO_OUTPUT_DEVICES { $$ = LSCPSERVER->GetAudioOutputDeviceCount(); }
149 | MIDI_INPUT_DEVICES { $$ = LSCPSERVER->GetMidiInputDeviceCount(); }
150 | AUDIO_OUTPUT_DEVICE SP INFO SP number { $$ = LSCPSERVER->GetAudioOutputDeviceInfo($5); }
151 | MIDI_INPUT_DEVICE SP INFO SP number { $$ = LSCPSERVER->GetMidiInputDeviceInfo($5); }
152 | MIDI_INPUT_PORT SP INFO SP number SP number { $$ = LSCPSERVER->GetMidiInputPortInfo($5, $7); }
153 | MIDI_INPUT_PORT_PARAMETER SP INFO SP number SP number SP string { $$ = LSCPSERVER->GetMidiInputPortParameterInfo($5, $7, $9); }
154 | AUDIO_OUTPUT_CHANNEL SP INFO SP number SP number { $$ = LSCPSERVER->GetAudioOutputChannelInfo($5, $7); }
155 | AUDIO_OUTPUT_CHANNEL_PARAMETER SP INFO SP number SP number SP string { $$ = LSCPSERVER->GetAudioOutputChannelParameterInfo($5, $7, $9); }
156 | CHANNELS { $$ = LSCPSERVER->GetChannels(); }
157 | CHANNEL SP INFO SP sampler_channel { $$ = LSCPSERVER->GetChannelInfo($5); }
158 | CHANNEL SP BUFFER_FILL SP buffer_size_type SP sampler_channel { $$ = LSCPSERVER->GetBufferFill($5, $7); }
159 | CHANNEL SP STREAM_COUNT SP sampler_channel { $$ = LSCPSERVER->GetStreamCount($5); }
160 | CHANNEL SP VOICE_COUNT SP sampler_channel { $$ = LSCPSERVER->GetVoiceCount($5); }
161 | ENGINE SP INFO SP engine_name { $$ = LSCPSERVER->GetEngineInfo($5); }
162 | SERVER SP INFO { $$ = LSCPSERVER->GetServerInfo(); }
163 ;
164
165 set_instruction : AUDIO_OUTPUT_DEVICE_PARAMETER SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetAudioOutputDeviceParameter($3, $5, $7); }
166 | AUDIO_OUTPUT_CHANNEL_PARAMETER SP number SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetAudioOutputChannelParameter($3, $5, $7, $9); }
167 | MIDI_INPUT_DEVICE_PARAMETER SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetMidiInputDeviceParameter($3, $5, $7); }
168 | MIDI_INPUT_PORT_PARAMETER SP number SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetMidiInputPortParameter($3, $5, $7, $9); }
169 | CHANNEL SP set_chan_instruction { $$ = $3; }
170 | ECHO SP boolean { $$ = LSCPSERVER->SetEcho((yyparse_param_t*) yyparse_param, $3); }
171 ;
172
173 create_instruction : AUDIO_OUTPUT_DEVICE SP string SP key_val_list { $$ = LSCPSERVER->CreateAudioOutputDevice($3,$5); }
174 | AUDIO_OUTPUT_DEVICE SP string { $$ = LSCPSERVER->CreateAudioOutputDevice($3); }
175 | MIDI_INPUT_DEVICE SP string SP key_val_list { $$ = LSCPSERVER->CreateMidiInputDevice($3,$5); }
176 | MIDI_INPUT_DEVICE SP string { $$ = LSCPSERVER->CreateMidiInputDevice($3); }
177 ;
178
179 destroy_instruction : AUDIO_OUTPUT_DEVICE SP number { $$ = LSCPSERVER->DestroyAudioOutputDevice($3); }
180 | MIDI_INPUT_DEVICE SP number { $$ = LSCPSERVER->DestroyMidiInputDevice($3); }
181 ;
182
183 load_instruction : INSTRUMENT SP load_instr_args { $$ = $3; }
184 | ENGINE SP load_engine_args { $$ = $3; }
185 ;
186
187 set_chan_instruction : AUDIO_OUTPUT_DEVICE SP sampler_channel SP device_index { $$ = LSCPSERVER->SetAudioOutputDevice($5, $3); }
188 | AUDIO_OUTPUT_CHANNEL SP sampler_channel SP audio_channel_index SP audio_channel_index { $$ = LSCPSERVER->SetAudioOutputChannel($5, $7, $3); }
189 | AUDIO_OUTPUT_TYPE SP sampler_channel SP audio_output_type_name { $$ = LSCPSERVER->SetAudioOutputType($5, $3); }
190 | MIDI_INPUT SP sampler_channel SP device_index SP midi_input_port_index SP midi_input_channel_index { $$ = LSCPSERVER->SetMIDIInput($5, $7, $9, $3); }
191 | MIDI_INPUT_DEVICE SP sampler_channel SP device_index { $$ = LSCPSERVER->SetMIDIInputDevice($5, $3); }
192 | MIDI_INPUT_PORT SP sampler_channel SP midi_input_port_index { $$ = LSCPSERVER->SetMIDIInputPort($5, $3); }
193 | MIDI_INPUT_CHANNEL SP sampler_channel SP midi_input_channel_index { $$ = LSCPSERVER->SetMIDIInputChannel($5, $3); }
194 | MIDI_INPUT_TYPE SP sampler_channel SP midi_input_type_name { $$ = LSCPSERVER->SetMIDIInputType($5, $3); }
195 | VOLUME SP sampler_channel SP volume_value { $$ = LSCPSERVER->SetVolume($5, $3); }
196 | MUTE SP sampler_channel SP boolean { $$ = LSCPSERVER->SetChannelMute($5, $3); }
197 | SOLO SP sampler_channel SP boolean { $$ = LSCPSERVER->SetChannelSolo($5, $3); }
198 ;
199
200 key_val_list : string '=' param_val_list { $$[$1] = $3; }
201 | key_val_list SP string '=' param_val_list { $$ = $1; $$[$3] = $5; }
202 ;
203
204 buffer_size_type : BYTES { $$ = fill_response_bytes; }
205 | PERCENTAGE { $$ = fill_response_percentage; }
206 ;
207
208 list_instruction : AUDIO_OUTPUT_DEVICES { $$ = LSCPSERVER->GetAudioOutputDevices(); }
209 | MIDI_INPUT_DEVICES { $$ = LSCPSERVER->GetMidiInputDevices(); }
210 | CHANNELS { $$ = LSCPSERVER->ListChannels(); }
211 | AVAILABLE_ENGINES { $$ = LSCPSERVER->ListAvailableEngines(); }
212 | AVAILABLE_MIDI_INPUT_DRIVERS { $$ = LSCPSERVER->ListAvailableMidiInputDrivers(); }
213 | AVAILABLE_AUDIO_OUTPUT_DRIVERS { $$ = LSCPSERVER->ListAvailableAudioOutputDrivers(); }
214 ;
215
216 load_instr_args : filename SP instrument_index SP sampler_channel { $$ = LSCPSERVER->LoadInstrument($1, $3, $5); }
217 | NON_MODAL SP filename SP instrument_index SP sampler_channel { $$ = LSCPSERVER->LoadInstrument($3, $5, $7, true); }
218 ;
219
220 load_engine_args : engine_name SP sampler_channel { $$ = LSCPSERVER->SetEngineType($1, $3); }
221 ;
222
223 device_index : number
224 ;
225
226 audio_channel_index : number
227 ;
228
229 audio_output_type_name : string
230 ;
231
232 midi_input_port_index : number
233 ;
234
235 midi_input_channel_index : number
236 | ALL { $$ = 16; }
237 ;
238
239 midi_input_type_name : string
240 ;
241
242 volume_value : dotnum
243 | number { $$ = $1; }
244 ;
245
246 sampler_channel : number
247 ;
248
249 instrument_index : number
250 ;
251
252 engine_name : string
253 ;
254
255 filename : stringval
256 ;
257
258 param_val_list : param_val
259 | param_val_list','param_val { $$ = $1 + "," + $3; }
260 ;
261
262 param_val : string
263 | '\'' string '\'' { $$ = "\'" + $2 + "\'"; } // we eleminate encapsulating (apostrophe) limiters later
264 | '\"' string '\"' { $$ = "\"" + $2 + "\""; } // s.a.
265 | number { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); }
266 | dotnum { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); }
267 ;
268
269 // GRAMMAR_BNF_END - do NOT delete or modify this line !!!
270
271
272 // atomic variable symbol rules
273
274 boolean : number { $$ = $1; }
275 | string { $$ = -1; }
276 ;
277
278 string : char { std::string s; s = $1; $$ = s; }
279 | string char { $$ = $1 + $2; }
280 ;
281
282 dotnum : digits '.' digits { $$ = atof(String($1 + "." + $3).c_str()); }
283 | '+' digits '.' digits { String s = "+"; s += $2; s += "."; s += $4; $$ = atof(s.c_str()); }
284 | '-' digits '.' digits { $$ = atof(String("-" + $2 + "." + $4).c_str()); }
285 ;
286
287
288 digits : digit { $$ = $1; }
289 | digits digit { $$ = $1 + $2; }
290 ;
291
292 digit : '0' { $$ = '0'; }
293 | '1' { $$ = '1'; }
294 | '2' { $$ = '2'; }
295 | '3' { $$ = '3'; }
296 | '4' { $$ = '4'; }
297 | '5' { $$ = '5'; }
298 | '6' { $$ = '6'; }
299 | '7' { $$ = '7'; }
300 | '8' { $$ = '8'; }
301 | '9' { $$ = '9'; }
302 ;
303
304 number : digit { $$ = atoi(String(1, $1).c_str()); }
305 | '1' digits { $$ = atoi(String(String("1") + $2).c_str()); }
306 | '2' digits { $$ = atoi(String(String("2") + $2).c_str()); }
307 | '3' digits { $$ = atoi(String(String("3") + $2).c_str()); }
308 | '4' digits { $$ = atoi(String(String("4") + $2).c_str()); }
309 | '5' digits { $$ = atoi(String(String("5") + $2).c_str()); }
310 | '6' digits { $$ = atoi(String(String("6") + $2).c_str()); }
311 | '7' digits { $$ = atoi(String(String("7") + $2).c_str()); }
312 | '8' digits { $$ = atoi(String(String("8") + $2).c_str()); }
313 | '9' digits { $$ = atoi(String(String("9") + $2).c_str()); }
314
315 char : 'A' { $$ = 'A'; } | 'B' { $$ = 'B'; } | 'C' { $$ = 'C'; } | 'D' { $$ = 'D'; } | 'E' { $$ = 'E'; } | 'F' { $$ = 'F'; } | 'G' { $$ = 'G'; } | 'H' { $$ = 'H'; } | 'I' { $$ = 'I'; } | 'J' { $$ = 'J'; } | 'K' { $$ = 'K'; } | 'L' { $$ = 'L'; } | 'M' { $$ = 'M'; } | 'N' { $$ = 'N'; } | 'O' { $$ = 'O'; } | 'P' { $$ = 'P'; } | 'Q' { $$ = 'Q'; } | 'R' { $$ = 'R'; } | 'S' { $$ = 'S'; } | 'T' { $$ = 'T'; } | 'U' { $$ = 'U'; } | 'V' { $$ = 'V'; } | 'W' { $$ = 'W'; } | 'X' { $$ = 'X'; } | 'Y' { $$ = 'Y'; } | 'Z' { $$ = 'Z'; }
316 | 'a' { $$ = 'a'; } | 'b' { $$ = 'b'; } | 'c' { $$ = 'c'; } | 'd' { $$ = 'd'; } | 'e' { $$ = 'e'; } | 'f' { $$ = 'f'; } | 'g' { $$ = 'g'; } | 'h' { $$ = 'h'; } | 'i' { $$ = 'i'; } | 'j' { $$ = 'j'; } | 'k' { $$ = 'k'; } | 'l' { $$ = 'l'; } | 'm' { $$ = 'm'; } | 'n' { $$ = 'n'; } | 'o' { $$ = 'o'; } | 'p' { $$ = 'p'; } | 'q' { $$ = 'q'; } | 'r' { $$ = 'r'; } | 's' { $$ = 's'; } | 't' { $$ = 't'; } | 'u' { $$ = 'u'; } | 'v' { $$ = 'v'; } | 'w' { $$ = 'w'; } | 'x' { $$ = 'x'; } | 'y' { $$ = 'y'; } | 'z' { $$ = 'z'; }
317 | '0' { $$ = '0'; } | '1' { $$ = '1'; } | '2' { $$ = '2'; } | '3' { $$ = '3'; } | '4' { $$ = '4'; } | '5' { $$ = '5'; } | '6' { $$ = '6'; } | '7' { $$ = '7'; } | '8' { $$ = '8'; } | '9' { $$ = '9'; }
318 | '!' { $$ = '!'; } | '#' { $$ = '#'; } | '$' { $$ = '$'; } | '%' { $$ = '%'; } | '&' { $$ = '&'; } | '(' { $$ = '('; } | ')' { $$ = ')'; } | '*' { $$ = '*'; } | '+' { $$ = '+'; } | '-' { $$ = '-'; } | '.' { $$ = '.'; } | ',' { $$ = ','; } | '/' { $$ = '/'; }
319 | ':' { $$ = ':'; } | ';' { $$ = ';'; } | '<' { $$ = '<'; } | '=' { $$ = '='; } | '>' { $$ = '>'; } | '?' { $$ = '?'; } | '@' { $$ = '@'; }
320 | '[' { $$ = '['; } | '\\' { $$ = '\\'; } | ']' { $$ = ']'; } | '^' { $$ = '^'; } | '_' { $$ = '_'; }
321 | '{' { $$ = '{'; } | '|' { $$ = '|'; } | '}' { $$ = '}'; } | '~' { $$ = '~'; }
322 | '\200' { $$ = '\200'; } | '\201' { $$ = '\201'; } | '\202' { $$ = '\202'; }
323 | '\203' { $$ = '\203'; } | '\204' { $$ = '\204'; } | '\205' { $$ = '\205'; }
324 | '\206' { $$ = '\206'; } | '\207' { $$ = '\207'; } | '\210' { $$ = '\210'; }
325 | '\211' { $$ = '\211'; } | '\212' { $$ = '\212'; } | '\213' { $$ = '\213'; }
326 | '\214' { $$ = '\214'; } | '\215' { $$ = '\215'; } | '\216' { $$ = '\216'; }
327 | '\217' { $$ = '\217'; } | '\220' { $$ = '\220'; } | '\221' { $$ = '\221'; }
328 | '\222' { $$ = '\222'; } | '\223' { $$ = '\223'; } | '\224' { $$ = '\224'; }
329 | '\225' { $$ = '\225'; } | '\226' { $$ = '\226'; } | '\227' { $$ = '\227'; }
330 | '\230' { $$ = '\230'; } | '\231' { $$ = '\231'; } | '\232' { $$ = '\232'; }
331 | '\233' { $$ = '\233'; } | '\234' { $$ = '\234'; } | '\235' { $$ = '\235'; }
332 | '\236' { $$ = '\236'; } | '\237' { $$ = '\237'; } | '\240' { $$ = '\240'; }
333 | '\241' { $$ = '\241'; } | '\242' { $$ = '\242'; } | '\243' { $$ = '\243'; }
334 | '\244' { $$ = '\244'; } | '\245' { $$ = '\245'; } | '\246' { $$ = '\246'; }
335 | '\247' { $$ = '\247'; } | '\250' { $$ = '\250'; } | '\251' { $$ = '\251'; }
336 | '\252' { $$ = '\252'; } | '\253' { $$ = '\253'; } | '\254' { $$ = '\254'; }
337 | '\255' { $$ = '\255'; } | '\256' { $$ = '\256'; } | '\257' { $$ = '\257'; }
338 | '\260' { $$ = '\260'; } | '\261' { $$ = '\261'; } | '\262' { $$ = '\262'; }
339 | '\263' { $$ = '\263'; } | '\264' { $$ = '\264'; } | '\265' { $$ = '\265'; }
340 | '\266' { $$ = '\266'; } | '\267' { $$ = '\267'; } | '\270' { $$ = '\270'; }
341 | '\271' { $$ = '\271'; } | '\272' { $$ = '\272'; } | '\273' { $$ = '\273'; }
342 | '\274' { $$ = '\274'; } | '\275' { $$ = '\275'; } | '\276' { $$ = '\276'; }
343 | '\277' { $$ = '\277'; } | '\300' { $$ = '\300'; } | '\301' { $$ = '\301'; }
344 | '\302' { $$ = '\302'; } | '\303' { $$ = '\303'; } | '\304' { $$ = '\304'; }
345 | '\305' { $$ = '\305'; } | '\306' { $$ = '\306'; } | '\307' { $$ = '\307'; }
346 | '\310' { $$ = '\310'; } | '\311' { $$ = '\311'; } | '\312' { $$ = '\312'; }
347 | '\313' { $$ = '\313'; } | '\314' { $$ = '\314'; } | '\315' { $$ = '\315'; }
348 | '\316' { $$ = '\316'; } | '\317' { $$ = '\317'; } | '\320' { $$ = '\320'; }
349 | '\321' { $$ = '\321'; } | '\322' { $$ = '\322'; } | '\323' { $$ = '\323'; }
350 | '\324' { $$ = '\324'; } | '\325' { $$ = '\325'; } | '\326' { $$ = '\326'; }
351 | '\327' { $$ = '\327'; } | '\330' { $$ = '\330'; } | '\331' { $$ = '\331'; }
352 | '\332' { $$ = '\332'; } | '\333' { $$ = '\333'; } | '\334' { $$ = '\334'; }
353 | '\335' { $$ = '\335'; } | '\336' { $$ = '\336'; } | '\337' { $$ = '\337'; }
354 | '\340' { $$ = '\340'; } | '\341' { $$ = '\341'; } | '\342' { $$ = '\342'; }
355 | '\343' { $$ = '\343'; } | '\344' { $$ = '\344'; } | '\345' { $$ = '\345'; }
356 | '\346' { $$ = '\346'; } | '\347' { $$ = '\347'; } | '\350' { $$ = '\350'; }
357 | '\351' { $$ = '\351'; } | '\352' { $$ = '\352'; } | '\353' { $$ = '\353'; }
358 | '\354' { $$ = '\354'; } | '\355' { $$ = '\355'; } | '\356' { $$ = '\356'; }
359 | '\357' { $$ = '\357'; } | '\360' { $$ = '\360'; } | '\361' { $$ = '\361'; }
360 | '\362' { $$ = '\362'; } | '\363' { $$ = '\363'; } | '\364' { $$ = '\364'; }
361 | '\365' { $$ = '\365'; } | '\366' { $$ = '\366'; } | '\367' { $$ = '\367'; }
362 | '\370' { $$ = '\370'; } | '\371' { $$ = '\371'; } | '\372' { $$ = '\372'; }
363 | '\373' { $$ = '\373'; } | '\374' { $$ = '\374'; } | '\375' { $$ = '\375'; }
364 | '\376' { $$ = '\376'; } | '\377' { $$ = '\377'; }
365 ;
366
367 text : SP { $$ = " "; }
368 | string
369 | text SP { $$ = $1 + " "; }
370 | text string { $$ = $1 + $2; }
371 ;
372
373 stringval : '\'' text '\'' { $$ = $2; }
374 | '\"' text '\"' { $$ = $2; }
375 ;
376
377
378 // rules which are more or less just terminal symbols
379
380 SP : ' '
381 ;
382
383 LF : '\n'
384 ;
385
386 CR : '\r'
387 ;
388
389 ADD : 'A''D''D'
390 ;
391
392 GET : 'G''E''T'
393 ;
394
395 CREATE : 'C''R''E''A''T''E'
396 ;
397
398 DESTROY : 'D''E''S''T''R''O''Y'
399 ;
400
401 LIST : 'L''I''S''T'
402 ;
403
404 LOAD : 'L''O''A''D'
405 ;
406
407 ALL : 'A''L''L'
408 ;
409
410 NON_MODAL : 'N''O''N''_''M''O''D''A''L'
411 ;
412
413 REMOVE : 'R''E''M''O''V''E'
414 ;
415
416 SET : 'S''E''T'
417 ;
418
419 SUBSCRIBE : 'S''U''B''S''C''R''I''B''E'
420 ;
421
422 UNSUBSCRIBE : 'U''N''S''U''B''S''C''R''I''B''E'
423 ;
424
425 SELECT : 'S''E''L''E''C''T'
426 ;
427
428 CHANNEL : 'C''H''A''N''N''E''L'
429 ;
430
431 AVAILABLE_ENGINES : 'A''V''A''I''L''A''B''L''E''_''E''N''G''I''N''E''S'
432 ;
433
434 AVAILABLE_AUDIO_OUTPUT_DRIVERS : 'A''V''A''I''L''A''B''L''E''_''A''U''D''I''O''_''O''U''T''P''U''T''_''D''R''I''V''E''R''S'
435 ;
436
437 CHANNELS : 'C''H''A''N''N''E''L''S'
438 ;
439
440 INFO : 'I''N''F''O'
441 ;
442
443 CHANNEL_COUNT : 'C''H''A''N''N''E''L''_''C''O''U''N''T'
444 ;
445
446 CHANNEL_INFO : 'C''H''A''N''N''E''L''_''I''N''F''O'
447 ;
448
449 BUFFER_FILL : 'B''U''F''F''E''R''_''F''I''L''L'
450 ;
451
452 STREAM_COUNT : 'S''T''R''E''A''M''_''C''O''U''N''T'
453 ;
454
455 VOICE_COUNT : 'V''O''I''C''E''_''C''O''U''N''T'
456 ;
457
458 INSTRUMENT : 'I''N''S''T''R''U''M''E''N''T'
459 ;
460
461 ENGINE : 'E' 'N' 'G' 'I' 'N' 'E'
462 ;
463
464 AUDIO_OUTPUT_DEVICE_PARAMETER : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''E''V''I''C''E''_''P''A''R''A''M''E''T''E''R'
465 ;
466
467 AUDIO_OUTPUT_DEVICES : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''E''V''I''C''E''S'
468 ;
469
470 AUDIO_OUTPUT_DEVICE : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''E''V''I''C''E'
471 ;
472
473 AUDIO_OUTPUT_DRIVER_PARAMETER : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''R''I''V''E''R''_''P''A''R''A''M''E''T''E''R'
474 ;
475
476 AUDIO_OUTPUT_DRIVER : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''R''I''V''E''R'
477 ;
478
479 AUDIO_OUTPUT_CHANNEL_PARAMETER : 'A''U''D''I''O''_''O''U''T''P''U''T''_''C''H''A''N''N''E''L''_''P''A''R''A''M''E''T''E''R'
480 ;
481
482 AUDIO_OUTPUT_CHANNEL : 'A''U''D''I''O''_''O''U''T''P''U''T''_''C''H''A''N''N''E''L'
483 ;
484
485 AUDIO_OUTPUT_TYPE : 'A''U''D''I''O''_''O''U''T''P''U''T''_''T''Y''P''E'
486 ;
487
488 AVAILABLE_MIDI_INPUT_DRIVERS : 'A''V''A''I''L''A''B''L''E''_''M''I''D''I''_''I''N''P''U''T''_''D''R''I''V''E''R''S'
489 ;
490
491 MIDI_INPUT_DEVICE_PARAMETER : 'M''I''D''I''_''I''N''P''U''T''_''D''E''V''I''C''E''_''P''A''R''A''M''E''T''E''R'
492 ;
493
494 MIDI_INPUT_PORT_PARAMETER : 'M''I''D''I''_''I''N''P''U''T''_''P''O''R''T''_''P''A''R''A''M''E''T''E''R'
495 ;
496
497 MIDI_INPUT_DEVICES : 'M''I''D''I''_''I''N''P''U''T''_''D''E''V''I''C''E''S'
498 ;
499
500 MIDI_INPUT_DEVICE : 'M''I''D''I''_''I''N''P''U''T''_''D''E''V''I''C''E'
501 ;
502
503 MIDI_INPUT_DRIVER_PARAMETER : 'M''I''D''I''_''I''N''P''U''T''_''D''R''I''V''E''R''_''P''A''R''A''M''E''T''E''R'
504 ;
505
506 MIDI_INPUT_DRIVER : 'M''I''D''I''_''I''N''P''U''T''_''D''R''I''V''E''R'
507 ;
508
509 MIDI_INPUT_PORT : 'M''I''D''I''_''I''N''P''U''T''_''P''O''R''T'
510 ;
511
512 MIDI_INPUT_CHANNEL : 'M''I''D''I''_''I''N''P''U''T''_''C''H''A''N''N''E''L'
513 ;
514
515 MIDI_INPUT_TYPE : 'M''I''D''I''_''I''N''P''U''T''_''T''Y''P''E'
516 ;
517
518 MIDI_INPUT : 'M''I''D''I''_''I''N''P''U''T'
519 ;
520
521 SERVER : 'S''E''R''V''E''R'
522 ;
523
524 VOLUME : 'V''O''L''U''M''E'
525 ;
526
527 MUTE : 'M''U''T''E'
528 ;
529
530 SOLO : 'S''O''L''O'
531 ;
532
533 BYTES : 'B''Y''T''E''S'
534 ;
535
536 PERCENTAGE : 'P''E''R''C''E''N''T''A''G''E'
537 ;
538
539 RESET : 'R''E''S''E''T'
540 ;
541
542 MISCELLANEOUS : 'M''I''S''C''E''L''L''A''N''E''O''U''S'
543 ;
544
545 ECHO : 'E''C''H''O'
546 ;
547
548 QUIT : 'Q''U''I''T'
549 ;
550
551 %%
552
553 /**
554 * Will be called when an error occured (usually syntax error).
555 */
556 void yyerror(const char* s) {
557 dmsg(2,("LSCPParser: %s\n", s));
558 }
559
560 /**
561 * Clears input buffer.
562 */
563 void restart(yyparse_param_t* pparam, int& yychar) {
564 bytes = 0;
565 ptr = 0;
566 }

  ViewVC Help
Powered by ViewVC