X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flily-lexer.cc;h=2392f47b363d63917061b20583dd43ec9a18b01b;hb=d9bc24cb0b51b2d863e8d816c203137b88daec5c;hp=1840e54f17e0dbfc07743250bfa58ca43b2ba707;hpb=58bcc84c9480dae1b21bc24d8396b91fe19e0131;p=lilypond.git diff --git a/lily/lily-lexer.cc b/lily/lily-lexer.cc index 1840e54f17..2392f47b36 100644 --- a/lily/lily-lexer.cc +++ b/lily/lily-lexer.cc @@ -3,60 +3,59 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ #include "lily-lexer.hh" #include #include +using namespace std; -#include "scm-hash.hh" +#include "international.hh" #include "interval.hh" -#include "parser.hh" #include "keyword.hh" -#include "warn.hh" -#include "source-file.hh" #include "main.hh" #include "moment.hh" +#include "parser.hh" +#include "scm-hash.hh" +#include "source-file.hh" +#include "warn.hh" static Keyword_ent the_key_tab[] = { {"accepts", ACCEPTS}, - {"addquote", ADDQUOTE}, {"addlyrics", ADDLYRICS}, {"alias", ALIAS}, {"alternative", ALTERNATIVE}, - {"bar", BAR}, {"book", BOOK}, {"change", CHANGE}, - {"chords", CHORDS}, {"chordmode", CHORDMODE}, - {"clef", CLEF}, + {"chords", CHORDS}, {"consists", CONSISTS}, {"context", CONTEXT}, {"default", DEFAULT}, + {"defaultchild", DEFAULTCHILD}, {"denies", DENIES}, + {"description", DESCRIPTION}, {"drummode", DRUMMODE}, {"drums", DRUMS}, - {"description", DESCRIPTION}, - {"figures", FIGURES}, {"figuremode", FIGUREMODE}, + {"figures", FIGURES}, {"grobdescriptions", GROBDESCRIPTIONS}, {"header", HEADER}, {"key", KEY}, {"layout", LAYOUT}, {"lyricmode", LYRICMODE}, - {"lyricsto", LYRICSTO}, {"lyrics", LYRICS}, + {"lyricsto", LYRICSTO}, {"mark", MARK}, {"markup", MARKUP}, {"midi", MIDI}, {"name", NAME}, {"new", NEWCONTEXT}, - {"objectid", OBJECTID}, {"notemode", NOTEMODE}, - {"octave", OCTAVE}, + {"objectid", OBJECTID}, {"once", ONCE}, {"override", OVERRIDE}, {"paper", PAPER}, @@ -71,12 +70,10 @@ static Keyword_ent the_key_tab[] {"set", SET}, {"simultaneous", SIMULTANEOUS}, {"skip", SKIP}, - {"tag", TAG}, {"tempo", TEMPO}, {"time", TIME_T}, {"times", TIMES}, {"transpose", TRANSPOSE}, - {"transposition", TRANSPOSITION}, {"type", TYPE}, {"unset", UNSET}, {"with", WITH}, @@ -92,12 +89,12 @@ Lily_lexer::Lily_lexer (Sources *sources) scopes_ = SCM_EOL; error_level_ = 0; is_main_input_ = false; - + start_module_ = SCM_EOL; smobify_self (); add_scope (ly_make_anonymous_module (false)); push_note_state (scm_c_make_hash_table (0)); - chordmodifier_tab_ = scm_make_vector (scm_int2num (1), SCM_EOL); + chordmodifier_tab_ = scm_make_vector (scm_from_int (1), SCM_EOL); } Lily_lexer::Lily_lexer (Lily_lexer const &src) @@ -107,6 +104,7 @@ Lily_lexer::Lily_lexer (Lily_lexer const &src) chordmodifier_tab_ = src.chordmodifier_tab_; pitchname_tab_stack_ = src.pitchname_tab_stack_; sources_ = src.sources_; + start_module_ = SCM_EOL; error_level_ = src.error_level_; is_main_input_ = src.is_main_input_; @@ -138,12 +136,14 @@ void Lily_lexer::add_scope (SCM module) { ly_reexport_module (scm_current_module ()); - scm_set_current_module (module); + if (!scm_is_pair (scopes_)) + start_module_ = scm_current_module (); + for (SCM s = scopes_; scm_is_pair (s); s = scm_cdr (s)) - { - ly_use_module (module, scm_car (s)); - } + ly_use_module (module, scm_car (s)); scopes_ = scm_cons (module, scopes_); + + set_current_scope (); } SCM @@ -151,15 +151,27 @@ Lily_lexer::remove_scope () { SCM sc = scm_car (scopes_); scopes_ = scm_cdr (scopes_); - scm_set_current_module (scm_car (scopes_)); - + set_current_scope (); return sc; } +SCM +Lily_lexer::set_current_scope () +{ + SCM old = scm_current_module (); + + if (scm_is_pair (scopes_)) + scm_set_current_module (scm_car (scopes_)); + else + scm_set_current_module (start_module_); + + return old; +} + int -Lily_lexer::lookup_keyword (String s) +Lily_lexer::lookup_keyword (string s) { - return keytable_->lookup (s.to_str0 ()); + return keytable_->lookup (s.c_str ()); } SCM @@ -176,9 +188,9 @@ Lily_lexer::lookup_identifier_symbol (SCM sym) } SCM -Lily_lexer::lookup_identifier (String name) +Lily_lexer::lookup_identifier (string name) { - return lookup_identifier_symbol (ly_symbol2scm (name.to_str0 ())); + return lookup_identifier_symbol (ly_symbol2scm (name.c_str ())); } void @@ -192,7 +204,7 @@ Lily_lexer::start_main_input () scm_module_define (scm_car (scopes_), ly_symbol2scm ("input-file-name"), - scm_makfrom0str (main_input_name_.to_str0 ())); + scm_makfrom0str (main_input_name_.c_str ())); } void @@ -206,8 +218,8 @@ Lily_lexer::set_identifier (SCM name, SCM s) { if (lookup_keyword (ly_symbol2string (sym)) >= 0) { - String symstr = ly_symbol2string (sym); - warning (_f ("Identifier name is a keyword: `%s'", symstr.to_str0 ())); + string symstr = ly_symbol2string (sym); + warning (_f ("identifier name is a keyword: `%s'", symstr.c_str ())); } SCM mod = scm_car (scopes_); @@ -215,16 +227,14 @@ Lily_lexer::set_identifier (SCM name, SCM s) scm_module_define (mod, sym, s); } else - { - programming_error ("Identifier is not a symbol."); - } + programming_error ("identifier is not a symbol"); } void Lily_lexer::LexerError (char const *s) { - if (include_stack_.is_empty ()) - progress_indication (_f ("error at EOF: %s", s) + String ("\n")); + if (include_stack_.empty ()) + message (_f ("error at EOF: %s", s) + "\n"); else { error_level_ |= 1; @@ -253,7 +263,7 @@ Lily_lexer::escaped_char (char c) const Input Lily_lexer::here_input () const { - return Input(*lexloc); + return Input (*lexloc); } void @@ -269,10 +279,10 @@ Lily_lexer::prepare_for_next_token () void Lily_lexer::add_lexed_char (int count) { - lexloc->source_file_ = get_source_file (); - lexloc->start_ = here_str0 (); - lexloc->end_ = lexloc->start_ + count; - char_count_stack_.top () += count; + char const *start = here_str0 (); + lexloc->set (get_source_file (), + start, start + count); + char_count_stack_.back () += count; } #include "ly-smobs.icc" @@ -288,13 +298,17 @@ Lily_lexer::mark_smob (SCM s) scm_gc_mark (lexer->chordmodifier_tab_); scm_gc_mark (lexer->pitchname_tab_stack_); + scm_gc_mark (lexer->start_module_); return lexer->scopes_; } int -Lily_lexer::print_smob (SCM, SCM port, scm_print_state*) +Lily_lexer::print_smob (SCM s, SCM port, scm_print_state*) { + Lily_lexer *lexer = Lily_lexer::unsmob (s); + scm_puts ("#scopes_, port); scm_puts (" >", port); return 1; }