#include "lexer.hh"
#include "paper.hh"
-#include "staff.hh"
-#include "score.hh"
+#include "inputstaff.hh"
+#include "inputscore.hh"
+#include "inputmusic.hh"
#include "main.hh"
#include "keyword.hh"
-#include "scommands.hh"
+#include "inputcommand.hh"
#include "debug.hh"
#include "parseconstruct.hh"
#include "dimen.hh"
#include "identifier.hh"
+
#ifndef NDEBUG
#define YYDEBUG 1
#endif
%union {
Real real;
- Command *command;
+ Input_command *command;
Identifier *id;
- Score_commands *scommands;
Voice *voice;
Voice_element *el;
- Staff *staff;
String *string;
- Score *score;
const char *consstr;
Paperdef *paper;
Request* request;
+ Horizontal_music *horizontal;
+ Vertical_music *vertical;
+ Music_general_chord *chord;
+ Music_voice *mvoice;
int i;
char c;
+
svec<String> * strvec;
+ svec<Input_command*> *commandvec;
+ Voice_list *voicelist;
+ Input_staff *staff;
+ Input_score *score;
}
-%token VOICE STAFF SCORE TITLE RHYTHMSTAFF BAR NOTENAME OUTPUT
+%token VOICE STAFF SCORE TITLE BAR NOTENAME OUTPUT
%token CM IN PT MM PAPER WIDTH METER UNITSPACE SKIP COMMANDS
-%token MELODICSTAFF GEOMETRIC START_T DURATIONCOMMAND OCTAVECOMMAND
-%token KEY CLEF VIOLIN BASS
+%token GEOMETRIC START_T DURATIONCOMMAND OCTAVECOMMAND
+%token KEY CLEF VIOLIN BASS MULTI TABLE CHORD VOICES
+%token PARTIAL RHYTHMIC MELODIC MUSIC
%token <id> IDENTIFIER
%token <string> NEWIDENTIFIER
%type <id> declaration
%type <paper> paper_block paper_body
%type <real> dim
-%type <voice> voice_block voice_body voice_elts voice_elts_dollar
-%type <el> voice_elt
-%type <command> score_command
+
+%type <el> voice_elt full_element
+%type <command> score_command staff_command skipcommand
%type <score> score_block score_body
-%type <staff> staff_block rhythmstaff_block rhythmstaff_body
-%type <staff> melodicstaff_block melodicstaff_body staffdecl
+%type <staff> staff_block staff_init staff_body
%type <i> int
-%type <scommands> score_commands_block score_commands_body
+%type <commandvec> score_commands_block score_commands_body
+%type <commandvec> staff_commands_block staff_commands_body
%type <request> post_request pre_request
%type <strvec> pitch_list
%type <string> clef_id
+%type <vertical> vertical_music
+%type <chord> music_chord music_chord_body
+%type <horizontal> horizontal_music
+%type <mvoice> music_voice_body music_voice
+
+
%%
mudela: /* empty */
| mudela score_block {
add_score($2);
}
- | mudela add_declaration { }
+ | mudela add_declaration { }
;
-
+/*
+ DECLARATIONS
+*/
add_declaration: declaration {
add_identifier($1);
}
$$ = new Staff_id(*$1, $3);
delete $1; // this sux
}
- | NEWIDENTIFIER '=' voice_block {
- $$ = new Voice_id(*$1, $3);
+ | NEWIDENTIFIER '=' music_voice {
+ $$ = new M_voice_id(*$1, $3);
+ delete $1;
+ }
+ | NEWIDENTIFIER '=' music_chord {
+ $$ = new M_chord_id(*$1, $3);
delete $1;
}
;
+/*
+ SCORE
+*/
score_block: SCORE '{' score_body '}' { $$ = $3; }
;
-score_body: { $$ = new Score; }
+score_body: { $$ = new Input_score; }
| score_body staff_block { $$->add($2); }
- | score_body score_commands_block { $$->set($2); }
+ | score_body score_commands_block {
+ $$->add(*$2);
+ delete $2;
+ }
| score_body paper_block { $$->set($2); }
;
+/*
+ COMMANDS
+*/
score_commands_block:
COMMANDS '{' score_commands_body '}' { $$ =$3;}
;
-score_commands_body: { $$ = new Score_commands; }
+score_commands_body: { $$ = new svec<Input_command*>; }
| score_commands_body score_command {
- $$->parser_add($2);
+ $$->add($2);
+ }
+ ;
+
+staff_commands_block: COMMANDS '{' staff_commands_body '}' {
+ $$ = $3; }
+ ;
+
+staff_commands_body:
+ /* empty */ { $$ = new svec<Input_command*>; }
+ | staff_commands_body staff_command {
+ $$->add($2);
+ }
+ ;
+
+staff_command:
+ skipcommand
+ | KEY pitch_list {/*UGH*/
+ $$ = get_key_interpret_command(*$2);
+ delete $2;
+ }
+ | CLEF clef_id {
+ $$ = get_clef_interpret_command(*$2);
+ delete $2;
+ }
+ ;
+
+skipcommand:
+ SKIP int ':' REAL {
+ $$ = get_skip_command($2, $4);
+ }
+
+score_command:
+ skipcommand
+ | METER int int {
+ $$ = get_meterchange_command($2, $3);
+ }
+ | PARTIAL REAL {
+ $$ = get_partial_command($2);
}
;
+
+/*
+ PAPER
+*/
paper_block:
PAPER '{' paper_body '}' { $$ = $3; }
;
| paper_body UNITSPACE dim { $$->whole_width = $3; }
| paper_body GEOMETRIC REAL { $$->geometric_ = $3; }
;
-
-dim:
- REAL unit { $$ = convert_dimen($1,$2); }
- ;
-
-
-unit: CM { $$ = "cm"; }
- |IN { $$ = "in"; }
- |MM { $$ = "mm"; }
- |PT { $$ = "pt"; }
- ;
-
/*
- staff
+ STAFFs
*/
staff_block:
- staffdecl
- | rhythmstaff_block
- | melodicstaff_block
+ STAFF '{' staff_body '}' { $$ = $3; }
;
-staffdecl: STAFF '{' IDENTIFIER '}' { $$ = $3->staff()->clone(); }
+
+
+staff_init:
+ IDENTIFIER { $$ = new Input_staff(*$1->staff()); }
+ | RHYTHMIC {
+ $$ = new Input_staff("rhythmic");
+ }
+ | MELODIC {
+ $$ = new Input_staff( "melodic");
+ }
;
-rhythmstaff_block:
- RHYTHMSTAFF '{' rhythmstaff_body '}' { $$ = $3; }
+staff_body:
+ staff_init
+ | staff_body horizontal_music {
+ $$->add($2);
+ }
+ | staff_body staff_commands_block {
+ $$->add(*$2);
+ delete $2;
+ }
;
-rhythmstaff_body:
- /* empty */ { $$ = get_new_rhythmstaff(); }
- | rhythmstaff_body voice_block { $$->add_voice($2); }
+/*
+ MUSIC
+*/
+horizontal_music:
+ music_voice { $$ = $1; }
;
-melodicstaff_block:
- MELODICSTAFF '{' melodicstaff_body '}' { $$ = $3; }
+vertical_music:
+ music_chord { $$ = $1; }
;
-melodicstaff_body:
- /* empty */ { $$ = get_new_melodicstaff(); }
- | melodicstaff_body voice_block { $$->add_voice($2); }
+music_voice: MUSIC '{' music_voice_body '}' { $$ = $3; }
;
-/*
- voice
-*/
-voice_block:
- VOICE '{' voice_body '}' { $$ = $3; }
+music_voice_body: {
+ $$ = new Music_voice;
+ }
+ | music_voice_body IDENTIFIER {
+ $$->concatenate($2->mvoice());
+ }
+ | music_voice_body full_element {
+ $$->add($2);
+ }
+ | music_voice_body voice_command {
+ }
+ | music_voice_body vertical_music {
+ $$->add($2);
+ }
;
-voice_body:
- IDENTIFIER { $$ = new Voice(*$1->voice()); }
- | voice_elts_dollar { $$ = $1; }
- | voice_body START_T REAL { $$->start = $3; }
+music_chord: CHORD '{' music_chord_body '}' { $$ = $3; }
;
+music_chord_body: {
+ $$ = new Music_general_chord;
+ }
+ | music_voice_body IDENTIFIER {
+ $$->concatenate($2->mchord());
+ }
+ | music_chord_body horizontal_music {
+ $$ -> add($2);
+ }
+ ;
-
-
-voice_elts_dollar:
- '$' voice_elts '$' { $$ = $2; }
- ;
-voice_elts:
- /* empty */ {
- $$ = new Voice;
- }
- | voice_elts pre_requests voice_elt post_requests {
- add_requests($3, pre_reqs);
- add_requests($3, post_reqs);
- $$->add($3);
- }
- | voice_elts voice_command { }
+/*
+ VOICE ELEMENTS
+*/
+full_element: pre_requests voice_elt post_requests {
+ add_requests($2, pre_reqs);
+ add_requests($2, post_reqs);
+ $$ = $2;
+ }
;
post_requests:
pre_request:
OPEN_REQUEST_PARENS { $$ = get_request($1); }
;
-/*
-*/
+
voice_command:
- DURATIONCOMMAND DURATION {
- set_default_duration(*$2);
- delete $2;
+ DURATIONCOMMAND '{' DURATION '}' {
+ set_default_duration(*$3);
+ delete $3;
}
- | OCTAVECOMMAND PITCH {
- set_default_pitch(*$2);
- delete $2;
+ | OCTAVECOMMAND '{' PITCH '}' {
+ set_default_pitch(*$3);
+ delete $3;
}
;
delete $1;
}
;
-
+/*
+ UTILITIES
+*/
pitch_list: {
$$ = new svec<String>;
}
delete $2;
}
-score_command:
- SKIP int ':' REAL {
- $$ = get_skip_command($2, $4);
- }
- | METER int int {
- $$ = get_meterchange_command($2, $3);
- }
- | KEY '$' pitch_list '$' {/*UGH*/
- $$ = get_key_interpret_command(*$3);
- delete $3;
- }
- | CLEF clef_id {
- $$ = get_clef_interpret_command(*$2);
- delete $2;
- }
-/* | PARTIALMEASURE REAL {
- $$ = get_partial_command($2);
- }*/
- ;
-
-clef_id:
- VIOLIN { $$ = new String("violin"); }
- | BASS { $$ = new String("bass"); }
- ;
int:
REAL {
$$ = int($1);
}
;
+
+dim:
+ REAL unit { $$ = convert_dimen($1,$2); }
+ ;
+
+
+unit: CM { $$ = "cm"; }
+ |IN { $$ = "in"; }
+ |MM { $$ = "mm"; }
+ |PT { $$ = "pt"; }
+ ;
+
+clef_id:
+ VIOLIN { $$ = new String("violin"); }
+ | BASS { $$ = new String("bass"); }
+ ;
%%
void
parse_file(String s)
{
*mlog << "Parsing ... ";
+
#ifdef YYDEBUG
- yydebug = !monitor.silence("Parser");
+ yydebug = !monitor.silence("Parser") & check_debug;
#endif
+
new_input(s);
yyparse();
delete_identifiers();
kill_lexer();
*mlog << "\n";
}
+