/[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 219 - (hide annotations) (download)
Tue Aug 17 20:35:04 2004 UTC (19 years, 8 months ago) by schoenebeck
File size: 30844 byte(s)
* completely removed the lex scanner and replaced it by pure yacc rules
  for all terminal symbols (that is command keywords and variables) to
  avoid misunderstandings while parsing (e.g. recognition of command
  keywords in string arguments)
* src/drivers/audio/AudioChannel.cpp: changed channel parameter 'Name' to
 'NAME' as defined in the LSCP documentation

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

  ViewVC Help
Powered by ViewVC