X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmy-lily-lexer.cc;h=f412d4d2bad57262756c013d2484d9bd942fda26;hb=402045837e7134cdf90d1fcf31768c62227a4936;hp=bf1cb58de941b4449201ba5e3db69a9a522e917b;hpb=cda8fc1780778b760905c8832f7e984161218f20;p=lilypond.git diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc index bf1cb58de9..f412d4d2ba 100644 --- a/lily/my-lily-lexer.cc +++ b/lily/my-lily-lexer.cc @@ -3,141 +3,195 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2004 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[]={ - {"apply", APPLY}, - {"arpeggio", ARPEGGIO }, - {"autochange", AUTOCHANGE}, - {"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}, - {"chordmodifiers", CHORDMODIFIERS}, + {"change", CHANGE}, {"chords", CHORDS}, {"clef", CLEF}, - {"cm", CM_T}, {"consists", CONSISTS}, {"consistsend", CONSISTSEND}, {"context", CONTEXT}, + {"default", DEFAULT}, {"denies", DENIES}, - {"duration", DURATION}, - {"dynamicscript", DYNAMICSCRIPT}, - {"elementdescriptions", ELEMENTDESCRIPTIONS}, - {"font", FONT}, + {"drums", DRUMS}, + {"description", DESCRIPTION}, + {"figures",FIGURES}, {"grace", GRACE}, + {"grobdescriptions", GROBDESCRIPTIONS}, {"header", HEADER}, - {"in", IN_T}, - {"lyrics", LYRICS}, {"key", KEY}, + {"lyrics", LYRICS}, + {"lyricsto", NEWADDLYRICS}, {"mark", MARK}, - {"musicalpitch", MUSICAL_PITCH}, - {"time", TIME_T}, - {"times", TIMES}, + {"markup", MARKUP}, {"midi", MIDI}, - {"mm", MM_T}, {"name", NAME}, - {"pitchnames", PITCHNAMES}, + {"new", NEWCONTEXT}, {"notes", NOTES}, - {"outputproperty", OUTPUTPROPERTY}, + {"octave", OCTAVE}, + {"once", ONCE}, {"override", OVERRIDE}, - {"set", SET}, - {"revert", REVERT}, - {"partial", PARTIAL}, {"paper", PAPER}, - {"penalty", PENALTY}, - {"property", PROPERTY}, - {"pt", PT_T}, + {"partcombine", PARTCOMBINE}, + {"partial", PARTIAL}, {"relative", RELATIVE}, {"remove", REMOVE}, {"repeat", REPEAT}, - {"addlyrics", ADDLYRICS}, - {"partcombine", PARTCOMBINE}, + {"rest", REST}, + {"revert", REVERT}, {"score", SCORE}, - {"script", SCRIPT}, - {"stylesheet", STYLESHEET}, + {"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_stack_ = 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_; } @@ -145,22 +199,22 @@ My_lily_lexer::~My_lily_lexer() void My_lily_lexer::LexerError (char const *s) { - if (include_stack_.empty()) + if (include_stack_.is_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'; @@ -178,6 +232,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(); }