X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmy-lily-lexer.cc;h=b3445a8a840df845466c0634c216bfc24061e8f8;hb=8aa7d17c7264f95f21a68cb3f51a0a3d5a87ab22;hp=059ab68dddde627a3199c5c9537fb52f9a2a672c;hpb=afa5829cd270e1b0c616b7ba5c5e6cdc0e920e5f;p=lilypond.git diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc index 059ab68ddd..b3445a8a84 100644 --- a/lily/my-lily-lexer.cc +++ b/lily/my-lily-lexer.cc @@ -3,216 +3,219 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1998 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys */ -#include #include -#include "notename-table.hh" +#include + +#include "lily-proto.hh" +#include "scm-hash.hh" #include "interval.hh" -#include "identifier.hh" +#include "input-file-results.hh" +#include "lily-guile.hh" #include "parser.hh" #include "keyword.hh" #include "my-lily-lexer.hh" -#include "debug.hh" +#include "warn.hh" #include "source-file.hh" -#include "parseconstruct.hh" #include "main.hh" -#include "scope.hh" +#include "input.hh" +#include "moment.hh" +#include "ly-modules.hh" + static Keyword_ent the_key_tab[]={ - {"absdynamic", ABSDYNAMIC}, + {"accacciatura", ACCACCIATURA}, {"accepts", ACCEPTS}, + {"addlyrics", ADDLYRICS}, + {"alias", ALIAS}, {"alternative", ALTERNATIVE}, + {"apply", APPLY}, + {"applycontext", APPLYCONTEXT}, + {"applyoutput", APPLYOUTPUT}, + {"appoggiatura", APPOGGIATURA}, + {"autochange", AUTOCHANGE}, {"bar", BAR}, - {"cadenza", CADENZA}, + {"breathe", BREATHE}, {"chordmodifiers", CHORDMODIFIERS}, {"chords", CHORDS}, {"clef", CLEF}, - {"cm", CM_T}, {"consists", CONSISTS}, + {"consistsend", CONSISTSEND}, + {"context", CONTEXT}, + {"default", DEFAULT}, + {"denies", DENIES}, + {"description", DESCRIPTION}, {"duration", DURATION}, - {"font", FONT}, - {"grouping", GROUPING}, + {"figures",FIGURES}, + {"grace", GRACE}, + {"grobdescriptions", GROBDESCRIPTIONS}, {"header", HEADER}, - {"in", IN_T}, - {"lyrics", LYRICS}, {"key", KEY}, - {"keysignature", KEYSIGNATURE}, + {"lyrics", LYRICS}, {"mark", MARK}, - {"musicalpitch", MUSICAL_PITCH}, - {"time", TIME_T}, - {"times", TIMES}, + {"markup", MARKUP}, {"midi", MIDI}, - {"mm", MM_T}, {"name", NAME}, - {"notenames", NOTENAMES}, - {"notes" , NOTES}, - {"partial", PARTIAL}, + {"new", NEWCONTEXT}, + {"notes", NOTES}, + {"octave", OCTAVE}, + {"once", ONCE}, + {"outputproperty", OUTPUTPROPERTY}, + {"override", OVERRIDE}, {"paper", PAPER}, - {"penalty", PENALTY}, + {"partcombine", PARTCOMBINE}, + {"partial", PARTIAL}, + {"pitch", PITCH}, + {"pitchnames", PITCHNAMES}, {"property", PROPERTY}, - {"pt", PT_T}, {"relative", RELATIVE}, {"remove", REMOVE}, {"repeat", REPEAT}, - {"scm", SCM_T}, - {"scmfile", SCMFILE}, + {"rest", REST}, + {"revert", REVERT}, {"score", SCORE}, - {"script", SCRIPT}, - {"shape", SHAPE}, + {"sequential", SEQUENTIAL}, + {"set", SET}, + {"simultaneous", SIMULTANEOUS}, {"skip", SKIP}, - {"table", TABLE}, - {"spandynamic", SPANDYNAMIC}, - {"symboltables", SYMBOLTABLES}, {"tempo", TEMPO}, + {"time", TIME_T}, + {"times", TIMES}, {"translator", TRANSLATOR}, - {"type", TYPE}, {"transpose", TRANSPOSE}, - {"version", VERSION}, + {"type", TYPE}, + {"unset", UNSET}, {0,0} }; -My_lily_lexer::My_lily_lexer() + +My_lily_lexer::My_lily_lexer () { - keytable_p_ = new Keyword_table (the_key_tab); - toplevel_scope_p_ = new Scope; - scope_l_arr_.push (toplevel_scope_p_); - errorlevel_i_ = 0; - note_tab_p_ = new Notename_table; - chordmodifier_tab_p_ = new Notename_table; + // yy_flex_debug = 1; + + keytable_ = new Keyword_table (the_key_tab); + + chordmodifier_tab_ = scm_make_vector (gh_int2scm (1), SCM_EOL); + pitchname_tab_ = scm_make_vector (gh_int2scm (1), SCM_EOL); + + scopes_ = SCM_EOL; + + add_scope(ly_make_anonymous_module()); + errorlevel_ =0; + main_input_b_ = false; } +void +My_lily_lexer::add_scope (SCM module) +{ + ly_reexport_module (scm_current_module()); + scm_set_current_module (module); + for (SCM s = scopes_; gh_pair_p (s); s = gh_cdr (s)) + { + /* + UGH. how to do this more neatly? + */ + SCM expr = scm_list_n (ly_symbol2scm ("module-use!"), + module, scm_list_n (ly_symbol2scm ("module-public-interface"), + gh_car (s), SCM_UNDEFINED), + SCM_UNDEFINED); + + scm_primitive_eval(expr); + } + + scopes_ = scm_cons (module, scopes_); +} + +SCM +My_lily_lexer::remove_scope () +{ + SCM sc = gh_car (scopes_); + scopes_ = gh_cdr (scopes_); + scm_set_current_module (gh_car (scopes_)); + + return sc; +} + + int My_lily_lexer::lookup_keyword (String s) { - return keytable_p_->lookup (s.ch_C ()); + return keytable_->lookup (s.to_str0 ()); } -Identifier* +SCM My_lily_lexer::lookup_identifier (String s) { - for (int i = scope_l_arr_.size (); i--; ) - if (scope_l_arr_[i]->elem_b (s)) - return (*scope_l_arr_[i])[s]; - return 0; + SCM sym = ly_symbol2scm (s.to_str0()); + for (SCM s = scopes_; gh_pair_p (s); s = gh_cdr (s)) + { + SCM var = ly_module_lookup (gh_car (s), sym); + if (var != SCM_BOOL_F) + return scm_variable_ref(var); + } + + return SCM_UNDEFINED; } void My_lily_lexer::start_main_input () { - if (!monitor->silent_b ("InitDeclarations") && check_debug) - print_declarations (true); - if (!monitor->silent_b ("InitLexer") && check_debug) - set_debug (1); + new_input (main_input_string_, &global_input_file->sources_); + allow_includes_b_ = allow_includes_b_ && ! (safe_global_b); - - new_input (main_input_str_, source_global_l); - if (safe_global_b) - allow_includes_b_ = false; - - print_declarations(true); + scm_module_define (gh_car (scopes_), + ly_symbol2scm ("input-file-name"), + scm_makfrom0str (main_input_string_.to_str0())); } void -My_lily_lexer::set_identifier (String name_str, Identifier* i, bool ) +My_lily_lexer::set_identifier (SCM name, SCM s) { - Identifier *old =0; - if (scope_l_arr_.top ()->elem_b (name_str)) - old = scope_l_arr_.top ()->elem(name_str); - - - if (old) - { -#if 0 - if (unique_b) - old->warning(_f ("redeclaration of `\\%s\'", name_str)); -#endif - delete old; - } - if (lookup_keyword (name_str) >= 0) + assert (gh_string_p (name)); + + if (lookup_keyword (ly_scm2string (name)) >= 0) { - warning ( _f ("Identifier name is a keyword (`%s')", name_str)); + size_t sz; + char * str = gh_scm2newstr (name, &sz) ; + warning (_f ("Identifier name is a keyword: `%s'", str)); + free (str); } - - (*scope_l_arr_.top ())[name_str] = i; -} -My_lily_lexer::~My_lily_lexer() -{ - delete keytable_p_; - delete toplevel_scope_p_ ; - delete note_tab_p_; + SCM sym = scm_string_to_symbol (name); + SCM mod = gh_car (scopes_); + + scm_module_define (mod, sym, s); } -void -My_lily_lexer::print_declarations (bool ) const +My_lily_lexer::~My_lily_lexer () { - for (int i=scope_l_arr_.size (); i--; ) - { - DOUT << "Scope no. " << i << '\n'; - scope_l_arr_[i]->print (); - } + delete keytable_; } + + void My_lily_lexer::LexerError (char const *s) { - if (include_stack_.empty()) + if (include_stack_.empty ()) { - *mlog << _f ("error at EOF: %s", s) << endl; + progress_indication (_f ("error at EOF: %s", s)+ String ("\n")); } else { - errorlevel_i_ |= 1; - Input spot (source_file_l(),here_ch_C()); + errorlevel_ |= 1; + Input spot (get_source_file (), here_str0 ()); spot.error (s); } } -Musical_pitch -My_lily_lexer::lookup_notename (String s) -{ - return (*note_tab_p_)[s]; -} - -Musical_pitch -My_lily_lexer::lookup_chordmodifier (String s) -{ - return (*chordmodifier_tab_p_)[s]; -} - -bool -My_lily_lexer::notename_b (String s) const -{ - return note_tab_p_->elem_b (s); -} - -void -My_lily_lexer::set_notename_table (Notename_table *p) -{ - delete note_tab_p_; - note_tab_p_ = p; -} - -bool -My_lily_lexer::chordmodifier_b (String s) const -{ - return chordmodifier_tab_p_->elem_b (s); -} - -void -My_lily_lexer::set_chordmodifier_table (Notename_table *p) -{ - delete chordmodifier_tab_p_; - chordmodifier_tab_p_ = p; -} - char -My_lily_lexer::escaped_char(char c) const +My_lily_lexer::escaped_char (char c) const { - switch(c) + switch (c) { case 'n': return '\n'; @@ -226,3 +229,16 @@ My_lily_lexer::escaped_char(char c) const } return 0; } + +Input +My_lily_lexer::here_input () const +{ + Source_file * f= get_source_file (); + return Input (f, (char*)here_str0 ()); +} + +void +My_lily_lexer::prepare_for_next_token () +{ + last_input_ = here_input(); +}