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;
41 %token VOICE STAFF SCORE TITLE RHYTHMSTAFF BAR NOTENAME OUTPUT
42 %token CM IN PT MM PAPER WIDTH METER UNITSPACE SKIP COMMANDS
43 %token MELODICSTAFF GEOMETRIC START_T DURATIONCOMMAND OCTAVECOMMAND
45 %token <id> IDENTIFIER
46 %token <string> NEWIDENTIFIER
47 %token <string> PITCH DURATION RESTNAME
49 %token <string> STRING
50 %token <i> OPEN_REQUEST_PARENS CLOSE_REQUEST_PARENS
55 %type <id> declaration
56 %type <paper> paper_block paper_body
58 %type <voice> voice_block voice_body voice_elts voice_elts_dollar
60 %type <command> score_command
61 %type <score> score_block score_body
62 %type <staff> staff_block rhythmstaff_block rhythmstaff_body
63 %type <staff> melodicstaff_block melodicstaff_body staffdecl
65 %type <scommands> score_commands_block score_commands_body
66 %type <request> post_request pre_request
72 | mudela score_block {
75 | mudela add_declaration { }
78 add_declaration: declaration {
84 NEWIDENTIFIER '=' staff_block {
85 $$ = new Staff_id(*$1, $3);
86 delete $1; // this sux
88 | NEWIDENTIFIER '=' voice_block {
89 $$ = new Voice_id(*$1, $3);
95 score_block: SCORE '{' score_body '}' { $$ = $3; }
98 score_body: { $$ = new Score; }
99 | score_body staff_block { $$->add($2); }
100 | score_body score_commands_block { $$->set($2); }
101 | score_body paper_block { $$->set($2); }
103 score_commands_block:
104 COMMANDS '{' score_commands_body '}' { $$ =$3;}
107 score_commands_body: { $$ = new Score_commands; }
108 | score_commands_body score_command {
114 PAPER '{' paper_body '}' { $$ = $3; }
118 /* empty */ { $$ = new Paperdef; }
119 | paper_body WIDTH dim { $$->linewidth = $3;}
120 | paper_body OUTPUT STRING { $$->outfile = *$3;
123 | paper_body UNITSPACE dim { $$->whole_width = $3; }
124 | paper_body GEOMETRIC REAL { $$->geometric_ = $3; }
128 REAL unit { $$ = convert_dimen($1,$2); }
132 unit: CM { $$ = "cm"; }
147 staffdecl: STAFF '{' IDENTIFIER '}' { $$ = $3->staff()->clone(); }
151 RHYTHMSTAFF '{' rhythmstaff_body '}' { $$ = $3; }
155 /* empty */ { $$ = get_new_rhythmstaff(); }
156 | rhythmstaff_body voice_block { $$->add_voice($2); }
160 MELODICSTAFF '{' melodicstaff_body '}' { $$ = $3; }
164 /* empty */ { $$ = get_new_melodicstaff(); }
165 | melodicstaff_body voice_block { $$->add_voice($2); }
172 VOICE '{' voice_body '}' { $$ = $3; }
177 IDENTIFIER { $$ = new Voice(*$1->voice()); }
178 | voice_elts_dollar { $$ = $1; }
179 | voice_body START_T REAL { $$->start = $3; }
186 '$' voice_elts '$' { $$ = $2; }
193 | voice_elts pre_requests voice_elt post_requests {
194 add_requests($3, pre_reqs);
195 add_requests($3, post_reqs);
199 | voice_elts voice_command { }
204 assert(post_reqs.empty());
206 | post_requests post_request {
212 CLOSE_REQUEST_PARENS { $$ = get_request($1); }
216 | pre_requests pre_request {
222 OPEN_REQUEST_PARENS { $$ = get_request($1); }
227 DURATIONCOMMAND DURATION {
228 set_default_duration(*$2);
231 | OCTAVECOMMAND PITCH {
232 set_default_pitch(*$2);
239 $$ = get_note_element(*$1, *$2);
243 | RESTNAME DURATION {
244 $$ = get_rest_element(*$1, *$2);
248 | PITCH { $$ = get_note_element(*$1, "");
251 | RESTNAME { $$ = get_rest_element(*$1, "");
258 $$ = get_skip_command($2, $4);
261 $$ = get_meterchange_command($2, $3);
263 /* | PARTIALMEASURE REAL {
264 $$ = get_partial_command($2);
272 if (ABS($1-Real(int($$))) > 1e-8)
273 yyerror("expecting integer number");
283 *mlog << "Parsing ... ";
285 yydebug = !monitor.silence("Parser");
289 delete_identifiers();