X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmy-lily-parser.cc;h=a04551bf45db759d2c28059b0a6fa5bcac93c48e;hb=7e72a1e50e94a7f9738d62599de79fe7745f600c;hp=c850a721041932d89cc7c333790a7af35de60fc7;hpb=94375d04f45b415ad705fd444fdb344416f116d9;p=lilypond.git diff --git a/lily/my-lily-parser.cc b/lily/my-lily-parser.cc index c850a72104..a04551bf45 100644 --- a/lily/my-lily-parser.cc +++ b/lily/my-lily-parser.cc @@ -3,108 +3,118 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2001 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 "parser.hh" -#include "file-results.hh" -#include "scope.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) { - source_l_ = source_l; - lexer_p_ = 0; + input_file_ = source; + lexer_ = 0; default_duration_ = Duration (2,0); - error_level_i_ = 0; + error_level_ = 0; + last_beam_start_ = SCM_EOL; - - default_header_p_ =0; + default_header_ =0; } My_lily_parser::~My_lily_parser () { - delete lexer_p_; - delete default_header_p_; + delete lexer_; + if (default_header_) + scm_gc_unprotect_object (default_header_->self_scm()); } -void -My_lily_parser::set_version_check (bool) -{ -} 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; - - lexer_p_->main_input_str_ = s; + lexer_ = new My_lily_lexer; + output_basename_ = out_file; + + lexer_->main_input_name_ = in_file; progress_indication (_ ("Parsing...")); set_yydebug (0); - lexer_p_->new_input (init, source_l_); + lexer_->new_input (init, &input_file_->sources_); do_yyparse (); progress_indication ("\n"); - if (!define_spot_array_.empty ()) + if (!define_spots_.empty ()) { - define_spot_array_.top ().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::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); - error_level_i_ = 1; + error_level_ = 1; exit_status_global = 1; } -void -My_lily_parser::set_last_duration (Duration const *d) -{ - default_duration_ = *d; -} Input My_lily_parser::pop_spot () { - return define_spot_array_.pop (); + return define_spots_.pop (); } Input My_lily_parser::here_input () const { - return lexer_p_->here_input (); + /* + 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); } -// move me? #include "paper-def.hh" -#include "translator-def.hh" +#include "context-def.hh" My_lily_parser * current_parser; @@ -115,14 +125,14 @@ My_lily_parser::paper_description () { My_lily_parser * me = current_parser; - Music_output_def *id = unsmob_music_output_def (me->lexer_p_->lookup_identifier ("$defaultpaper")); + Music_output_def *id = unsmob_music_output_def (me->lexer_->lookup_identifier ("$defaultpaper")); Paper_def *p = dynamic_cast (id->clone ()); - SCM al = p->translator_p_dict_p_->to_alist (); + SCM al = p->translator_tab_->to_alist (); SCM l = SCM_EOL; for (SCM s = al ; gh_pair_p (s); s = ly_cdr (s)) { - Translator_def * td = unsmob_translator_def (ly_cdar (s)); + Context_def * td = unsmob_context_def (ly_cdar (s)); l = gh_cons (gh_cons (ly_caar (s), td->to_alist ()), l); } return l;