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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 705 - (hide annotations) (download)
Wed Jul 20 21:43:23 2005 UTC (18 years, 9 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 schoenebeck 35 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5 schoenebeck 56 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 schoenebeck 483 * Copyright (C) 2005 Christian Schoenebeck *
7 schoenebeck 35 * *
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 schoenebeck 210 /* Note: don't forget to run 'make parser' after you changed this file, */
25     /* otherwise the parser will not be regenerated! */
26    
27 schoenebeck 35 %{
28    
29     #include "lscpparser.h"
30     #include "lscpserver.h"
31 senkov 170 #include "lscpevent.h"
32 schoenebeck 35
33     // to save us typing work in the rules action definitions
34     #define LSCPSERVER ((yyparse_param_t*) yyparse_param)->pServer
35    
36 schoenebeck 219 // clears input buffer
37 schoenebeck 35 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 schoenebeck 219 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 schoenebeck 35 %}
65    
66     // reentrant parser
67     %pure_parser
68    
69 schoenebeck 219 %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 schoenebeck 483 %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 schoenebeck 35 %type <FillResponse> buffer_size_type
74 schoenebeck 123 %type <KeyValList> key_val_list
75 schoenebeck 35
76     %start input
77    
78     %%
79    
80     //TODO: return more meaningful error messages
81    
82 schoenebeck 573 /*
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 senkov 170 input : line LF
91 schoenebeck 219 | line CR LF
92     ;
93 schoenebeck 35
94 senkov 170 line : /* epsilon (empty line ignored) */ { return LSCP_DONE; }
95     | comment { return LSCP_DONE; }
96     | command { LSCPSERVER->AnswerClient($1); return LSCP_DONE; }
97 schoenebeck 555 | error { LSCPSERVER->AnswerClient("ERR:0:Unknown command.\r\n"); RESTART; return LSCP_SYNTAX_ERROR; }
98 schoenebeck 35 ;
99    
100 schoenebeck 219 comment : '#'
101     | comment '#'
102 schoenebeck 111 | comment SP
103 schoenebeck 219 | comment number
104 schoenebeck 111 | comment string
105     ;
106    
107 schoenebeck 219 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 senkov 397 | SELECT SP text { $$ = LSCPSERVER->QueryDatabase($3); }
118 schoenebeck 219 | RESET SP CHANNEL SP sampler_channel { $$ = LSCPSERVER->ResetChannel($5); }
119     | RESET { $$ = LSCPSERVER->ResetSampler(); }
120     | QUIT { LSCPSERVER->AnswerClient("Bye!\r\n"); return LSCP_QUIT; }
121 schoenebeck 35 ;
122    
123 schoenebeck 556 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 senkov 135 ;
130    
131 schoenebeck 556 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 senkov 135 ;
138    
139 schoenebeck 219 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 schoenebeck 563 | SERVER SP INFO { $$ = LSCPSERVER->GetServerInfo(); }
163 schoenebeck 35 ;
164    
165 schoenebeck 483 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 schoenebeck 123 ;
172    
173 schoenebeck 219 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 schoenebeck 123 ;
178    
179 schoenebeck 219 destroy_instruction : AUDIO_OUTPUT_DEVICE SP number { $$ = LSCPSERVER->DestroyAudioOutputDevice($3); }
180     | MIDI_INPUT_DEVICE SP number { $$ = LSCPSERVER->DestroyMidiInputDevice($3); }
181 schoenebeck 123 ;
182    
183 schoenebeck 35 load_instruction : INSTRUMENT SP load_instr_args { $$ = $3; }
184     | ENGINE SP load_engine_args { $$ = $3; }
185     ;
186    
187 schoenebeck 219 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 schoenebeck 705 | MUTE SP sampler_channel SP boolean { $$ = LSCPSERVER->SetChannelMute($5, $3); }
197     | SOLO SP sampler_channel SP boolean { $$ = LSCPSERVER->SetChannelSolo($5, $3); }
198 schoenebeck 35 ;
199    
200 schoenebeck 483 key_val_list : string '=' param_val_list { $$[$1] = $3; }
201     | key_val_list SP string '=' param_val_list { $$ = $1; $$[$3] = $5; }
202 senkov 135 ;
203 schoenebeck 123
204 schoenebeck 35 buffer_size_type : BYTES { $$ = fill_response_bytes; }
205     | PERCENTAGE { $$ = fill_response_percentage; }
206     ;
207    
208 capela 527 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 schoenebeck 123 ;
215    
216 schoenebeck 219 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 schoenebeck 35 ;
219    
220 schoenebeck 411 load_engine_args : engine_name SP sampler_channel { $$ = LSCPSERVER->SetEngineType($1, $3); }
221 schoenebeck 35 ;
222    
223 schoenebeck 219 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 schoenebeck 274 | ALL { $$ = 16; }
237 schoenebeck 219 ;
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 schoenebeck 483 param_val_list : param_val
259     | param_val_list','param_val { $$ = $1 + "," + $3; }
260     ;
261    
262 schoenebeck 219 param_val : string
263 schoenebeck 483 | '\'' 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 schoenebeck 219 ;
268    
269 schoenebeck 573 // GRAMMAR_BNF_END - do NOT delete or modify this line !!!
270 schoenebeck 219
271 schoenebeck 573
272 schoenebeck 219 // atomic variable symbol rules
273    
274     boolean : number { $$ = $1; }
275     | string { $$ = -1; }
276 capela 159 ;
277    
278 schoenebeck 219 string : char { std::string s; s = $1; $$ = s; }
279     | string char { $$ = $1 + $2; }
280 capela 159 ;
281    
282 schoenebeck 225 dotnum : digits '.' digits { $$ = atof(String($1 + "." + $3).c_str()); }
283 schoenebeck 219 | '+' digits '.' digits { String s = "+"; s += $2; s += "."; s += $4; $$ = atof(s.c_str()); }
284     | '-' digits '.' digits { $$ = atof(String("-" + $2 + "." + $4).c_str()); }
285 capela 143 ;
286    
287 schoenebeck 219
288     digits : digit { $$ = $1; }
289     | digits digit { $$ = $1 + $2; }
290 senkov 155 ;
291    
292 schoenebeck 219 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 senkov 155 ;
303    
304 schoenebeck 219 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 schoenebeck 226 | '!' { $$ = '!'; } | '#' { $$ = '#'; } | '$' { $$ = '$'; } | '%' { $$ = '%'; } | '&' { $$ = '&'; } | '(' { $$ = '('; } | ')' { $$ = ')'; } | '*' { $$ = '*'; } | '+' { $$ = '+'; } | '-' { $$ = '-'; } | '.' { $$ = '.'; } | ',' { $$ = ','; } | '/' { $$ = '/'; }
319 schoenebeck 219 | ':' { $$ = ':'; } | ';' { $$ = ';'; } | '<' { $$ = '<'; } | '=' { $$ = '='; } | '>' { $$ = '>'; } | '?' { $$ = '?'; } | '@' { $$ = '@'; }
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 senkov 155 ;
366    
367 schoenebeck 221 text : SP { $$ = " "; }
368     | string
369     | text SP { $$ = $1 + " "; }
370     | text string { $$ = $1 + $2; }
371 schoenebeck 35 ;
372    
373 schoenebeck 225 stringval : '\'' text '\'' { $$ = $2; }
374     | '\"' text '\"' { $$ = $2; }
375 schoenebeck 221 ;
376 schoenebeck 219
377 schoenebeck 221
378 schoenebeck 219 // rules which are more or less just terminal symbols
379    
380     SP : ' '
381 schoenebeck 35 ;
382    
383 schoenebeck 219 LF : '\n'
384 schoenebeck 35 ;
385    
386 schoenebeck 219 CR : '\r'
387 schoenebeck 35 ;
388    
389 schoenebeck 219 ADD : 'A''D''D'
390 schoenebeck 35 ;
391    
392 schoenebeck 219 GET : 'G''E''T'
393 schoenebeck 35 ;
394    
395 schoenebeck 219 CREATE : 'C''R''E''A''T''E'
396 schoenebeck 35 ;
397    
398 schoenebeck 219 DESTROY : 'D''E''S''T''R''O''Y'
399 schoenebeck 210 ;
400    
401 schoenebeck 219 LIST : 'L''I''S''T'
402 schoenebeck 35 ;
403    
404 schoenebeck 219 LOAD : 'L''O''A''D'
405     ;
406    
407 schoenebeck 228 ALL : 'A''L''L'
408     ;
409    
410 schoenebeck 219 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 senkov 397 SELECT : 'S''E''L''E''C''T'
426     ;
427    
428 schoenebeck 219 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 schoenebeck 556 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 schoenebeck 219 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 schoenebeck 563 SERVER : 'S''E''R''V''E''R'
522     ;
523    
524 schoenebeck 219 VOLUME : 'V''O''L''U''M''E'
525     ;
526    
527 schoenebeck 705 MUTE : 'M''U''T''E'
528     ;
529    
530     SOLO : 'S''O''L''O'
531     ;
532    
533 schoenebeck 219 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 schoenebeck 35 %%
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 schoenebeck 219 * Clears input buffer.
562 schoenebeck 35 */
563     void restart(yyparse_param_t* pparam, int& yychar) {
564 schoenebeck 219 bytes = 0;
565     ptr = 0;
566 schoenebeck 35 }

  ViewVC Help
Powered by ViewVC