1 %{ // -*-Fundamental-*-
10 #include "getcommand.hh"
12 #include "parseconstruct.hh"
14 #include "identifier.hh"
15 #include "inputmusic.hh"
21 svec<Request*> pre_reqs, post_reqs;
37 Horizontal_music *horizontal;
38 Vertical_music *vertical;
39 Music_general_chord *chord;
44 svec<String> * strvec;
45 svec<Command*> *commandvec;
46 Voice_list *voicelist;
49 %token VOICE STAFF SCORE TITLE RHYTHMSTAFF BAR NOTENAME OUTPUT
50 %token CM IN PT MM PAPER WIDTH METER UNITSPACE SKIP COMMANDS
51 %token MELODICSTAFF GEOMETRIC START_T DURATIONCOMMAND OCTAVECOMMAND
52 %token KEY CLEF VIOLIN BASS MULTI TABLE CHORD VOICES
55 %token <id> IDENTIFIER
56 %token <string> NEWIDENTIFIER
57 %token <string> PITCH DURATION RESTNAME
59 %token <string> STRING
60 %token <i> OPEN_REQUEST_PARENS CLOSE_REQUEST_PARENS
65 %type <id> declaration
66 %type <paper> paper_block paper_body
69 %type <el> voice_elt full_element
70 %type <command> score_command staff_command skipcommand
71 %type <score> score_block score_body
72 %type <staff> staff_block rhythmstaff_block rhythmstaff_body
73 %type <staff> melodicstaff_block melodicstaff_body staffdecl
75 %type <commandvec> score_commands_block score_commands_body
76 %type <commandvec> staff_commands_block staff_commands_body
77 %type <request> post_request pre_request
78 %type <strvec> pitch_list
79 %type <string> clef_id
80 %type <vertical> vertical_music
81 %type <chord> music_chord music_chord_body
82 %type <horizontal> horizontal_music
83 %type <mvoice> music_voice_body music_voice
84 %type <voicelist> voices
89 | mudela score_block {
92 | mudela add_declaration { }
97 add_declaration: declaration {
103 NEWIDENTIFIER '=' staff_block {
104 $$ = new Staff_id(*$1, $3);
105 delete $1; // this sux
107 | NEWIDENTIFIER '=' voices {
108 $$ = new Voices_id(*$1, $3);
117 score_block: SCORE '{' score_body '}' { $$ = $3; }
120 score_body: { $$ = new Score; }
121 | score_body staff_block { $$->add($2); }
122 | score_body score_commands_block {
126 | score_body paper_block { $$->set($2); }
131 score_commands_block:
132 COMMANDS '{' score_commands_body '}' { $$ =$3;}
135 score_commands_body: { $$ = new svec<Command*>; }
136 | score_commands_body score_command {
141 staff_commands_block: COMMANDS '{' staff_commands_body '}' {
146 /* empty */ { $$ = new svec<Command*>; }
147 | staff_commands_body staff_command {
154 | KEY '$' pitch_list '$' {/*UGH*/
155 $$ = get_key_interpret_command(*$3);
159 $$ = get_clef_interpret_command(*$2);
166 $$ = get_skip_command($2, $4);
172 $$ = get_meterchange_command($2, $3);
175 $$ = get_partial_command($2);
184 PAPER '{' paper_body '}' { $$ = $3; }
188 /* empty */ { $$ = new Paperdef; }
189 | paper_body WIDTH dim { $$->linewidth = $3;}
190 | paper_body OUTPUT STRING { $$->outfile = *$3;
193 | paper_body UNITSPACE dim { $$->whole_width = $3; }
194 | paper_body GEOMETRIC REAL { $$->geometric_ = $3; }
205 staffdecl: STAFF '{' IDENTIFIER '}' { $$ = $3->staff()->clone(); }
209 RHYTHMSTAFF '{' rhythmstaff_body '}' { $$ = $3; }
213 /* empty */ { $$ = get_new_rhythmstaff(); }
214 | rhythmstaff_body voices { $$->add(*$2);
217 | rhythmstaff_body staff_commands_block {
224 MELODICSTAFF '{' melodicstaff_body '}' { $$ = $3; }
228 /* empty */ { $$ = get_new_melodicstaff(); }
229 | melodicstaff_body voices {
233 | melodicstaff_body staff_commands_block {
234 $$->input_commands_.add(get_reset_command());
241 '$' music_voice_body '$' {
242 $$ = new Voice_list($2->convert());
244 | VOICES '{' IDENTIFIER '}' {
245 $$ = new Voice_list(*$3->voices());
251 music_voice { $$ = $1; }
255 music_chord { $$ = $1; }
258 music_voice: VOICE '{' music_voice_body '}' { $$ = $3; }
262 $$ = new Music_voice;
264 | music_voice_body full_element {
267 | music_voice_body voice_command {
269 | music_voice_body vertical_music {
275 music_chord: CHORD '{' music_chord_body '}' { $$ = $3; }
279 $$ = new Music_general_chord;
281 | music_chord_body horizontal_music {
291 full_element: pre_requests voice_elt post_requests {
292 add_requests($2, pre_reqs);
293 add_requests($2, post_reqs);
300 assert(post_reqs.empty());
302 | post_requests post_request {
308 CLOSE_REQUEST_PARENS { $$ = get_request($1); }
312 | pre_requests pre_request {
318 OPEN_REQUEST_PARENS { $$ = get_request($1); }
322 DURATIONCOMMAND '{' DURATION '}' {
323 set_default_duration(*$3);
326 | OCTAVECOMMAND '{' PITCH '}' {
327 set_default_pitch(*$3);
334 $$ = get_note_element(*$1, *$2);
338 | RESTNAME DURATION {
339 $$ = get_rest_element(*$1, *$2);
343 | PITCH { $$ = get_note_element(*$1, "");
346 | RESTNAME { $$ = get_rest_element(*$1, "");
354 $$ = new svec<String>;
364 if (ABS($1-Real(int($$))) > 1e-8)
365 yyerror("expecting integer number");
372 REAL unit { $$ = convert_dimen($1,$2); }
376 unit: CM { $$ = "cm"; }
383 VIOLIN { $$ = new String("violin"); }
384 | BASS { $$ = new String("bass"); }
391 *mlog << "Parsing ... ";
394 yydebug = !monitor.silence("Parser") & check_debug;
399 delete_identifiers();