X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmy-lily-parser.cc;h=f000e678be1d5e317964775e870f37f6c812a2e3;hb=b1a521c92717244d4bff11bb0b2b1304e4355956;hp=b2529c270e73eab1b25865f99f2a6085b6ce325f;hpb=7aabfb20c46e0a1de41698ddc6859ccd3a6dea85;p=lilypond.git diff --git a/lily/my-lily-parser.cc b/lily/my-lily-parser.cc index b2529c270e..f000e678be 100644 --- a/lily/my-lily-parser.cc +++ b/lily/my-lily-parser.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2003 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -30,26 +30,30 @@ My_lily_parser::~My_lily_parser () { delete lexer_; if (default_header_) - scm_gc_unprotect_object (default_header_->self_scm()); + 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_ = new My_lily_lexer; - - lexer_->main_input_string_ = s; + output_basename_ = out_file; + + lexer_->main_input_name_ = in_file; progress_indication (_ ("Parsing...")); 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 (); progress_indication ("\n"); - if (!define_spots_.empty ()) + if (!define_spots_.is_empty ()) { define_spots_.top ().warning (_ ("Braces don't match")); error_level_ = 1; @@ -93,13 +97,27 @@ My_lily_parser::here_input () const { /* Parsing looks ahead , so we really want the previous location of the - lexer, not lexer_->here_input(). + lexer, not lexer_->here_input (). */ - return lexer_->last_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); } #include "paper-def.hh" -#include "translator-def.hh" +#include "context-def.hh" My_lily_parser * current_parser; @@ -117,7 +135,7 @@ My_lily_parser::paper_description () 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;