/[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 973 - (show annotations) (download)
Fri Dec 15 21:40:27 2006 UTC (17 years, 4 months ago) by schoenebeck
File size: 41021 byte(s)
* revised and extended MIDI instrument mapping feature to allow managing
  arbitrary amount of maps and assigning each sampler channel individually
  to one map (this commit batch includes LSCP spec document update and
  respective implementation on LS side)

1 /***************************************************************************
2 * *
3 * LinuxSampler - modular, streaming capable sampler *
4 * *
5 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 * Copyright (C) 2005, 2006 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 /* CAUTION: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
25 /* */
26 /* don't forget to run 'make parser' after you changed this file, */
27 /* otherwise the parser will not be regenerated ! */
28 /* */
29 /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
30
31 %{
32
33 #include "lscpparser.h"
34 #include "lscpserver.h"
35 #include "lscpevent.h"
36
37 // to save us typing work in the rules action definitions
38 #define LSCPSERVER ((yyparse_param_t*) yyparse_param)->pServer
39
40 // clears input buffer
41 void restart(yyparse_param_t* pparam, int& yychar);
42 #define RESTART restart((yyparse_param_t*) YYPARSE_PARAM, yychar)
43
44 // we provide our own version of yyerror() so we don't have to link against the yacc library
45 void yyerror(const char* s);
46
47 static char buf[1024]; // input buffer to feed the parser with new characters
48 static int bytes = 0; // current number of characters in the input buffer
49 static int ptr = 0; // current position in the input buffer
50
51 // external reference to the function which actually reads from the socket
52 extern int GetLSCPCommand( void *buf, int max_size);
53
54 // custom scanner function which reads from the socket
55 int yylex(YYSTYPE* yylval) {
56 // check if we have to read new characters
57 if (ptr >= bytes) {
58 bytes = GetLSCPCommand(buf, 1023);
59 ptr = 0;
60 if (bytes < 0) {
61 bytes = 0;
62 return 0;
63 }
64 }
65 return (int) buf[ptr++];
66 }
67
68 %}
69
70 // reentrant parser
71 %pure_parser
72
73 %type <Char> char digit
74 %type <Dotnum> dotnum volume_value boolean
75 %type <Number> number sampler_channel instrument_index audio_channel_index device_index midi_input_channel_index midi_input_port_index midi_map midi_bank midi_prog
76 %type <String> string text stringval digits param_val_list param_val filename map_name entry_name engine_name command add_instruction 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 remove_instruction unmap_instruction set_instruction subscribe_event unsubscribe_event map_instruction reset_instruction clear_instruction
77 %type <FillResponse> buffer_size_type
78 %type <KeyValList> key_val_list
79 %type <LoadMode> instr_load_mode
80
81 %start input
82
83 %%
84
85 //TODO: return more meaningful error messages
86
87 /*
88 The LSCP specification document input file (Documentation/lscp.xml) is
89 automatically updated with this file using the scripts/update_grammar.pl
90 script. Do not modify or delete the GRAMMAR_BNF_BEGIN and GRAMMAR_BNF_END
91 lines !
92 */
93
94 // GRAMMAR_BNF_BEGIN - do NOT delete or modify this line !!!
95
96 input : line LF
97 | line CR LF
98 ;
99
100 line : /* epsilon (empty line ignored) */ { return LSCP_DONE; }
101 | comment { return LSCP_DONE; }
102 | command { LSCPSERVER->AnswerClient($1); return LSCP_DONE; }
103 | error { LSCPSERVER->AnswerClient("ERR:0:Unknown command.\r\n"); RESTART; return LSCP_SYNTAX_ERROR; }
104 ;
105
106 comment : '#'
107 | comment '#'
108 | comment SP
109 | comment number
110 | comment string
111 ;
112
113 command : ADD SP add_instruction { $$ = $3; }
114 | MAP SP map_instruction { $$ = $3; }
115 | UNMAP SP unmap_instruction { $$ = $3; }
116 | GET SP get_instruction { $$ = $3; }
117 | CREATE SP create_instruction { $$ = $3; }
118 | DESTROY SP destroy_instruction { $$ = $3; }
119 | LIST SP list_instruction { $$ = $3; }
120 | LOAD SP load_instruction { $$ = $3; }
121 | REMOVE SP remove_instruction { $$ = $3; }
122 | SET SP set_instruction { $$ = $3; }
123 | SUBSCRIBE SP subscribe_event { $$ = $3; }
124 | UNSUBSCRIBE SP unsubscribe_event { $$ = $3; }
125 | SELECT SP text { $$ = LSCPSERVER->QueryDatabase($3); }
126 | RESET SP reset_instruction { $$ = $3; }
127 | CLEAR SP clear_instruction { $$ = $3; }
128 | RESET { $$ = LSCPSERVER->ResetSampler(); }
129 | QUIT { LSCPSERVER->AnswerClient("Bye!\r\n"); return LSCP_QUIT; }
130 ;
131
132 add_instruction : CHANNEL { $$ = LSCPSERVER->AddChannel(); }
133 | MIDI_INSTRUMENT_MAP { $$ = LSCPSERVER->AddMidiInstrumentMap(); }
134 | MIDI_INSTRUMENT_MAP SP map_name { $$ = LSCPSERVER->AddMidiInstrumentMap($3); }
135 ;
136
137 subscribe_event : CHANNEL_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_channel_count); }
138 | VOICE_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_voice_count); }
139 | STREAM_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_stream_count); }
140 | BUFFER_FILL { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_buffer_fill); }
141 | CHANNEL_INFO { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_channel_info); }
142 | MISCELLANEOUS { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_misc); }
143 | TOTAL_VOICE_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_total_voice_count); }
144 ;
145
146 unsubscribe_event : CHANNEL_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_channel_count); }
147 | VOICE_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_voice_count); }
148 | STREAM_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_stream_count); }
149 | BUFFER_FILL { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_buffer_fill); }
150 | CHANNEL_INFO { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_channel_info); }
151 | MISCELLANEOUS { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_misc); }
152 | TOTAL_VOICE_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_total_voice_count); }
153 ;
154
155 map_instruction : MIDI_INSTRUMENT SP midi_map SP midi_bank SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,MidiInstrumentMapper::VOID,""); }
156 | MIDI_INSTRUMENT SP midi_map SP midi_bank SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value SP instr_load_mode { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,$17,""); }
157 | MIDI_INSTRUMENT SP midi_map SP midi_bank SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value SP entry_name { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,MidiInstrumentMapper::VOID,$17); }
158 | MIDI_INSTRUMENT SP midi_map SP midi_bank SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value SP instr_load_mode SP entry_name { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,$17,$19); }
159 ;
160
161 unmap_instruction : MIDI_INSTRUMENT SP midi_map SP midi_bank SP midi_prog { $$ = LSCPSERVER->RemoveMIDIInstrumentMapping($3,$5,$7); }
162 ;
163
164 remove_instruction : CHANNEL SP sampler_channel { $$ = LSCPSERVER->RemoveChannel($3); }
165 | MIDI_INSTRUMENT_MAP SP midi_map { $$ = LSCPSERVER->RemoveMidiInstrumentMap($3); }
166 | MIDI_INSTRUMENT_MAP SP ALL { $$ = LSCPSERVER->RemoveAllMidiInstrumentMaps(); }
167 ;
168
169 get_instruction : AVAILABLE_ENGINES { $$ = LSCPSERVER->GetAvailableEngines(); }
170 | AVAILABLE_MIDI_INPUT_DRIVERS { $$ = LSCPSERVER->GetAvailableMidiInputDrivers(); }
171 | MIDI_INPUT_DRIVER SP INFO SP string { $$ = LSCPSERVER->GetMidiInputDriverInfo($5); }
172 | MIDI_INPUT_DRIVER_PARAMETER SP INFO SP string SP string { $$ = LSCPSERVER->GetMidiInputDriverParameterInfo($5, $7); }
173 | MIDI_INPUT_DRIVER_PARAMETER SP INFO SP string SP string SP key_val_list { $$ = LSCPSERVER->GetMidiInputDriverParameterInfo($5, $7, $9); }
174 | AVAILABLE_AUDIO_OUTPUT_DRIVERS { $$ = LSCPSERVER->GetAvailableAudioOutputDrivers(); }
175 | AUDIO_OUTPUT_DRIVER SP INFO SP string { $$ = LSCPSERVER->GetAudioOutputDriverInfo($5); }
176 | AUDIO_OUTPUT_DRIVER_PARAMETER SP INFO SP string SP string { $$ = LSCPSERVER->GetAudioOutputDriverParameterInfo($5, $7); }
177 | AUDIO_OUTPUT_DRIVER_PARAMETER SP INFO SP string SP string SP key_val_list { $$ = LSCPSERVER->GetAudioOutputDriverParameterInfo($5, $7, $9); }
178 | AUDIO_OUTPUT_DEVICES { $$ = LSCPSERVER->GetAudioOutputDeviceCount(); }
179 | MIDI_INPUT_DEVICES { $$ = LSCPSERVER->GetMidiInputDeviceCount(); }
180 | AUDIO_OUTPUT_DEVICE SP INFO SP number { $$ = LSCPSERVER->GetAudioOutputDeviceInfo($5); }
181 | MIDI_INPUT_DEVICE SP INFO SP number { $$ = LSCPSERVER->GetMidiInputDeviceInfo($5); }
182 | MIDI_INPUT_PORT SP INFO SP number SP number { $$ = LSCPSERVER->GetMidiInputPortInfo($5, $7); }
183 | MIDI_INPUT_PORT_PARAMETER SP INFO SP number SP number SP string { $$ = LSCPSERVER->GetMidiInputPortParameterInfo($5, $7, $9); }
184 | AUDIO_OUTPUT_CHANNEL SP INFO SP number SP number { $$ = LSCPSERVER->GetAudioOutputChannelInfo($5, $7); }
185 | AUDIO_OUTPUT_CHANNEL_PARAMETER SP INFO SP number SP number SP string { $$ = LSCPSERVER->GetAudioOutputChannelParameterInfo($5, $7, $9); }
186 | CHANNELS { $$ = LSCPSERVER->GetChannels(); }
187 | CHANNEL SP INFO SP sampler_channel { $$ = LSCPSERVER->GetChannelInfo($5); }
188 | CHANNEL SP BUFFER_FILL SP buffer_size_type SP sampler_channel { $$ = LSCPSERVER->GetBufferFill($5, $7); }
189 | CHANNEL SP STREAM_COUNT SP sampler_channel { $$ = LSCPSERVER->GetStreamCount($5); }
190 | CHANNEL SP VOICE_COUNT SP sampler_channel { $$ = LSCPSERVER->GetVoiceCount($5); }
191 | ENGINE SP INFO SP engine_name { $$ = LSCPSERVER->GetEngineInfo($5); }
192 | SERVER SP INFO { $$ = LSCPSERVER->GetServerInfo(); }
193 | TOTAL_VOICE_COUNT { $$ = LSCPSERVER->GetTotalVoiceCount(); }
194 | TOTAL_VOICE_COUNT_MAX { $$ = LSCPSERVER->GetTotalVoiceCountMax(); }
195 | MIDI_INSTRUMENTS SP midi_map { $$ = LSCPSERVER->GetMidiInstrumentMappings($3); }
196 | MIDI_INSTRUMENTS SP ALL { $$ = LSCPSERVER->GetAllMidiInstrumentMappings(); }
197 | MIDI_INSTRUMENT SP INFO SP midi_map SP midi_bank SP midi_prog { $$ = LSCPSERVER->GetMidiInstrumentMapping($5,$7,$9); }
198 | MIDI_INSTRUMENT_MAPS { $$ = LSCPSERVER->GetMidiInstrumentMaps(); }
199 | MIDI_INSTRUMENT_MAP SP INFO SP midi_map { $$ = LSCPSERVER->GetMidiInstrumentMap($5); }
200 ;
201
202 set_instruction : AUDIO_OUTPUT_DEVICE_PARAMETER SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetAudioOutputDeviceParameter($3, $5, $7); }
203 | AUDIO_OUTPUT_CHANNEL_PARAMETER SP number SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetAudioOutputChannelParameter($3, $5, $7, $9); }
204 | MIDI_INPUT_DEVICE_PARAMETER SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetMidiInputDeviceParameter($3, $5, $7); }
205 | MIDI_INPUT_PORT_PARAMETER SP number SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetMidiInputPortParameter($3, $5, $7, $9); }
206 | CHANNEL SP set_chan_instruction { $$ = $3; }
207 | MIDI_INSTRUMENT_MAP SP NAME SP midi_map SP map_name { $$ = LSCPSERVER->SetMidiInstrumentMapName($5, $7); }
208 | ECHO SP boolean { $$ = LSCPSERVER->SetEcho((yyparse_param_t*) yyparse_param, $3); }
209 ;
210
211 create_instruction : AUDIO_OUTPUT_DEVICE SP string SP key_val_list { $$ = LSCPSERVER->CreateAudioOutputDevice($3,$5); }
212 | AUDIO_OUTPUT_DEVICE SP string { $$ = LSCPSERVER->CreateAudioOutputDevice($3); }
213 | MIDI_INPUT_DEVICE SP string SP key_val_list { $$ = LSCPSERVER->CreateMidiInputDevice($3,$5); }
214 | MIDI_INPUT_DEVICE SP string { $$ = LSCPSERVER->CreateMidiInputDevice($3); }
215 ;
216
217 reset_instruction : CHANNEL SP sampler_channel { $$ = LSCPSERVER->ResetChannel($3); }
218 ;
219
220 clear_instruction : MIDI_INSTRUMENTS SP midi_map { $$ = LSCPSERVER->ClearMidiInstrumentMappings($3); }
221 | MIDI_INSTRUMENTS SP ALL { $$ = LSCPSERVER->ClearAllMidiInstrumentMappings(); }
222 ;
223
224 destroy_instruction : AUDIO_OUTPUT_DEVICE SP number { $$ = LSCPSERVER->DestroyAudioOutputDevice($3); }
225 | MIDI_INPUT_DEVICE SP number { $$ = LSCPSERVER->DestroyMidiInputDevice($3); }
226 ;
227
228 load_instruction : INSTRUMENT SP load_instr_args { $$ = $3; }
229 | ENGINE SP load_engine_args { $$ = $3; }
230 ;
231
232 set_chan_instruction : AUDIO_OUTPUT_DEVICE SP sampler_channel SP device_index { $$ = LSCPSERVER->SetAudioOutputDevice($5, $3); }
233 | AUDIO_OUTPUT_CHANNEL SP sampler_channel SP audio_channel_index SP audio_channel_index { $$ = LSCPSERVER->SetAudioOutputChannel($5, $7, $3); }
234 | AUDIO_OUTPUT_TYPE SP sampler_channel SP audio_output_type_name { $$ = LSCPSERVER->SetAudioOutputType($5, $3); }
235 | MIDI_INPUT SP sampler_channel SP device_index SP midi_input_port_index SP midi_input_channel_index { $$ = LSCPSERVER->SetMIDIInput($5, $7, $9, $3); }
236 | MIDI_INPUT_DEVICE SP sampler_channel SP device_index { $$ = LSCPSERVER->SetMIDIInputDevice($5, $3); }
237 | MIDI_INPUT_PORT SP sampler_channel SP midi_input_port_index { $$ = LSCPSERVER->SetMIDIInputPort($5, $3); }
238 | MIDI_INPUT_CHANNEL SP sampler_channel SP midi_input_channel_index { $$ = LSCPSERVER->SetMIDIInputChannel($5, $3); }
239 | MIDI_INPUT_TYPE SP sampler_channel SP midi_input_type_name { $$ = LSCPSERVER->SetMIDIInputType($5, $3); }
240 | VOLUME SP sampler_channel SP volume_value { $$ = LSCPSERVER->SetVolume($5, $3); }
241 | MUTE SP sampler_channel SP boolean { $$ = LSCPSERVER->SetChannelMute($5, $3); }
242 | SOLO SP sampler_channel SP boolean { $$ = LSCPSERVER->SetChannelSolo($5, $3); }
243 | MIDI_INSTRUMENT_MAP SP sampler_channel SP midi_map { $$ = LSCPSERVER->SetChannelMap($3, $5); }
244 | MIDI_INSTRUMENT_MAP SP sampler_channel SP NONE { $$ = LSCPSERVER->SetChannelMap($3, -1); }
245 | MIDI_INSTRUMENT_MAP SP sampler_channel SP DEFAULT { $$ = LSCPSERVER->SetChannelMap($3, -2); }
246 ;
247
248 key_val_list : string '=' param_val_list { $$[$1] = $3; }
249 | key_val_list SP string '=' param_val_list { $$ = $1; $$[$3] = $5; }
250 ;
251
252 buffer_size_type : BYTES { $$ = fill_response_bytes; }
253 | PERCENTAGE { $$ = fill_response_percentage; }
254 ;
255
256 list_instruction : AUDIO_OUTPUT_DEVICES { $$ = LSCPSERVER->GetAudioOutputDevices(); }
257 | MIDI_INPUT_DEVICES { $$ = LSCPSERVER->GetMidiInputDevices(); }
258 | CHANNELS { $$ = LSCPSERVER->ListChannels(); }
259 | AVAILABLE_ENGINES { $$ = LSCPSERVER->ListAvailableEngines(); }
260 | AVAILABLE_MIDI_INPUT_DRIVERS { $$ = LSCPSERVER->ListAvailableMidiInputDrivers(); }
261 | AVAILABLE_AUDIO_OUTPUT_DRIVERS { $$ = LSCPSERVER->ListAvailableAudioOutputDrivers(); }
262 | MIDI_INSTRUMENTS SP midi_map { $$ = LSCPSERVER->ListMidiInstrumentMappings($3); }
263 | MIDI_INSTRUMENTS SP ALL { $$ = LSCPSERVER->ListAllMidiInstrumentMappings(); }
264 | MIDI_INSTRUMENT_MAPS { $$ = LSCPSERVER->ListMidiInstrumentMaps(); }
265 ;
266
267 load_instr_args : filename SP instrument_index SP sampler_channel { $$ = LSCPSERVER->LoadInstrument($1, $3, $5); }
268 | NON_MODAL SP filename SP instrument_index SP sampler_channel { $$ = LSCPSERVER->LoadInstrument($3, $5, $7, true); }
269 ;
270
271 load_engine_args : engine_name SP sampler_channel { $$ = LSCPSERVER->SetEngineType($1, $3); }
272 ;
273
274 instr_load_mode : ON_DEMAND { $$ = MidiInstrumentMapper::ON_DEMAND; }
275 | ON_DEMAND_HOLD { $$ = MidiInstrumentMapper::ON_DEMAND_HOLD; }
276 | PERSISTENT { $$ = MidiInstrumentMapper::PERSISTENT; }
277 ;
278
279 device_index : number
280 ;
281
282 audio_channel_index : number
283 ;
284
285 audio_output_type_name : string
286 ;
287
288 midi_input_port_index : number
289 ;
290
291 midi_input_channel_index : number
292 | ALL { $$ = 16; }
293 ;
294
295 midi_input_type_name : string
296 ;
297
298 midi_map : number
299 ;
300
301 midi_bank : number
302 ;
303
304 midi_prog : number
305 ;
306
307 volume_value : dotnum
308 | number { $$ = $1; }
309 ;
310
311 sampler_channel : number
312 ;
313
314 instrument_index : number
315 ;
316
317 engine_name : string
318 ;
319
320 filename : stringval
321 ;
322
323 map_name : stringval
324 ;
325
326 entry_name : stringval
327 ;
328
329 param_val_list : param_val
330 | param_val_list','param_val { $$ = $1 + "," + $3; }
331 ;
332
333 param_val : string
334 | stringval
335 | number { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); }
336 | dotnum { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); }
337 ;
338
339 // GRAMMAR_BNF_END - do NOT delete or modify this line !!!
340
341
342 // atomic variable symbol rules
343
344 boolean : number { $$ = $1; }
345 | string { $$ = -1; }
346 ;
347
348 string : char { std::string s; s = $1; $$ = s; }
349 | string char { $$ = $1 + $2; }
350 ;
351
352 dotnum : digits '.' digits { $$ = atof(String($1 + "." + $3).c_str()); }
353 | '+' digits '.' digits { String s = "+"; s += $2; s += "."; s += $4; $$ = atof(s.c_str()); }
354 | '-' digits '.' digits { $$ = atof(String("-" + $2 + "." + $4).c_str()); }
355 ;
356
357
358 digits : digit { $$ = $1; }
359 | digits digit { $$ = $1 + $2; }
360 ;
361
362 digit : '0' { $$ = '0'; }
363 | '1' { $$ = '1'; }
364 | '2' { $$ = '2'; }
365 | '3' { $$ = '3'; }
366 | '4' { $$ = '4'; }
367 | '5' { $$ = '5'; }
368 | '6' { $$ = '6'; }
369 | '7' { $$ = '7'; }
370 | '8' { $$ = '8'; }
371 | '9' { $$ = '9'; }
372 ;
373
374 number : digit { $$ = atoi(String(1, $1).c_str()); }
375 | '1' digits { $$ = atoi(String(String("1") + $2).c_str()); }
376 | '2' digits { $$ = atoi(String(String("2") + $2).c_str()); }
377 | '3' digits { $$ = atoi(String(String("3") + $2).c_str()); }
378 | '4' digits { $$ = atoi(String(String("4") + $2).c_str()); }
379 | '5' digits { $$ = atoi(String(String("5") + $2).c_str()); }
380 | '6' digits { $$ = atoi(String(String("6") + $2).c_str()); }
381 | '7' digits { $$ = atoi(String(String("7") + $2).c_str()); }
382 | '8' digits { $$ = atoi(String(String("8") + $2).c_str()); }
383 | '9' digits { $$ = atoi(String(String("9") + $2).c_str()); }
384
385 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'; }
386 | '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'; }
387 | '0' { $$ = '0'; } | '1' { $$ = '1'; } | '2' { $$ = '2'; } | '3' { $$ = '3'; } | '4' { $$ = '4'; } | '5' { $$ = '5'; } | '6' { $$ = '6'; } | '7' { $$ = '7'; } | '8' { $$ = '8'; } | '9' { $$ = '9'; }
388 | '!' { $$ = '!'; } | '#' { $$ = '#'; } | '$' { $$ = '$'; } | '%' { $$ = '%'; } | '&' { $$ = '&'; } | '(' { $$ = '('; } | ')' { $$ = ')'; } | '*' { $$ = '*'; } | '+' { $$ = '+'; } | '-' { $$ = '-'; } | '.' { $$ = '.'; } | ',' { $$ = ','; } | '/' { $$ = '/'; }
389 | ':' { $$ = ':'; } | ';' { $$ = ';'; } | '<' { $$ = '<'; } | '=' { $$ = '='; } | '>' { $$ = '>'; } | '?' { $$ = '?'; } | '@' { $$ = '@'; }
390 | '[' { $$ = '['; } | '\\' { $$ = '\\'; } | ']' { $$ = ']'; } | '^' { $$ = '^'; } | '_' { $$ = '_'; }
391 | '{' { $$ = '{'; } | '|' { $$ = '|'; } | '}' { $$ = '}'; } | '~' { $$ = '~'; }
392 | '\200' { $$ = '\200'; } | '\201' { $$ = '\201'; } | '\202' { $$ = '\202'; }
393 | '\203' { $$ = '\203'; } | '\204' { $$ = '\204'; } | '\205' { $$ = '\205'; }
394 | '\206' { $$ = '\206'; } | '\207' { $$ = '\207'; } | '\210' { $$ = '\210'; }
395 | '\211' { $$ = '\211'; } | '\212' { $$ = '\212'; } | '\213' { $$ = '\213'; }
396 | '\214' { $$ = '\214'; } | '\215' { $$ = '\215'; } | '\216' { $$ = '\216'; }
397 | '\217' { $$ = '\217'; } | '\220' { $$ = '\220'; } | '\221' { $$ = '\221'; }
398 | '\222' { $$ = '\222'; } | '\223' { $$ = '\223'; } | '\224' { $$ = '\224'; }
399 | '\225' { $$ = '\225'; } | '\226' { $$ = '\226'; } | '\227' { $$ = '\227'; }
400 | '\230' { $$ = '\230'; } | '\231' { $$ = '\231'; } | '\232' { $$ = '\232'; }
401 | '\233' { $$ = '\233'; } | '\234' { $$ = '\234'; } | '\235' { $$ = '\235'; }
402 | '\236' { $$ = '\236'; } | '\237' { $$ = '\237'; } | '\240' { $$ = '\240'; }
403 | '\241' { $$ = '\241'; } | '\242' { $$ = '\242'; } | '\243' { $$ = '\243'; }
404 | '\244' { $$ = '\244'; } | '\245' { $$ = '\245'; } | '\246' { $$ = '\246'; }
405 | '\247' { $$ = '\247'; } | '\250' { $$ = '\250'; } | '\251' { $$ = '\251'; }
406 | '\252' { $$ = '\252'; } | '\253' { $$ = '\253'; } | '\254' { $$ = '\254'; }
407 | '\255' { $$ = '\255'; } | '\256' { $$ = '\256'; } | '\257' { $$ = '\257'; }
408 | '\260' { $$ = '\260'; } | '\261' { $$ = '\261'; } | '\262' { $$ = '\262'; }
409 | '\263' { $$ = '\263'; } | '\264' { $$ = '\264'; } | '\265' { $$ = '\265'; }
410 | '\266' { $$ = '\266'; } | '\267' { $$ = '\267'; } | '\270' { $$ = '\270'; }
411 | '\271' { $$ = '\271'; } | '\272' { $$ = '\272'; } | '\273' { $$ = '\273'; }
412 | '\274' { $$ = '\274'; } | '\275' { $$ = '\275'; } | '\276' { $$ = '\276'; }
413 | '\277' { $$ = '\277'; } | '\300' { $$ = '\300'; } | '\301' { $$ = '\301'; }
414 | '\302' { $$ = '\302'; } | '\303' { $$ = '\303'; } | '\304' { $$ = '\304'; }
415 | '\305' { $$ = '\305'; } | '\306' { $$ = '\306'; } | '\307' { $$ = '\307'; }
416 | '\310' { $$ = '\310'; } | '\311' { $$ = '\311'; } | '\312' { $$ = '\312'; }
417 | '\313' { $$ = '\313'; } | '\314' { $$ = '\314'; } | '\315' { $$ = '\315'; }
418 | '\316' { $$ = '\316'; } | '\317' { $$ = '\317'; } | '\320' { $$ = '\320'; }
419 | '\321' { $$ = '\321'; } | '\322' { $$ = '\322'; } | '\323' { $$ = '\323'; }
420 | '\324' { $$ = '\324'; } | '\325' { $$ = '\325'; } | '\326' { $$ = '\326'; }
421 | '\327' { $$ = '\327'; } | '\330' { $$ = '\330'; } | '\331' { $$ = '\331'; }
422 | '\332' { $$ = '\332'; } | '\333' { $$ = '\333'; } | '\334' { $$ = '\334'; }
423 | '\335' { $$ = '\335'; } | '\336' { $$ = '\336'; } | '\337' { $$ = '\337'; }
424 | '\340' { $$ = '\340'; } | '\341' { $$ = '\341'; } | '\342' { $$ = '\342'; }
425 | '\343' { $$ = '\343'; } | '\344' { $$ = '\344'; } | '\345' { $$ = '\345'; }
426 | '\346' { $$ = '\346'; } | '\347' { $$ = '\347'; } | '\350' { $$ = '\350'; }
427 | '\351' { $$ = '\351'; } | '\352' { $$ = '\352'; } | '\353' { $$ = '\353'; }
428 | '\354' { $$ = '\354'; } | '\355' { $$ = '\355'; } | '\356' { $$ = '\356'; }
429 | '\357' { $$ = '\357'; } | '\360' { $$ = '\360'; } | '\361' { $$ = '\361'; }
430 | '\362' { $$ = '\362'; } | '\363' { $$ = '\363'; } | '\364' { $$ = '\364'; }
431 | '\365' { $$ = '\365'; } | '\366' { $$ = '\366'; } | '\367' { $$ = '\367'; }
432 | '\370' { $$ = '\370'; } | '\371' { $$ = '\371'; } | '\372' { $$ = '\372'; }
433 | '\373' { $$ = '\373'; } | '\374' { $$ = '\374'; } | '\375' { $$ = '\375'; }
434 | '\376' { $$ = '\376'; } | '\377' { $$ = '\377'; }
435 ;
436
437 text : SP { $$ = " "; }
438 | string
439 | text SP { $$ = $1 + " "; }
440 | text string { $$ = $1 + $2; }
441 ;
442
443 stringval : '\'' text '\'' { $$ = $2; }
444 | '\"' text '\"' { $$ = $2; }
445 ;
446
447
448 // rules which are more or less just terminal symbols
449
450 SP : ' '
451 ;
452
453 LF : '\n'
454 ;
455
456 CR : '\r'
457 ;
458
459 ADD : 'A''D''D'
460 ;
461
462 GET : 'G''E''T'
463 ;
464
465 MAP : 'M''A''P'
466 ;
467
468 UNMAP : 'U''N''M''A''P'
469 ;
470
471 CLEAR : 'C''L''E''A''R'
472 ;
473
474 CREATE : 'C''R''E''A''T''E'
475 ;
476
477 DESTROY : 'D''E''S''T''R''O''Y'
478 ;
479
480 LIST : 'L''I''S''T'
481 ;
482
483 LOAD : 'L''O''A''D'
484 ;
485
486 ALL : 'A''L''L'
487 ;
488
489 NONE : 'N''O''N''E'
490 ;
491
492 DEFAULT : 'D''E''F''A''U''L''T'
493 ;
494
495 NON_MODAL : 'N''O''N''_''M''O''D''A''L'
496 ;
497
498 REMOVE : 'R''E''M''O''V''E'
499 ;
500
501 SET : 'S''E''T'
502 ;
503
504 SUBSCRIBE : 'S''U''B''S''C''R''I''B''E'
505 ;
506
507 UNSUBSCRIBE : 'U''N''S''U''B''S''C''R''I''B''E'
508 ;
509
510 SELECT : 'S''E''L''E''C''T'
511 ;
512
513 CHANNEL : 'C''H''A''N''N''E''L'
514 ;
515
516 AVAILABLE_ENGINES : 'A''V''A''I''L''A''B''L''E''_''E''N''G''I''N''E''S'
517 ;
518
519 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'
520 ;
521
522 CHANNELS : 'C''H''A''N''N''E''L''S'
523 ;
524
525 INFO : 'I''N''F''O'
526 ;
527
528 CHANNEL_COUNT : 'C''H''A''N''N''E''L''_''C''O''U''N''T'
529 ;
530
531 CHANNEL_INFO : 'C''H''A''N''N''E''L''_''I''N''F''O'
532 ;
533
534 BUFFER_FILL : 'B''U''F''F''E''R''_''F''I''L''L'
535 ;
536
537 STREAM_COUNT : 'S''T''R''E''A''M''_''C''O''U''N''T'
538 ;
539
540 VOICE_COUNT : 'V''O''I''C''E''_''C''O''U''N''T'
541 ;
542
543 TOTAL_VOICE_COUNT : 'T''O''T''A''L''_''V''O''I''C''E''_''C''O''U''N''T'
544 ;
545
546 TOTAL_VOICE_COUNT_MAX: 'T''O''T''A''L''_''V''O''I''C''E''_''C''O''U''N''T''_''M''A''X'
547 ;
548
549 INSTRUMENT : 'I''N''S''T''R''U''M''E''N''T'
550 ;
551
552 ENGINE : 'E' 'N' 'G' 'I' 'N' 'E'
553 ;
554
555 ON_DEMAND : 'O''N''_''D''E''M''A''N''D'
556 ;
557
558 ON_DEMAND_HOLD : 'O''N''_''D''E''M''A''N''D''_''H''O''L''D'
559 ;
560
561 PERSISTENT : 'P''E''R''S''I''S''T''E''N''T'
562 ;
563
564 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'
565 ;
566
567 AUDIO_OUTPUT_DEVICES : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''E''V''I''C''E''S'
568 ;
569
570 AUDIO_OUTPUT_DEVICE : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''E''V''I''C''E'
571 ;
572
573 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'
574 ;
575
576 AUDIO_OUTPUT_DRIVER : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''R''I''V''E''R'
577 ;
578
579 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'
580 ;
581
582 AUDIO_OUTPUT_CHANNEL : 'A''U''D''I''O''_''O''U''T''P''U''T''_''C''H''A''N''N''E''L'
583 ;
584
585 AUDIO_OUTPUT_TYPE : 'A''U''D''I''O''_''O''U''T''P''U''T''_''T''Y''P''E'
586 ;
587
588 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'
589 ;
590
591 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'
592 ;
593
594 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'
595 ;
596
597 MIDI_INPUT_DEVICES : 'M''I''D''I''_''I''N''P''U''T''_''D''E''V''I''C''E''S'
598 ;
599
600 MIDI_INPUT_DEVICE : 'M''I''D''I''_''I''N''P''U''T''_''D''E''V''I''C''E'
601 ;
602
603 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'
604 ;
605
606 MIDI_INSTRUMENT : 'M''I''D''I''_''I''N''S''T''R''U''M''E''N''T'
607 ;
608
609 MIDI_INSTRUMENTS : 'M''I''D''I''_''I''N''S''T''R''U''M''E''N''T''S'
610 ;
611
612 MIDI_INSTRUMENT_MAP : 'M''I''D''I''_''I''N''S''T''R''U''M''E''N''T''_''M''A''P'
613 ;
614
615 MIDI_INSTRUMENT_MAPS : 'M''I''D''I''_''I''N''S''T''R''U''M''E''N''T''_''M''A''P''S'
616 ;
617
618 MIDI_INPUT_DRIVER : 'M''I''D''I''_''I''N''P''U''T''_''D''R''I''V''E''R'
619 ;
620
621 MIDI_INPUT_PORT : 'M''I''D''I''_''I''N''P''U''T''_''P''O''R''T'
622 ;
623
624 MIDI_INPUT_CHANNEL : 'M''I''D''I''_''I''N''P''U''T''_''C''H''A''N''N''E''L'
625 ;
626
627 MIDI_INPUT_TYPE : 'M''I''D''I''_''I''N''P''U''T''_''T''Y''P''E'
628 ;
629
630 MIDI_INPUT : 'M''I''D''I''_''I''N''P''U''T'
631 ;
632
633 SERVER : 'S''E''R''V''E''R'
634 ;
635
636 VOLUME : 'V''O''L''U''M''E'
637 ;
638
639 MUTE : 'M''U''T''E'
640 ;
641
642 SOLO : 'S''O''L''O'
643 ;
644
645 BYTES : 'B''Y''T''E''S'
646 ;
647
648 PERCENTAGE : 'P''E''R''C''E''N''T''A''G''E'
649 ;
650
651 RESET : 'R''E''S''E''T'
652 ;
653
654 MISCELLANEOUS : 'M''I''S''C''E''L''L''A''N''E''O''U''S'
655 ;
656
657 NAME : 'N''A''M''E'
658 ;
659
660 ECHO : 'E''C''H''O'
661 ;
662
663 QUIT : 'Q''U''I''T'
664 ;
665
666 %%
667
668 /**
669 * Will be called when an error occured (usually syntax error).
670 */
671 void yyerror(const char* s) {
672 dmsg(2,("LSCPParser: %s\n", s));
673 }
674
675 /**
676 * Clears input buffer.
677 */
678 void restart(yyparse_param_t* pparam, int& yychar) {
679 bytes = 0;
680 ptr = 0;
681 }

  ViewVC Help
Powered by ViewVC