X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmy-lily-lexer.cc;h=b3445a8a840df845466c0634c216bfc24061e8f8;hb=8aa7d17c7264f95f21a68cb3f51a0a3d5a87ab22;hp=c85b0a398e3b66f2ca2ac41e56452279384e5ce9;hpb=dcb8f596283022b8fdc4385c5f9f72d48c6b46fa;p=lilypond.git diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc index c85b0a398e..b3445a8a84 100644 --- a/lily/my-lily-lexer.cc +++ b/lily/my-lily-lexer.cc @@ -3,136 +3,196 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys */ -#include #include +#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 "main.hh" -#include "scope.hh" #include "input.hh" #include "moment.hh" +#include "ly-modules.hh" + static Keyword_ent the_key_tab[]={ - {"autochange", AUTOCHANGE}, - {"arpeggio", ARPEGGIO }, - {"spanrequest", SPANREQUEST}, - {"commandspanrequest", COMMANDSPANREQUEST}, - {"simultaneous", SIMULTANEOUS}, - {"sequential", SEQUENTIAL}, + {"accacciatura", ACCACCIATURA}, {"accepts", ACCEPTS}, + {"addlyrics", ADDLYRICS}, + {"alias", ALIAS}, {"alternative", ALTERNATIVE}, + {"apply", APPLY}, + {"applycontext", APPLYCONTEXT}, + {"applyoutput", APPLYOUTPUT}, + {"appoggiatura", APPOGGIATURA}, + {"autochange", AUTOCHANGE}, {"bar", BAR}, {"breathe", BREATHE}, - {"char", CHAR_T}, {"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}, + {"figures",FIGURES}, {"grace", GRACE}, + {"grobdescriptions", GROBDESCRIPTIONS}, {"header", HEADER}, - {"in", IN_T}, - {"lyrics", LYRICS}, {"key", KEY}, + {"lyrics", LYRICS}, {"mark", MARK}, - {"musicalpitch", MUSICAL_PITCH}, - {"time", TIME_T}, - {"times", TIMES}, + {"markup", MARKUP}, {"midi", MIDI}, - {"mm", MM_T}, {"name", NAME}, - {"notenames", NOTENAMES}, + {"new", NEWCONTEXT}, {"notes", NOTES}, + {"octave", OCTAVE}, + {"once", ONCE}, {"outputproperty", OUTPUTPROPERTY}, - {"push", PUSH}, - {"pop", POP}, - {"partial", PARTIAL}, + {"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}, - {"addlyrics", ADDLYRICS}, - {"partcombine", PARTCOMBINE}, + {"rest", REST}, + {"revert", REVERT}, {"score", SCORE}, - {"script", SCRIPT}, + {"sequential", SEQUENTIAL}, + {"set", SET}, + {"simultaneous", SIMULTANEOUS}, {"skip", SKIP}, - {"textscript", TEXTSCRIPT}, {"tempo", TEMPO}, + {"time", TIME_T}, + {"times", TIMES}, {"translator", TRANSLATOR}, {"transpose", TRANSPOSE}, {"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; + // 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 ()); } SCM My_lily_lexer::lookup_identifier (String s) { - SCM sym = ly_symbol2scm (s.ch_C()); - - for (int i = scope_l_arr_.size (); i--; ) + SCM sym = ly_symbol2scm (s.to_str0()); + for (SCM s = scopes_; gh_pair_p (s); s = gh_cdr (s)) { - SCM val = SCM_UNSPECIFIED; - if (scope_l_arr_[i]->try_retrieve (sym, &val)) - return val; + SCM var = ly_module_lookup (gh_car (s), sym); + if (var != SCM_BOOL_F) + return scm_variable_ref(var); } - return SCM_UNSPECIFIED; + + return SCM_UNDEFINED; } void My_lily_lexer::start_main_input () { - new_input (main_input_str_, source_global_l); - allow_includes_b_ = allow_includes_b_ && !(safe_global_b); + new_input (main_input_string_, &global_input_file->sources_); + allow_includes_b_ = allow_includes_b_ && ! (safe_global_b); + + 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, SCM s) +My_lily_lexer::set_identifier (SCM name, SCM s) { - 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 ()->set (name_str, s); + + SCM sym = scm_string_to_symbol (name); + SCM mod = gh_car (scopes_); + + scm_module_define (mod, sym, s); } -My_lily_lexer::~My_lily_lexer() +My_lily_lexer::~My_lily_lexer () { - delete keytable_p_; - delete toplevel_scope_p_ ; + delete keytable_; } @@ -140,22 +200,22 @@ My_lily_lexer::~My_lily_lexer() void My_lily_lexer::LexerError (char const *s) { - if (include_stack_.empty()) + if (include_stack_.empty ()) { 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); } } 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'; @@ -173,6 +233,12 @@ My_lily_lexer::escaped_char(char c) const Input My_lily_lexer::here_input () const { - Source_file * f_l= source_file_l (); - return Input (f_l, (char*)here_ch_C ()); + Source_file * f= get_source_file (); + return Input (f, (char*)here_str0 ()); +} + +void +My_lily_lexer::prepare_for_next_token () +{ + last_input_ = here_input(); }