1 %{ // -*-Fundamental-*-
6 #include "inputstaff.hh"
7 #include "inputscore.hh"
8 #include "inputmusic.hh"
11 #include "inputcommand.hh"
13 #include "parseconstruct.hh"
15 #include "identifier.hh"
22 svec<Request*> pre_reqs, post_reqs;
28 Input_command *command;
36 Horizontal_music *horizontal;
37 Vertical_music *vertical;
38 Music_general_chord *chord;
43 svec<String> * strvec;
44 svec<Input_command*> *commandvec;
45 Voice_list *voicelist;
50 %token VOICE STAFF SCORE TITLE BAR NOTENAME OUTPUT
51 %token CM IN PT MM PAPER WIDTH METER UNITSPACE SKIP COMMANDS
52 %token GEOMETRIC START_T DURATIONCOMMAND OCTAVECOMMAND
53 %token KEY CLEF VIOLIN BASS MULTI TABLE CHORD VOICES
54 %token PARTIAL RHYTHMIC MELODIC MUSIC
56 %token <id> IDENTIFIER
57 %token <string> NEWIDENTIFIER
58 %token <string> PITCH DURATION RESTNAME
60 %token <string> STRING
61 %token <i> OPEN_REQUEST_PARENS CLOSE_REQUEST_PARENS
66 %type <id> declaration
67 %type <paper> paper_block paper_body
70 %type <el> voice_elt full_element
71 %type <command> score_command staff_command skipcommand
72 %type <score> score_block score_body
73 %type <staff> staff_block staff_init staff_body
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
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 '=' music_voice {
108 $$ = new M_voice_id(*$1, $3);
111 | NEWIDENTIFIER '=' music_chord {
112 $$ = new M_chord_id(*$1, $3);
121 score_block: SCORE '{' score_body '}' { $$ = $3; }
124 score_body: { $$ = new Input_score; }
125 | score_body staff_block { $$->add($2); }
126 | score_body score_commands_block {
130 | score_body paper_block { $$->set($2); }
135 score_commands_block:
136 COMMANDS '{' score_commands_body '}' { $$ =$3;}
139 score_commands_body: { $$ = new svec<Input_command*>; }
140 | score_commands_body score_command {
145 staff_commands_block: COMMANDS '{' staff_commands_body '}' {
150 /* empty */ { $$ = new svec<Input_command*>; }
151 | staff_commands_body staff_command {
158 | KEY pitch_list {/*UGH*/
159 $$ = get_key_interpret_command(*$2);
163 $$ = get_clef_interpret_command(*$2);
170 $$ = get_skip_command($2, $4);
176 $$ = get_meterchange_command($2, $3);
179 $$ = get_partial_command($2);
188 PAPER '{' paper_body '}' { $$ = $3; }
192 /* empty */ { $$ = new Paperdef; }
193 | paper_body WIDTH dim { $$->linewidth = $3;}
194 | paper_body OUTPUT STRING { $$->outfile = *$3;
197 | paper_body UNITSPACE dim { $$->whole_width = $3; }
198 | paper_body GEOMETRIC REAL { $$->geometric_ = $3; }
204 STAFF '{' staff_body '}' { $$ = $3; }
210 IDENTIFIER { $$ = new Input_staff(*$1->staff()); }
212 $$ = new Input_staff("rhythmic");
215 $$ = new Input_staff( "melodic");
221 | staff_body horizontal_music {
224 | staff_body staff_commands_block {
234 music_voice { $$ = $1; }
238 music_chord { $$ = $1; }
241 music_voice: MUSIC '{' music_voice_body '}' { $$ = $3; }
245 $$ = new Music_voice;
247 | music_voice_body IDENTIFIER {
248 $$->concatenate($2->mvoice());
250 | music_voice_body full_element {
253 | music_voice_body voice_command {
255 | music_voice_body vertical_music {
261 music_chord: CHORD '{' music_chord_body '}' { $$ = $3; }
265 $$ = new Music_general_chord;
267 | music_voice_body IDENTIFIER {
268 $$->concatenate($2->mchord());
270 | music_chord_body horizontal_music {
280 full_element: pre_requests voice_elt post_requests {
281 add_requests($2, pre_reqs);
282 add_requests($2, post_reqs);
289 assert(post_reqs.empty());
291 | post_requests post_request {
297 CLOSE_REQUEST_PARENS { $$ = get_request($1); }
301 | pre_requests pre_request {
307 OPEN_REQUEST_PARENS { $$ = get_request($1); }
311 DURATIONCOMMAND '{' DURATION '}' {
312 set_default_duration(*$3);
315 | OCTAVECOMMAND '{' PITCH '}' {
316 set_default_pitch(*$3);
323 $$ = get_note_element(*$1, *$2);
327 | RESTNAME DURATION {
328 $$ = get_rest_element(*$1, *$2);
332 | PITCH { $$ = get_note_element(*$1, "");
335 | RESTNAME { $$ = get_rest_element(*$1, "");
343 $$ = new svec<String>;
353 if (ABS($1-Real(int($$))) > 1e-8)
354 yyerror("expecting integer number");
361 REAL unit { $$ = convert_dimen($1,$2); }
365 unit: CM { $$ = "cm"; }
372 VIOLIN { $$ = new String("violin"); }
373 | BASS { $$ = new String("bass"); }
380 *mlog << "Parsing ... ";
383 yydebug = !monitor.silence("Parser") & check_debug;
388 delete_identifiers();