%{ // -*-Fundamental-*-
+
+/*
+ parser.y -- lily parser
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+ Jan Nieuwenhuizen <jan@digicash.com>
+*/
+
#include <iostream.h>
+// mmm
+#define MUDELA_VERSION "0.1.0"
+
+#include "script-def.hh"
+#include "symtable.hh"
#include "lookup.hh"
#include "misc.hh"
-#include "lexer.hh"
+#include "my-lily-lexer.hh"
#include "paper-def.hh"
#include "midi-def.hh"
-#include "input-score.hh"
#include "main.hh"
#include "keyword.hh"
#include "debug.hh"
#include "parseconstruct.hh"
#include "dimen.hh"
#include "identifier.hh"
-#include "commandrequest.hh"
-#include "musicalrequest.hh"
-#include "voice-element.hh"
+#include "command-request.hh"
+#include "musical-request.hh"
+#include "my-lily-parser.hh"
+#include "text-def.hh"
+#include "input-translator.hh"
+#include "score.hh"
+#include "music-list.hh"
#ifndef NDEBUG
#define YYDEBUG 1
#endif
-Array<Request*> pre_reqs, post_reqs;
-Array<const char *> define_spots;
-Paper_def*default_paper();
-char const* defined_ch_c_l;
-char const* req_defined_ch_c_l;
-int fatal_error_i = 0;
+#define YYERROR_VERBOSE 1
+
+#define YYPARSE_PARAM my_lily_parser_l
+#define YYLEX_PARAM my_lily_parser_l
+#define THIS ((My_lily_parser *) my_lily_parser_l)
+
+#define yyerror THIS->parser_error
%}
%union {
- Request * request;
- Real real;
+ Array<Melodic_req*> *melreqvec;/* should clean up naming */
+ Array<String> * strvec;
+ Array<int> *intvec;
+ Box *box;
+ Chord * chord;
+ Duration *duration;
Identifier *id;
- Voice *voice;
- Voice_element *el;
+ Input_translator* itrans;
+ Music *music;
+ Music_list *musiclist;
+ Score *score;
+ Interval *interval;
+ Lookup*lookup;
+ Melodic_req * melreq;
+ Midi_def* midi;
+ Moment *moment;
+ Note_req *notereq;
+ Paper_def *paper;
+ Real real;
+ Request * request;
+ General_script_def * script;
String *string;
+ Symbol * symbol;
+ Symtable * symtable;
+ Symtables * symtables;
+ Text_def * textdef;
+ char c;
const char *consstr;
- Paper_def *paper;
- Midi_def* midi;
- Input_music *music;
- Music_general_chord *chord;
- Music_voice *mvoice;
int i;
- char c;
int ii[10];
- Moment *moment;
+}
+%{
- Array<String> * strvec;
- Array<int> *intvec;
- Array<Melodic_req*> *melreqvec;
- Input_staff *staff;
- Input_score *score;
- Symtables * symtables;
- Symtable * symtable;
- Symbol * symbol;
- Lookup*lookup;
- Interval *interval;
- Box *box;
- Notename_tab *notename_tab;
- Script_def * script;
- Text_def * textdef;
+int
+yylex(YYSTYPE *s, void * v_l)
+{
+ My_lily_parser *pars_l = (My_lily_parser*) v_l;
+ My_lily_lexer * lex_l = pars_l->lexer_p_;
+
+ lex_l->lexval_l = (void*) s;
+ return lex_l->yylex();
}
-%token VOICE STAFF SCORE TITLE BAR OUTPUT MULTIVOICE
-%token CM_T IN_T PT_T MM_T PAPER WIDTH METER UNITSPACE SKIP COMMANDS COMMAND
-%token GEOMETRIC START_T DURATIONCOMMAND OCTAVECOMMAND
-%token KEY CLEF TABLE VOICES STEM
-%token PARTIAL MUSIC GROUPING CADENZA
-%token END SYMBOLTABLES TEXID TABLE NOTENAMES SCRIPT TEXTSTYLE PLET
-%token GOTO
-%token MIDI TEMPO
-
-%token <id> IDENTIFIER
-%token <string> PITCHMOD DURATION RESTNAME
-%token <ii> NOTENAME
-%token <real> REAL
-%token <string> STRING
-
-%token <i> DOTS INT
-%type <real> unit
-%type <melreqvec> pitch_list
-%type <c> open_request_parens close_request_parens close_plet_parens
-%type <id> declaration
-%type <string> declarable_identifier
-%type <paper> paper_block paper_body
-%type <midi> midi_block midi_body
-%type <real> dim real
-%type <ii> default_duration explicit_duration notemode_duration mudela_duration
-%type <ii> notename
-%type <moment> duration_length
-%type <el> voice_elt full_element lyrics_elt command_elt
-
-%type <score> score_block score_body
-%type <staff> staff_block staff_init staff_body
-%type <i> int
-%type <intvec> intastint_list
-%type <request> post_request pre_request command_req
-%type <string> pitchmod
-%type <music> music
-%type <chord> music_chord music_chord_body
-
-%type <mvoice> music_voice_body music_voice
-
-%type <interval> dinterval
-%type <box> box
-%type <symtable> symtable symtable_body
-%type <lookup> symtables symtables_body
-%type <symbol> symboldef
-%type <notename_tab> notename_tab notename_tab_body
-%type <i> script_dir
-%type <script> script_definition script_body mudela_script
-%type <request> script_req textscript_req
-%type <textdef> mudela_text
+%}
+
+%pure_parser
+
+/* tokens which are not keywords */
+%token CONCAT
+
+%token ALIAS
+%token BAR
+%token CADENZA
+%token CLEAR
+%token CLEF
+%token CONTAINS
+%token CONSISTS
+%token ACCEPTS
+%token CM_T
+%token DURATIONCOMMAND
+%token ABSDYNAMIC
+%token END
+%token GEOMETRIC
+%token GROUPING
+%token GROUP
+%token REQUESTTRANSLATOR
+%token HSHIFT
+%token IN_T
+%token ID
+%token INIT_END
+%token LYRIC
+%token KEY
+%token MELODIC
+%token MIDI
+%token MELODIC_REQUEST
+%token METER
+%token MM_T
+%token MULTI
+%token NOTE
+%token NOTENAMES
+%token OCTAVECOMMAND
+%token OUTPUT
+%token PAPER
+%token PARTIAL
+%token PLET
+%token PT_T
+%token SCORE
+%token SCRIPT
+%token SKIP
+%token SPANDYNAMIC
+%token STAFF
+%token START_T
+%token STEM
+%token SYMBOLTABLES
+%token TABLE
+%token TRANSPOSE
+%token TEMPO
+%token TEXID
+%token TEXTSTYLE
+%token TITLE
+%token UNITSPACE
+%token WIDTH
+%token VERSION
+
+/* escaped */
+%token E_EXCLAMATION E_SMALLER E_BIGGER E_CHAR
+
+%type <i> dots
+%token <i> INT
+%token <melreq> NOTENAME_ID
+%token <id> IDENTIFIER
+%token <id> MELODIC_REQUEST_IDENTIFIER
+%token <id> MUSIC_IDENTIFIER
+%token <id> VOICE_IDENTIFIER
+%token <id> POST_REQUEST_IDENTIFIER
+%token <id> SCRIPT_IDENTIFIER
+%token <id> STAFF_IDENTIFIER
+%token <id> REAL_IDENTIFIER
+%token <id> INPUT_TRANS_IDENTIFIER
+%token <id> INT_IDENTIFIER
+%token <id> SCORE_IDENTIFIER
+%token <id> MIDI_IDENTIFIER
+%token <id> PAPER_IDENTIFIER
+%token <id> REQUEST_IDENTIFIER
+%token <real> REAL
+%token <string> DURATION RESTNAME
+%token <string> STRING
+%token <i> POST_QUOTES
+%token <i> PRE_QUOTES
+
+
+%type <box> box
+%type <c> open_request_parens close_request_parens
+%type <c> open_plet_parens close_plet_parens
+%type <music> simple_element music_elt full_element lyrics_elt command_elt
+%type <i> int
+%type <i> script_dir
+%type <id> declaration
+%type <duration> explicit_duration notemode_duration
+%type <interval> dinterval
+%type <intvec> intastint_list
+%type <lookup> symtables symtables_body
+%type <melreq> melodic_request steno_melodic_req
+%type <notereq> steno_note_req
+%type <melreqvec> pitch_list
+%type <midi> midi_block midi_body
+%type <moment> duration_length
+
+%type <music> Music transposed_music
+%type <musiclist> Voice Voice_body
+%type <chord> Chord Chord_body
+%type <paper> paper_block paper_body
+%type <real> dim real
+%type <real> unit
+%type <request> post_request pre_request command_req verbose_command_req abbrev_command_req
+%type <request> script_req dynamic_req
+%type <score> score_block score_body
+%type <script> script_definition script_body mudela_script gen_script_def
+%type <textdef> text_def
+%type <string> declarable_identifier
+%type <string> script_abbreviation
+%type <id> old_identifier
+%type <symbol> symboldef
+%type <symtable> symtable symtable_body
+%type <itrans> input_translator_spec input_translator_spec_body
+
+%left PRIORITY
%%
add_score($2);
}
| mudela add_declaration { }
- | mudela mudela_command {}
+ | mudela error
+ | mudela check_version { }
+ | mudela add_notenames { }
;
-mudela_command:
- notename_tab { lexer->set($1); }
+check_version:
+ VERSION STRING ';' {
+ if ( String( *$2 ) != MUDELA_VERSION) {
+ if (THIS->ignore_version_b_) {
+ THIS->here_input().error("Incorrect mudela version");
+ } else {
+ THIS->fatal_error_i_ = 1;
+ THIS->parser_error("Incorrect mudela version");
+ }
+ }
+ }
;
+add_notenames:
+ NOTENAMES '{' notenames_body '}'
+ ;
+notenames_body:
+ /**/ {
+ }
+ | notenames_body CLEAR {
+ THIS->clear_notenames();
+ }
+ | notenames_body STRING '=' melodic_request {
+ THIS->add_notename(*$2, $4);
+ delete $2;
+ }
+ ;
/*
DECLARATIONS
*/
add_declaration: declaration {
- lexer->add_identifier($1);
+ THIS->lexer_p_->add_identifier($1);
+ $1->init_b_ = THIS->init_parse_b_;
+ $1->set_spot(THIS->pop_spot());
}
;
declarable_identifier:
- STRING { $$ = $1; }
- | IDENTIFIER { $$ = new String($1->name); }
+ STRING {
+ THIS->remember_spot();
+ $$ = $1;
+ }
+ | old_identifier {
+ THIS->remember_spot();
+ $$ = new String($1->name_str_);
+ THIS->here_input().warning("redeclaration of `" + *$$ + "'");
+ }
+ ;
+
+
+old_identifier:
+ IDENTIFIER
+ | INPUT_TRANS_IDENTIFIER
+ | MELODIC_REQUEST_IDENTIFIER
+ | POST_REQUEST_IDENTIFIER
+ | SCRIPT_IDENTIFIER
+ | REAL_IDENTIFIER
+ | SCORE_IDENTIFIER
+ | REQUEST_IDENTIFIER
;
declaration:
- declarable_identifier '=' staff_block {
- $$ = new Staff_id(*$1, $3);
- delete $1;
+ declarable_identifier '=' score_block {
+ $$ = new Score_id(*$1, $3, SCORE_IDENTIFIER);
+ delete $1;
+ }
+ | declarable_identifier '=' paper_block {
+ $$ = new Paper_def_id(*$1, $3, PAPER_IDENTIFIER);
+ delete $1;
}
- | declarable_identifier '=' music_voice {
- $$ = new M_voice_id(*$1, $3);
+ | declarable_identifier '=' midi_block {
+ $$ = new Midi_def_id(*$1, $3, MIDI_IDENTIFIER);
delete $1;
}
| declarable_identifier '=' script_definition {
- $$ = new Script_id(*$1, $3);
+ $$ = new Script_id(*$1, $3, SCRIPT_IDENTIFIER);
delete $1;
}
- | declarable_identifier '=' music_chord {
- $$ = new M_chord_id(*$1, $3);
+ | declarable_identifier '=' Music {
+ $$ = new Music_id(*$1, $3, MUSIC_IDENTIFIER);
delete $1;
}
| declarable_identifier '=' symtables {
- $$ = new Lookup_id(*$1, $3);
+ $$ = new Lookup_id(*$1, $3, IDENTIFIER);
delete $1;
}
- | declarable_identifier '=' notename_tab {
- $$ = new Notetab_id(*$1, $3);
+ | declarable_identifier '=' real {
+ $$ = new Real_id(*$1, new Real($3), REAL_IDENTIFIER);
delete $1;
}
- | declarable_identifier '=' real {
- $$ = new Real_id(*$1, new Real($3));
+ | declarable_identifier '=' int {
+ $$ = new Int_id(*$1, new int($3), INT_IDENTIFIER);
delete $1;
}
- | declarable_identifier error '}' {
-
+ | declarable_identifier '=' post_request {
+ $$ = new Request_id(*$1, $3, POST_REQUEST_IDENTIFIER);
+ delete $1;
+ }
+ | declarable_identifier '=' melodic_request {
+ $$ = new Request_id(*$1, $3, MELODIC_REQUEST_IDENTIFIER);
+ delete $1;
+ }
+ | declarable_identifier '=' input_translator_spec {
+ $$ = new Input_translator_id ( *$1, $3, INPUT_TRANS_IDENTIFIER);
+ delete $1;
}
;
-notename_tab:
- NOTENAMES '{' notename_tab_body '}' { $$ = $3; }
+
+
+input_translator_spec:
+ REQUESTTRANSLATOR '{' input_translator_spec_body '}'
+ { $$ = $3; }
;
-notename_tab_body: {
- $$ = new Notename_tab;
+input_translator_spec_body:
+ INPUT_TRANS_IDENTIFIER {
+ $$ = $1->input_translator(true);
+ $$-> set_spot( THIS->here_input() );
}
- | IDENTIFIER {
- $$ = $1->notename_tab(true);
- }
- | notename_tab_body STRING int int {
- $$->set($3, $4, *$2);
+ | STRING STRING {
+ $$ = new Input_translator;
+ $$->base_str_ = *$1;
+ $$->type_str_ =*$2;
+ $$->set_spot ( THIS->here_input() );
+ delete $1;
delete $2;
}
+ | input_translator_spec_body ID STRING ';' {
+ $$-> default_id_str_ = *$3;
+ delete $3;
+ }
+ | input_translator_spec_body ALIAS STRING ';' {
+ $$-> alias_str_arr_.push(*$3);
+ delete $3;
+ }
+ | input_translator_spec_body CONSISTS STRING ';' {
+ $$-> consists_str_arr_.push(*$3);
+ delete $3;
+ }
+ | input_translator_spec_body CONTAINS input_translator_spec {
+ $$->add($3);
+ }
;
/*
SCORE
*/
score_block:
- SCORE { define_spots.push(lexer->here_ch_c_l()); }
+ SCORE { THIS->remember_spot(); }
/*cont*/ '{' score_body '}' {
$$ = $4;
- $$->defined_ch_c_l_ = define_spots.pop();
+ $$->set_spot(THIS->pop_spot());
if (!$$->paper_p_ && ! $$->midi_p_)
- $$->paper_p_ = default_paper();
+ $$->paper_p_ = THIS->default_paper();
/* handle error levels. */
- $$->errorlevel_i_ = lexer->errorlevel_i_;
- lexer->errorlevel_i_ = 0;
+ $$->errorlevel_i_ = THIS->error_level_i_;
+ THIS->error_level_i_ = 0;
}
;
score_body: {
- $$ = new Input_score;
+ $$ = new Score;
+ }
+ | SCORE_IDENTIFIER {
+ $$ = $1->score(true);
+ }
+ | score_body Music {
+ $$->music_p_ = $2;
+ }
+ | score_body paper_block {
+ $$->paper_p_ = $2;
}
- | score_body staff_block { $$->add($2); }
- | score_body COMMANDS '{' music_voice_body '}' {
- $$->set($4);
+ | score_body midi_block {
+ $$->midi_p_ = $2;
}
- | score_body paper_block { $$->set($2); }
- | score_body midi_block { $$->set($2); }
| score_body error {
}
*/
paper_block:
PAPER
-
'{' paper_body '}' { $$ = $3; }
;
paper_body:
/* empty */ {
- $$ = default_paper();
+ $$ = THIS->default_paper(); // paper / video / engrave
}
- | paper_body WIDTH dim { $$->linewidth = $3;}
- | paper_body OUTPUT STRING { $$->outfile = *$3;
+ | paper_body OUTPUT STRING ';' { $$->outfile_str_ = *$3;
delete $3;
}
| paper_body symtables { $$->set($2); }
- | paper_body UNITSPACE dim { $$->whole_width = $3; }
- | paper_body GEOMETRIC REAL { $$->geometric_ = $3; }
+ | paper_body STRING '=' dim ';' {
+ $$->set_var(*$2, $4);
+ }
+ | paper_body STRING '=' REAL ';' {
+ $$->set_var(*$2, $4);
+ }
+ | paper_body input_translator_spec {
+ $$->set( $2 );
+ }
| paper_body error {
}
'{' midi_body '}' { $$ = $3; }
;
-midi_body: {
- $$ = new Midi_def;
+midi_body: /* empty */ {
+ $$ = THIS->default_midi(); // midi / audio / perform
}
- | midi_body OUTPUT STRING {
+ | midi_body OUTPUT STRING ';' {
$$->outfile_str_ = *$3;
delete $3;
}
- | midi_body TEMPO mudela_duration ':' int {
- $$->set_tempo( wholes( $3[0], $3[1] ), $5 );
+ | midi_body TEMPO notemode_duration ':' int ';' {
+ $$->set_tempo( $3->length(), $5 );
+ }
+ | midi_body input_translator_spec {
+ $$->set( $2 );
}
| midi_body error {
;
/*
- STAFFs
+ MUSIC
*/
-staff_block:
- STAFF { define_spots.push(lexer->here_ch_c_l()); }
-/*cont*/ '{' staff_body '}' {
- $$ = $4;
- $$-> defined_ch_c_l_ = define_spots.pop();
- }
- ;
-
-
-staff_init:
- IDENTIFIER { $$ = $1->staff(true); }
- | STRING {
- $$ = new Input_staff(*$1);
- delete $1;
+Voice:
+ '{' Voice_body '}' {
+ $$ = $2;
}
;
-staff_body:
- staff_init
- | staff_body COMMANDS '{' music_voice_body '}' {
- $$->set_score_wide($4);
+Voice_body:
+ /**/ {
+ $$ = new Voice;
}
- | staff_body music {
- $2->set_default_group( "staff_music" + String($$->music_.size()));
- $$->add($2);
+ | Voice_body ID STRING STRING ';' {
+ $$ = new Voice;
+ $$->type_str_ = *$3;
+ $$->id_str_ = *$4;
+ delete $3;
+ delete $4;
}
- | staff_body error {
+ | Voice_body Music {
+ $$->add($2);
}
;
-/*
- MUSIC
-*/
-music:
- music_voice { $$ = $1; }
- | music_chord { $$ = $1; }
+Music:
+ full_element { $$ = $1; }
+ | Voice { $$ = $1; }
+ | Chord { $$ = $1; }
+ | transposed_music { $$ = $1; }
+ | MUSIC_IDENTIFIER { $$ = $1->music(true); }
+ | MELODIC
+ { THIS->lexer_p_->push_note_state(); }
+ Music
+ { $$=$3; THIS->lexer_p_->pop_state(); }
+
+ | LYRIC
+ { THIS->lexer_p_->push_lyric_state(); }
+ Music
+ { $$ = $3; THIS->lexer_p_->pop_state(); }
+ ;
+
+Chord:
+ '<' Chord_body '>' { $$ = $2; }
;
-music_voice: MUSIC '{' music_voice_body '}' { $$ = $3; }
- ;
-
-music_voice_body:
- /* */ {
- $$ = new Music_voice;
- }
- | music_voice_body IDENTIFIER {
- $$->concatenate($2->mvoice(true));
+Chord_body:
+ /**/ {
+ $$ = new Chord;
+ $$-> multi_level_i_ = 1;
}
- | music_voice_body full_element {
- $$->add_elt($2);
+ | Chord_body MULTI INT ';' {
+ $$->multi_level_i_=$3;
}
- | music_voice_body voice_command {
+ | Chord_body ID STRING STRING ';' {
+ $$->type_str_ = *$3;
+ $$->id_str_ = *$4;
+ delete $4;
+ delete $3;
}
- | music_voice_body music {
+ | Chord_body Music {
$$->add($2);
}
- | music_voice_body error {
- }
- ;
-
-music_chord: '{' music_chord_body '}' { $$ = $2; }
;
-music_chord_body:
- /* */ {
- $$ = new Voice_group_chord;
- }
- | MULTIVOICE {
- $$ = new Multi_voice_chord;
- }
- | music_chord_body IDENTIFIER {
- $$->concatenate($2->mchord(true));
- }
- | music_chord_body music {
- $$->add($2);
- }
- | music_chord_body full_element {
- $$ ->add_elt($2);
- }
- | music_chord_body error {
+transposed_music:
+ TRANSPOSE steno_melodic_req Music {
+ $$ = $3;
+ $$ -> transpose($2);
+ delete $2;
}
;
/*
VOICE ELEMENTS
*/
-full_element: pre_requests voice_elt post_requests {
- add_requests($2, pre_reqs);
- add_requests($2, post_reqs);
- $$ = $2;
- }
- | pre_requests lyrics_elt post_requests {
- add_requests($2, pre_reqs);
- add_requests($2, post_reqs);
+full_element:
+ pre_requests simple_element post_requests {
+ THIS->add_requests((Chord*)$2);//ugh
$$ = $2;
- }
+ }
+ | voice_command ';' { $$ = 0; }
+ ;
+
+simple_element:
+ music_elt
+ | lyrics_elt
| command_elt
;
command_elt:
/* empty */ {
- $$ = new Voice_element;
- $$-> defined_ch_c_l_ = lexer->here_ch_c_l();
+ $$ = new Request_chord;
+ $$-> set_spot( THIS->here_input());
}
/* cont: */
- command_req {
- $2-> defined_ch_c_l_ = $$->defined_ch_c_l_;
- $$->add($2);
+ command_req {
+ $2-> set_spot( THIS->here_input());
+ ((Chord*)$$) ->add($2);//ugh
}
+ | GROUP STRING ';' { // ugh ugh ugh
+ Change_reg *chr_p = new Change_reg;
+ $$ = chr_p;
+ chr_p-> type_str_ = "Voice_group_engravers"; //ugh
+ chr_p-> id_str_ = *$2;
+ delete $2;
+ }
;
command_req:
+ abbrev_command_req
+ | verbose_command_req ';' { $$ = $1; }
+ ;
+
+abbrev_command_req:
'|' {
$$ = new Barcheck_req;
}
- | BAR STRING {
+ ;
+
+verbose_command_req:
+ BAR STRING {
$$ = new Bar_req(*$2);
delete $2;
}
- | METER '{' int '*' int '}' {
+ | METER int '/' int {
Meter_change_req *m = new Meter_change_req;
- m->set($3,$5);
+ m->set($2,$4);
+ // sorry hw, i need meter at output of track,
+ // but don-t know where to get it... statics should go.
+ // HW : default: 4/4, meterchange reqs may change it.
+
+ Midi_def::num_i_s = $2;
+ Midi_def::den_i_s = $4;
$$ = m;
}
- | SKIP '{' duration_length '}' {
+ | SKIP duration_length {
Skip_req * skip_p = new Skip_req;
- skip_p->duration_ = *$3;
- delete $3;
+ skip_p->duration_ = Duration(1,0);
+ skip_p->duration_.set_plet($2->numerator().as_long(),
+ $2->denominator().as_long());
+
+ delete $2;
$$ = skip_p;
}
- | CADENZA '{' int '}' {
- $$ = new Cadenza_req($3);
+ | CADENZA int {
+ $$ = new Cadenza_req($2);
}
- | PARTIAL '{' duration_length '}' {
- $$ = new Partial_measure_req(*$3);
- delete $3;
+ | PARTIAL duration_length {
+ $$ = new Partial_measure_req(*$2);
+ delete $2;
}
- | STEM '{' int '}' {
- $$ = get_stemdir_req($3);
+ | STEM int {
+ $$ = get_stemdir_req($2);
+ }
+ | HSHIFT int {
+ $$ = get_hshift_req($2);
}
| CLEF STRING {
$$ = new Clef_change_req(*$2);
delete $2;
}
- | KEY '{' pitch_list '}' {
+ | KEY pitch_list {
Key_change_req *key_p= new Key_change_req;
- key_p->melodic_p_arr_ = *$3;
+ key_p->melodic_p_arr_ = *$2;
$$ = key_p;
- delete $3;
+ delete $2;
}
- | GROUPING '{' intastint_list '}' {
- $$ = get_grouping_req(*$3); delete $3;
+ | GROUPING intastint_list {
+ $$ = get_grouping_req(*$2); delete $2;
}
+
;
post_requests:
{
- assert(post_reqs.empty());
+ assert(THIS->post_reqs.empty());
}
| post_requests post_request {
- $2->defined_ch_c_l_ = lexer->here_ch_c_l();
- post_reqs.push($2);
- }
- | post_requests close_plet_parens INT '/' INT {
- post_reqs.push( get_request($2) );
- req_defined_ch_c_l = lexer->here_ch_c_l();
- post_reqs.push( get_plet_request( $2, $3, $5 ) );
+ $2->set_spot( THIS->here_input());
+ THIS->post_reqs.push($2);
}
;
+
post_request:
- close_request_parens {
- $$ = get_request($1);
+ POST_REQUEST_IDENTIFIER {
+ $$ = (Request*)$1->request(true);
+ }
+ |close_request_parens {
+ $$ = THIS->get_parens_request($1);
}
| script_req
- | textscript_req
+ | dynamic_req
+ ;
+
+
+
+/*
+ URG!!
+*/
+steno_melodic_req:
+ NOTENAME_ID {
+ $$ = $1->clone()->musical()->melodic();
+ $$->octave_i_ += THIS->default_octave_i_;
+ }
+ | steno_melodic_req POST_QUOTES {
+ $$-> octave_i_ += $2;
+ }
+ | PRE_QUOTES steno_melodic_req {
+ $$ = $2;
+ $2-> octave_i_ -= $1;
+ }
+ ;
+
+steno_note_req:
+ steno_melodic_req {
+ $$ = new Note_req;
+ * (Melodic_req *) $$ = *$1;
+ delete $1;
+ }
+ | steno_note_req '!' {
+ $$->forceacc_b_ = ! $$->forceacc_b_;
+ }
+ /* have to duration here. */
+ ;
+
+melodic_request:
+ MELODIC_REQUEST '{' int int int '}' {/* ugh */
+ $$ = new Melodic_req;
+ $$->octave_i_ = $3;
+ $$->notename_i_ = $4;
+ $$->accidental_i_ = $5;
+ }
+ ;
+
+dynamic_req:
+ ABSDYNAMIC '{' int '}' {
+ Absolute_dynamic_req *ad_p = new Absolute_dynamic_req;
+ ad_p ->loudness_ = (Dynamic_req::Loudness)$3;
+ $$ =ad_p;
+ }
+ | SPANDYNAMIC '{' int int '}' {
+ Span_dynamic_req * sp_p = new Span_dynamic_req;
+ sp_p->spantype = $4;
+ sp_p-> dynamic_dir_i_ = $3;
+ $$ = sp_p;
+ }
;
close_plet_parens:
- ']' {
- req_defined_ch_c_l = lexer->here_ch_c_l();
+ ']' INT '/' INT {
$$ = ']';
+ THIS->default_duration_.set_plet($2,$4);
}
;
close_request_parens:
- '(' {
+ '~' {
+ $$ = '~';
+ }
+ | '(' {
$$='(';
}
| ']' {
$$ = ']';
}
+ | close_plet_parens {
+ $$ = ']';
+ }
+ | E_SMALLER {
+ $$ = '<';
+ }
+ | E_BIGGER {
+ $$ = '>';
+ }
;
-
+
+open_plet_parens:
+ '[' INT '/' INT {
+ $$ = '[';
+ THIS->default_duration_.set_plet($2,$4);
+ }
+ ;
+
open_request_parens:
- ')' {
+ E_EXCLAMATION {
+ $$ = '!';
+ }
+ | ')' {
$$=')';
}
| '[' {
$$='[';
}
+ | open_plet_parens {
+ }
;
+
+
script_definition:
SCRIPT '{' script_body '}' { $$ = $3; }
;
script_body:
- STRING int int int {
- $$ = new Script_def(*$1,$2, $3,$4);
+ STRING int int int int int {
+ Script_def *s = new Script_def;
+ s->set_from_input(*$1,$2, $3,$4,$5, $6);
+ $$ = s;
delete $1;
}
;
-textscript_req:
- script_dir mudela_text { $$ = get_text_req($1,$2); }
+script_req:
+ script_dir gen_script_def {
+ Musical_script_req *m = new Musical_script_req;
+ $$ = m;
+ m-> scriptdef_p_ = $2;
+ m-> set_spot ( THIS->here_input() );
+ m-> dir_i_ = $1;
+ }
;
-mudela_text:
- STRING {
- defined_ch_c_l = lexer->here_ch_c_l();
- $$ = get_text(*$1);
- delete $1;
+gen_script_def:
+ text_def { $$ = $1; }
+ | mudela_script { $$ = $1;
+ $$-> set_spot( THIS->here_input() );
}
;
-script_req:
- script_dir mudela_script {
- $$ = get_script_req($1, $2);
+text_def:
+ STRING {
+ Text_def *t = new Text_def;
+ $$ = t;
+ t->text_str_ = *$1;
+ delete $1;
+ t->style_str_ = THIS->textstyle_str_;
+ $$->set_spot( THIS->here_input() );
}
;
-mudela_script:
- IDENTIFIER { $$ = $1->script(true); }
- | script_definition { $$ = $1; }
- | '^' { $$ = get_scriptdef('^'); }
+script_abbreviation:
+ '^' { $$ = get_scriptdef('^'); }
| '+' { $$ = get_scriptdef('+'); }
| '-' { $$ = get_scriptdef('-'); }
| '|' { $$ = get_scriptdef('|'); }
| 'o' { $$ = get_scriptdef('o'); }
| '>' { $$ = get_scriptdef('>'); }
- | '.' { $$ = get_scriptdef('.'); }
- | DOTS {
- if ( $1 > 1 )
- warning( "too many staccato dots", lexer->here_ch_c_l() );
+ | '.' {
$$ = get_scriptdef('.');
}
- | error {
- $$ = get_scriptdef('.');
- yyerrok;
+ ;
+
+mudela_script:
+ SCRIPT_IDENTIFIER { $$ = $1->script(true); }
+ | script_definition { $$ = $1; }
+ | script_abbreviation {
+ $$ = THIS->lexer_p_->lookup_identifier(*$1)->script(true);
+ delete $1;
}
;
pre_requests:
| pre_requests pre_request {
- pre_reqs.push($2);
- $2->defined_ch_c_l_ = lexer->here_ch_c_l();
+ THIS->pre_reqs.push($2);
+ $2->set_spot( THIS->here_input());
}
;
pre_request:
open_request_parens {
- defined_ch_c_l = lexer->here_ch_c_l();
- $$ = get_request($1);
+ $$ = THIS->get_parens_request($1);
}
;
voice_command:
- PLET '{' INT '/' INT '}' {
- set_plet($3,$5);
+ PLET INT '/' INT {
+ THIS->default_duration_.set_plet($2,$4);
}
- | DURATIONCOMMAND '{' STRING '}' {
- set_duration_mode(*$3);
- delete $3;
+ | DURATIONCOMMAND STRING {
+ THIS->set_duration_mode(*$2);
+ delete $2;
}
- | DURATIONCOMMAND '{' notemode_duration '}' {
- set_default_duration($3);
+ | DURATIONCOMMAND notemode_duration {
+ THIS->set_default_duration($2);
+ delete $2;
}
- | OCTAVECOMMAND '{' pitchmod '}' {
- set_default_octave(*$3);
+ | OCTAVECOMMAND {
+ /*
+ This is weird, but default_octave_i_
+ is used in steno_note_req too
+
+ c' -> default_octave_i_ == 1
+ */
+ /* why can't we have \oct{0} iso \oct{c'}*/
+ THIS->default_octave_i_ = 1; }
+/* cont */
+ steno_melodic_req {
+ THIS->default_octave_i_ = $3->octave_i_;
delete $3;
}
| TEXTSTYLE STRING {
- set_text_style(*$2);
+ THIS->textstyle_str_ = *$2;
delete $2;
}
;
duration_length:
- mudela_duration {
- $$ = new Moment(wholes($1[0], $1[1]));
+ {
+ $$ = new Moment(0,1);
}
- |int '*' mudela_duration {
- $$ = new Moment(Rational($1) * wholes($3[0], $3[1]));
+ | duration_length explicit_duration {
+ *$$ += $2->length();
}
;
-notemode_duration:
- explicit_duration
- | default_duration
+dots:
+ '.' { $$ = 1; }
+ | dots '.' { $$ ++; }
;
-mudela_duration:
- int {
- $$[0] = $1;
- $$[1] = 0;
+notemode_duration:
+ /* */ {
+ $$ = new Duration(THIS->default_duration_);
}
- | int DOTS {
- $$[0] = $1;
- $$[1] = $2;
+ | dots {
+ $$ = new Duration(THIS->default_duration_);
+ $$->dots_i_ = $1;
+ }
+ | explicit_duration {
+ THIS->set_last_duration($1);
+ $$ = $1;
}
;
-
explicit_duration:
- INT {
- last_duration($1);
- $$[0] = $1;
- $$[1] = 0;
- }
- | INT DOTS {
- last_duration($1);
- $$[0] = $1;
- $$[1] = $2;
- }
- | DOTS {
- get_default_duration($$);
- $$[1] = $1;
+ int {
+ $$ = new Duration;
+ if ( !Duration::duration_type_b($1) )
+ THIS->parser_error("Not a duration");
+ else {
+ $$->type_i_ = $1;
+ $$->set_plet(THIS->default_duration_);
+ }
}
- | INT '*' INT '/' INT {
- // ugh, must use Duration
- set_plet( $3, $5 );
- $$[ 0 ] = $1;
- $$[ 1 ] = 0;
- set_plet( 1, 1 );
+ | explicit_duration '.' {
+ $$->dots_i_ ++;
}
- ;
-
-default_duration:
- {
- get_default_duration($$);
- }
- ;
-
-pitchmod: {
- defined_ch_c_l = lexer->here_ch_c_l();
- $$ = new String;
+ | explicit_duration '*' int {
+ $$->plet_.iso_i_ *= $3;
}
- | PITCHMOD {
- defined_ch_c_l = lexer->here_ch_c_l();
- $$ = $1;
+ | explicit_duration '/' int {
+ $$->plet_.type_i_ *= $3;
}
;
-notename:
- NOTENAME
- ;
-voice_elt:
- pitchmod notename notemode_duration {
- $$ = get_note_element(*$1, $2, $3);
- delete $1;
+music_elt:
+ steno_note_req notemode_duration {
+ if (!THIS->lexer_p_->note_state_b())
+ THIS->parser_error("have to be in Note mode for notes");
+ $1->set_duration (*$2);
+ $$ = THIS->get_note_element($1, $2);
}
| RESTNAME notemode_duration {
- $$ = get_rest_element(*$1, $2);
+ $$ = THIS->get_rest_element(*$1, $2);
delete $1;
-
}
;
lyrics_elt:
- mudela_text notemode_duration {
- $$ = get_word_element($1, $2);
+ text_def notemode_duration {
+ /* this sux! text-def should be feature of lyric-engraver. */
+ if (!THIS->lexer_p_->lyric_state_b())
+ THIS->parser_error("Have to be in Lyric mode for lyrics");
+ $$ = THIS->get_word_element($1, $2);
+
};
/*
pitch_list: {
$$ = new Array<Melodic_req*>;
}
- | pitch_list NOTENAME {
- Melodic_req *m_p = new Melodic_req;
- m_p->notename_i_ = $2[0];
- m_p->accidental_i_ = $2[1];
- $$->push(m_p);
+ | pitch_list NOTENAME_ID {
+ $$->push($2->clone()->musical()->melodic());
}
;
int:
- real {
- $$ = int($1);
- if ( distance($1,Real(int($$)) ) > 1e-8)
- error( "integer expected", lexer->here_ch_c_l() );
+ INT {
+ $$ = $1;
+ }
+ | INT_IDENTIFIER {
+ $$ = * $1->intid(0);
}
;
+
real:
- INT {
- $$ = Real($1);
- }
- | REAL {
+ REAL {
$$ = $1;
}
- | IDENTIFIER {
+ | REAL_IDENTIFIER {
$$ = * $1->real(0);
}
;
$$ = new Lookup;
}
| IDENTIFIER {
- $$ = new Lookup(*$1->lookup(true));
+ $$ = $1->lookup(true);
}
| symtables_body TEXID STRING {
$$->texsetting = *$3;
delete $2;
}
| STRING {
- Box b;
+ Box b(Interval(0,0), Interval(0,0));
$$ = new Symbol(*$1, b);
delete $1;
}
%%
-void
-yyerror(const char *s)
+void
+My_lily_parser::set_yydebug(bool b )
{
- lexer->LexerError(s);
-
- if ( fatal_error_i )
- exit( fatal_error_i );
+#ifdef YYDEBUG
+ yydebug = b;
+#endif
}
-
void
-parse_file(String init, String s)
+My_lily_parser::do_yyparse()
{
- *mlog << "Parsing ... ";
- lexer = new My_flex_lexer;
-
-#ifdef YYDEBUG
- yydebug = !monitor->silence("InitParser") && check_debug;
- lexer->set_debug( !monitor->silence("InitLexer") && check_debug);
-#endif
-
- lexer->new_input(init);
- yyparse();
-
-#ifdef YYDEBUG
- yydebug = !monitor->silence("Parser") && check_debug;
- lexer->set_debug( !monitor->silence("Lexer") && check_debug);
-#endif
-
- lexer->new_input(s);
- yyparse();
- delete lexer;
- lexer = 0;
-
- if(!define_spots.empty())
- warning("Braces don't match.",0);
+ yyparse((void*)this);
}
Paper_def*
-default_paper()
+My_lily_parser::default_paper()
{
- return new Paper_def(
- lexer->lookup_identifier("default_table")->lookup(true));
+ Identifier *id = lexer_p_->lookup_identifier( "default_paper" );
+ return id ? id->paperdef(true) : new Paper_def ;
}
+Midi_def*
+My_lily_parser::default_midi()
+{
+ Identifier *id = lexer_p_->lookup_identifier( "default_midi" );
+ return id ? id->mididef(true) : new Midi_def ;
+}