X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmy-lily-lexer.cc;h=61da4ba258b33a4c5719352b5811ad416a29aba5;hb=b9fc4bb5b3ce7d75e7e5284352eeaa04bbe78e14;hp=a20e1df14a7662d8909cc02a2707b97bee7b9323;hpb=103b4daf1ba90415029388126ce9f742b9cf62db;p=lilypond.git diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc index a20e1df14a..61da4ba258 100644 --- a/lily/my-lily-lexer.cc +++ b/lily/my-lily-lexer.cc @@ -3,137 +3,197 @@ 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}, + {"acciaccatura", ACCIACCATURA}, {"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}, + {"change", CHANGE}, {"chordmodifiers", CHORDMODIFIERS}, {"chords", CHORDS}, {"clef", CLEF}, - {"cm", CM_T}, {"consists", CONSISTS}, {"consistsend", CONSISTSEND}, {"context", CONTEXT}, + {"default", DEFAULT}, {"denies", DENIES}, - {"duration", DURATION}, - {"dynamicscript", DYNAMICSCRIPT}, - {"font", FONT}, + {"description", DESCRIPTION}, + {"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}, + {"newaddlyrics", NEWADDLYRICS}, {"notes", NOTES}, - {"outputproperty", OUTPUTPROPERTY}, - {"push", PUSH}, - {"pop", POP}, - {"partial", PARTIAL}, + {"octave", OCTAVE}, + {"once", ONCE}, + {"override", OVERRIDE}, {"paper", PAPER}, - {"penalty", PENALTY}, + {"partcombine", PARTCOMBINE}, + {"partial", PARTIAL}, + {"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}, + {"tag", TAG}, {"tempo", TEMPO}, + {"time", TIME_T}, + {"times", TIMES}, {"translator", TRANSLATOR}, {"transpose", TRANSPOSE}, {"type", TYPE}, + {"unset", UNSET}, + {"with", WITH}, {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_name_, &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_name_.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_; } @@ -141,22 +201,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'; @@ -174,6 +234,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(); }