1 %{ // -*-Fundamental-*-
10 #include "scommands.hh"
12 #include "parseconstruct.hh"
14 #include "identifier.hh"
20 svec<Request*> pre_reqs, post_reqs;
28 Score_commands *scommands;
39 svec<String> * strvec;
42 %token VOICE STAFF SCORE TITLE RHYTHMSTAFF BAR NOTENAME OUTPUT
43 %token CM IN PT MM PAPER WIDTH METER UNITSPACE SKIP COMMANDS
44 %token MELODICSTAFF GEOMETRIC START_T DURATIONCOMMAND OCTAVECOMMAND
45 %token KEY CLEF VIOLIN BASS
47 %token <id> IDENTIFIER
48 %token <string> NEWIDENTIFIER
49 %token <string> PITCH DURATION RESTNAME
51 %token <string> STRING
52 %token <i> OPEN_REQUEST_PARENS CLOSE_REQUEST_PARENS
57 %type <id> declaration
58 %type <paper> paper_block paper_body
60 %type <voice> voice_block voice_body voice_elts voice_elts_dollar
62 %type <command> score_command
63 %type <score> score_block score_body
64 %type <staff> staff_block rhythmstaff_block rhythmstaff_body
65 %type <staff> melodicstaff_block melodicstaff_body staffdecl
67 %type <scommands> score_commands_block score_commands_body
68 %type <request> post_request pre_request
69 %type <strvec> pitch_list
70 %type <string> clef_id
74 | mudela score_block {
77 | mudela add_declaration { }
80 add_declaration: declaration {
86 NEWIDENTIFIER '=' staff_block {
87 $$ = new Staff_id(*$1, $3);
88 delete $1; // this sux
90 | NEWIDENTIFIER '=' voice_block {
91 $$ = new Voice_id(*$1, $3);
97 score_block: SCORE '{' score_body '}' { $$ = $3; }
100 score_body: { $$ = new Score; }
101 | score_body staff_block { $$->add($2); }
102 | score_body score_commands_block { $$->set($2); }
103 | score_body paper_block { $$->set($2); }
105 score_commands_block:
106 COMMANDS '{' score_commands_body '}' { $$ =$3;}
109 score_commands_body: { $$ = new Score_commands; }
110 | score_commands_body score_command {
116 PAPER '{' paper_body '}' { $$ = $3; }
120 /* empty */ { $$ = new Paperdef; }
121 | paper_body WIDTH dim { $$->linewidth = $3;}
122 | paper_body OUTPUT STRING { $$->outfile = *$3;
125 | paper_body UNITSPACE dim { $$->whole_width = $3; }
126 | paper_body GEOMETRIC REAL { $$->geometric_ = $3; }
130 REAL unit { $$ = convert_dimen($1,$2); }
134 unit: CM { $$ = "cm"; }
149 staffdecl: STAFF '{' IDENTIFIER '}' { $$ = $3->staff()->clone(); }
153 RHYTHMSTAFF '{' rhythmstaff_body '}' { $$ = $3; }
157 /* empty */ { $$ = get_new_rhythmstaff(); }
158 | rhythmstaff_body voice_block { $$->add_voice($2); }
162 MELODICSTAFF '{' melodicstaff_body '}' { $$ = $3; }
166 /* empty */ { $$ = get_new_melodicstaff(); }
167 | melodicstaff_body voice_block { $$->add_voice($2); }
174 VOICE '{' voice_body '}' { $$ = $3; }
179 IDENTIFIER { $$ = new Voice(*$1->voice()); }
180 | voice_elts_dollar { $$ = $1; }
181 | voice_body START_T REAL { $$->start = $3; }
188 '$' voice_elts '$' { $$ = $2; }
195 | voice_elts pre_requests voice_elt post_requests {
196 add_requests($3, pre_reqs);
197 add_requests($3, post_reqs);
201 | voice_elts voice_command { }
206 assert(post_reqs.empty());
208 | post_requests post_request {
214 CLOSE_REQUEST_PARENS { $$ = get_request($1); }
218 | pre_requests pre_request {
224 OPEN_REQUEST_PARENS { $$ = get_request($1); }
229 DURATIONCOMMAND DURATION {
230 set_default_duration(*$2);
233 | OCTAVECOMMAND PITCH {
234 set_default_pitch(*$2);
241 $$ = get_note_element(*$1, *$2);
245 | RESTNAME DURATION {
246 $$ = get_rest_element(*$1, *$2);
250 | PITCH { $$ = get_note_element(*$1, "");
253 | RESTNAME { $$ = get_rest_element(*$1, "");
259 $$ = new svec<String>;
268 $$ = get_skip_command($2, $4);
271 $$ = get_meterchange_command($2, $3);
273 | KEY '$' pitch_list '$' {/*UGH*/
274 $$ = get_key_interpret_command(*$3);
278 $$ = get_clef_interpret_command(*$2);
281 /* | PARTIALMEASURE REAL {
282 $$ = get_partial_command($2);
287 VIOLIN { $$ = new String("violin"); }
288 | BASS { $$ = new String("bass"); }
293 if (ABS($1-Real(int($$))) > 1e-8)
294 yyerror("expecting integer number");
304 *mlog << "Parsing ... ";
306 yydebug = !monitor.silence("Parser");
310 delete_identifiers();