X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmy-lily-parser.cc;h=f000e678be1d5e317964775e870f37f6c812a2e3;hb=b1a521c92717244d4bff11bb0b2b1304e4355956;hp=11ae2eeda45ac03929a2b17894f45bf7b3e8e4c8;hpb=3a0e9efb7f067e5b334ba0596b95e15d96d7cc49;p=lilypond.git diff --git a/lily/my-lily-parser.cc b/lily/my-lily-parser.cc index 11ae2eeda4..f000e678be 100644 --- a/lily/my-lily-parser.cc +++ b/lily/my-lily-parser.cc @@ -3,214 +3,142 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1999 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys Jan Nieuwenhuizen */ #include "my-lily-parser.hh" #include "my-lily-lexer.hh" -#include "debug.hh" +#include "warn.hh" #include "main.hh" -#include "music-list.hh" -#include "musical-request.hh" -#include "command-request.hh" -#include "lily-guile.hh" #include "parser.hh" -#include "scope.hh" -#include "file-results.hh" -#include "midi-def.hh" -#include "paper-def.hh" -#include "identifier.hh" -#include "chord.hh" +#include "input-file-results.hh" +#include "scm-hash.hh" -My_lily_parser::My_lily_parser (Sources * source_l) +My_lily_parser::My_lily_parser (Input_file_results * source) { - first_b_ = true; - source_l_ = source_l; - lexer_p_ = 0; - abbrev_beam_type_i_ = 0; - default_duration_.durlog_i_ = 2; - default_pitch_ = Musical_pitch (5*7, 0); - error_level_i_ = 0; - - fatal_error_i_ = 0; - default_header_p_ =0; -} + input_file_ = source; + lexer_ = 0; + default_duration_ = Duration (2,0); + error_level_ = 0; + last_beam_start_ = SCM_EOL; -My_lily_parser::~My_lily_parser() -{ - delete lexer_p_; - delete default_header_p_; + default_header_ =0; } - - -void -My_lily_parser::set_version_check (bool ig) +My_lily_parser::~My_lily_parser () { - ignore_version_b_ = ig; + delete lexer_; + if (default_header_) + scm_gc_unprotect_object (default_header_->self_scm ()); } +/* Process one .ly file, or book. */ void -My_lily_parser::parse_file (String init, String s) +My_lily_parser::parse_file (String init, String in_file, String out_file) { - lexer_p_ = new My_lily_lexer; - init_str_ = init; - lexer_p_->main_input_str_ = s; + lexer_ = new My_lily_lexer; + output_basename_ = out_file; + + lexer_->main_input_name_ = in_file; - *mlog << _ ("Parsing..."); + progress_indication (_ ("Parsing...")); - init_parse_b_ = false; - set_yydebug (flower_dstream &&!flower_dstream->silent_b ("Parser")); - lexer_p_->new_input (init, source_l_); + set_yydebug (0); + lexer_->new_input (init, &input_file_->sources_); + + /* Read .ly IN_FILE, lex, parse, write \score blocks from IN_FILE to + OUT_FILE (unless IN_FILE redefines output file name). */ do_yyparse (); - if (!define_spot_array_.empty()) + progress_indication ("\n"); + + if (!define_spots_.is_empty ()) { - warning (_ ("Braces don't match")); - error_level_i_ = 1; + define_spots_.top ().warning (_ ("Braces don't match")); + error_level_ = 1; } - inclusion_global_array = lexer_p_->filename_str_arr_; + input_file_->inclusion_names_ = lexer_->filename_strings_; - error_level_i_ = error_level_i_ | lexer_p_->errorlevel_i_; // ugh naming. + error_level_ = error_level_ | lexer_->errorlevel_; // ugh naming. } void -My_lily_parser::remember_spot() +My_lily_parser::push_spot () { - define_spot_array_.push (here_input()); + define_spots_.push (here_input ()); } char const * -My_lily_parser::here_ch_C() const +My_lily_parser::here_str0 () const { - return lexer_p_->here_ch_C(); + return lexer_->here_str0 (); } void My_lily_parser::parser_error (String s) { - here_input().error (s); - if (fatal_error_i_) - exit (fatal_error_i_); - error_level_i_ = 1; - exit_status_i_ = 1; + here_input ().error (s); + error_level_ = 1; + exit_status_global = 1; } -void -My_lily_parser::set_last_duration (Duration const *d) -{ - default_duration_ = *d; -} -void -My_lily_parser::set_abbrev_beam (int type_i) -{ - abbrev_beam_type_i_ = type_i; -} -void -My_lily_parser::set_last_pitch (Musical_pitch const* p) +Input +My_lily_parser::pop_spot () { - default_pitch_ = *p; + return define_spots_.pop (); } -// junk me -Simultaneous_music* -My_lily_parser::get_word_element (String s, Duration * duration_p) -{ - Simultaneous_music* velt_p = new Request_chord; - - Lyric_req* lreq_p = new Lyric_req; - lreq_p ->text_str_ = s; - lreq_p->duration_ = *duration_p; - lreq_p->set_spot (here_input()); - - velt_p->add_music (lreq_p); - - delete duration_p; - return velt_p; +Input +My_lily_parser::here_input () const +{ + /* + Parsing looks ahead , so we really want the previous location of the + lexer, not lexer_->here_input (). + */ + /* + Actually, that gets very icky when there are white space, because + the line-numbers are all wrong. Let's try the character before + the current token. That gets the right result for + note/duration stuff, but doesn't mess up for errors in the 1st token of the line. + + */ + Input hi (lexer_->here_input ()); + + char const * bla = hi.defined_str0_; + if (hi.line_number () > 1 + || hi.column_number () > 1) + bla --; + + return Input (hi.source_file_, bla); } -// junk me -Simultaneous_music * -My_lily_parser::get_rest_element (String s, Duration * duration_p) -{ - Simultaneous_music* velt_p = new Request_chord; - velt_p->set_spot (here_input()); - - if (s=="s") - { /* Space */ - Skip_req * skip_p = new Skip_req; - skip_p->duration_ = *duration_p; - - skip_p->set_spot (here_input()); - velt_p->add_music (skip_p); - } - else - { - Rest_req * rest_req_p = new Rest_req; - rest_req_p->duration_ = *duration_p; - rest_req_p->set_spot (here_input()); +#include "paper-def.hh" +#include "context-def.hh" - velt_p->add_music (rest_req_p); - } +My_lily_parser * current_parser; - delete duration_p; - return velt_p; -} +MAKE_SCHEME_CALLBACK (My_lily_parser,paper_description, 0); -// junk me -Simultaneous_music * -My_lily_parser::get_chord (Musical_pitch tonic, Array* add_arr_p, Array* sub_arr_p, Musical_pitch* inversion_p, Duration d) +SCM +My_lily_parser::paper_description () { - Simultaneous_music*v = new Request_chord; - v->set_spot (here_input ()); - - Chord chord (tonic, add_arr_p, sub_arr_p, inversion_p); + My_lily_parser * me = current_parser; - Tonic_req* t = new Tonic_req; - t->pitch_ = tonic; - v->add_music (t); + Music_output_def *id = unsmob_music_output_def (me->lexer_->lookup_identifier ("$defaultpaper")); + Paper_def *p = dynamic_cast (id->clone ()); - for (int i = 0; i < chord.pitch_arr_.size (); i++) + SCM al = p->translator_tab_->to_alist (); + SCM l = SCM_EOL; + for (SCM s = al ; gh_pair_p (s); s = ly_cdr (s)) { - Musical_pitch p = chord.pitch_arr_[i]; - Note_req* n = new Note_req; - n->pitch_ = p; - n->duration_ = d; - v->add_music (n); + Context_def * td = unsmob_context_def (ly_cdar (s)); + l = gh_cons (gh_cons (ly_caar (s), td->to_alist ()), l); } - - return v; -} - - - -Input -My_lily_parser::pop_spot() -{ - return define_spot_array_.pop(); -} - -Input -My_lily_parser::here_input() const -{ - return lexer_p_->here_input (); -} - -Paper_def* -My_lily_parser::default_paper_p () -{ - Identifier *id = lexer_p_->lookup_identifier ("$defaultpaper"); - return id ? id->access_content_Paper_def (true) : new Paper_def ; -} - -Midi_def* -My_lily_parser::default_midi_p () -{ - Identifier *id = lexer_p_->lookup_identifier ("$defaultmidi"); - return id ? id->access_content_Midi_def (true) : new Midi_def ; + return l; } +