X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fmy-lily-lexer.cc;h=374a078390db5bc698d06101c26f08db1299c4df;hb=98ca84585c45f75503adff82fc0a8cec2a105769;hp=d84f6f4e52a520d5b5afc366765d589da5ef1dda;hpb=66331c5dd92bbe2926a8566e0a2defc4834b5967;p=lilypond.git diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc index d84f6f4e52..374a078390 100644 --- a/lily/my-lily-lexer.cc +++ b/lily/my-lily-lexer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2003 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ #include @@ -12,7 +12,6 @@ #include "lily-proto.hh" #include "scm-hash.hh" #include "interval.hh" -#include "input-file-results.hh" #include "lily-guile.hh" #include "parser.hh" #include "keyword.hh" @@ -22,21 +21,18 @@ #include "main.hh" #include "input.hh" #include "moment.hh" -#include "ly-modules.hh" +#include "ly-module.hh" -static Keyword_ent the_key_tab[]={ +static Keyword_ent the_key_tab[] = { {"accepts", ACCEPTS}, - {"addlyrics", ADDLYRICS}, + {"addquote", ADDQUOTE}, {"alias", ALIAS}, {"alternative", ALTERNATIVE}, - {"apply", APPLY}, - {"applycontext", APPLYCONTEXT}, - {"applyoutput", APPLYOUTPUT}, - {"autochange", AUTOCHANGE}, {"bar", BAR}, - {"breathe", BREATHE}, - {"chordmodifiers", CHORDMODIFIERS}, + {"book", BOOK}, + {"bookpaper", BOOKPAPER}, + {"change", CHANGE}, {"chords", CHORDS}, {"clef", CLEF}, {"consists", CONSISTS}, @@ -44,29 +40,27 @@ static Keyword_ent the_key_tab[]={ {"context", CONTEXT}, {"default", DEFAULT}, {"denies", DENIES}, + {"drums", DRUMS}, {"description", DESCRIPTION}, - {"duration", DURATION}, {"figures",FIGURES}, - {"grace", GRACE}, {"grobdescriptions", GROBDESCRIPTIONS}, {"header", HEADER}, {"key", KEY}, {"lyrics", LYRICS}, + {"lyricsto", LYRICSTO}, {"mark", MARK}, {"markup", MARKUP}, {"midi", MIDI}, {"name", NAME}, + {"new", NEWCONTEXT}, + {"newlyrics", NEWLYRICS}, {"notes", NOTES}, {"octave", OCTAVE}, {"once", ONCE}, - {"outputproperty", OUTPUTPROPERTY}, {"override", OVERRIDE}, {"paper", PAPER}, - {"partcombine", PARTCOMBINE}, {"partial", PARTIAL}, - {"pitch", PITCH}, - {"pitchnames", PITCHNAMES}, - {"property", PROPERTY}, + {"quote", QUOTE}, {"relative", RELATIVE}, {"remove", REMOVE}, {"repeat", REPEAT}, @@ -77,55 +71,88 @@ static Keyword_ent the_key_tab[]={ {"set", SET}, {"simultaneous", SIMULTANEOUS}, {"skip", SKIP}, + {"tag", TAG}, {"tempo", TEMPO}, {"time", TIME_T}, {"times", TIMES}, - {"translator", TRANSLATOR}, {"transpose", TRANSPOSE}, + {"transposition", TRANSPOSITION}, {"type", TYPE}, {"unset", UNSET}, - {0,0} + {"with", WITH}, + {0, 0} }; -My_lily_lexer::My_lily_lexer () +My_lily_lexer::My_lily_lexer (Sources *sources) { keytable_ = new Keyword_table (the_key_tab); + encoding_ = SCM_EOL; + chordmodifier_tab_ = scm_make_vector (scm_int2num (1), SCM_EOL); + pitchname_tab_stack_ = SCM_EOL; + sources_ = sources; scopes_ = SCM_EOL; + error_level_ = 0; + main_input_b_ = false; - add_scope(ly_make_anonymous_module()); - errorlevel_ =0; + add_scope (ly_make_anonymous_module (false)); +} - main_input_b_ = false; +My_lily_lexer::My_lily_lexer (My_lily_lexer const &src) + : Includable_lexer () +{ + keytable_ = (src.keytable_) ? new Keyword_table (*src.keytable_) : 0; + encoding_ = src.encoding_; + chordmodifier_tab_ = src.chordmodifier_tab_; + pitchname_tab_stack_ = src.pitchname_tab_stack_; + sources_ = src.sources_; + + error_level_ = src.error_level_; + main_input_b_ = src.main_input_b_; + + SCM scopes = SCM_EOL; + SCM* tail = &scopes; + for (SCM s = src.scopes_; ly_c_pair_p (s); s = ly_cdr (s)) + { + SCM newmod = ly_make_anonymous_module (false); + ly_import_module (newmod, ly_car (s)); + *tail = scm_cons (newmod, SCM_EOL); + tail = SCM_CDRLOC (*tail); + } + + scopes_ = scopes; } +My_lily_lexer::~My_lily_lexer () +{ + delete keytable_; +} + +SCM +My_lily_lexer::encoding () const +{ + return encoding_ ; +} + + void My_lily_lexer::add_scope (SCM module) { - ly_reexport_module (scm_current_module()); + ly_reexport_module (scm_current_module ()); scm_set_current_module (module); - for (SCM s = scopes_; gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = scopes_; ly_c_pair_p (s); s = ly_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); + ly_use_module (module, ly_car (s)); } - 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_)); + SCM sc = ly_car (scopes_); + scopes_ = ly_cdr (scopes_); + scm_set_current_module (ly_car (scopes_)); return sc; } @@ -138,66 +165,70 @@ My_lily_lexer::lookup_keyword (String s) } SCM -My_lily_lexer::lookup_identifier (String s) +My_lily_lexer::lookup_identifier_symbol (SCM sym) { - SCM sym = ly_symbol2scm (s.to_str0()); - for (SCM s = scopes_; gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = scopes_; ly_c_pair_p (s); s = ly_cdr (s)) { - SCM var = ly_module_lookup (gh_car (s), sym); + SCM var = ly_module_lookup (ly_car (s), sym); if (var != SCM_BOOL_F) - return scm_variable_ref(var); + return scm_variable_ref (var); } return SCM_UNDEFINED; } +SCM +My_lily_lexer::lookup_identifier (String name) +{ + return lookup_identifier_symbol (ly_symbol2scm (name.to_str0 ())); +} + void My_lily_lexer::start_main_input () -{ - new_input (main_input_string_, &global_input_file->sources_); - allow_includes_b_ = allow_includes_b_ && ! (safe_global_b); +{ + // yy_flex_debug = 1; + new_input (main_input_name_, sources_); + + /* Do not allow \include in --safe-mode */ + allow_includes_b_ = allow_includes_b_ && !safe_global_b; - scm_module_define (gh_car (scopes_), + scm_module_define (ly_car (scopes_), ly_symbol2scm ("input-file-name"), - scm_makfrom0str (main_input_string_.to_str0())); + scm_makfrom0str (main_input_name_.to_str0 ())); } void My_lily_lexer::set_identifier (SCM name, SCM s) { - assert (gh_string_p (name)); + SCM sym = name; + if (ly_c_string_p (name)) + sym = scm_string_to_symbol (name); - if (lookup_keyword (ly_scm2string (name)) >= 0) + if (ly_c_symbol_p (sym)) { - size_t sz; - char * str = gh_scm2newstr (name, &sz) ; - warning (_f ("Identifier name is a keyword: `%s'", str)); - free (str); - } - - SCM sym = scm_string_to_symbol (name); - SCM mod = gh_car (scopes_); + if (lookup_keyword (ly_symbol2string (sym)) >= 0) + { + warning (_f ("Identifier name is a keyword: `%s'", SCM_SYMBOL_CHARS (sym))); + } - scm_module_define (mod, sym, s); -} + SCM mod = ly_car (scopes_); -My_lily_lexer::~My_lily_lexer () -{ - delete keytable_; + scm_module_define (mod, sym, s); + } + else + { + programming_error ("Identifier is not a symbol."); + } } - - void My_lily_lexer::LexerError (char const *s) { - if (include_stack_.empty ()) - { - progress_indication (_f ("error at EOF: %s", s)+ String ("\n")); - } + if (include_stack_.is_empty ()) + progress_indication (_f ("error at EOF: %s", s) + String ("\n")); else { - errorlevel_ |= 1; + error_level_ |= 1; Input spot (get_source_file (), here_str0 ()); spot.error (s); } @@ -212,7 +243,6 @@ My_lily_lexer::escaped_char (char c) const return '\n'; case 't': return '\t'; - case '\'': case '\"': case '\\': @@ -231,23 +261,14 @@ My_lily_lexer::here_input () const void My_lily_lexer::prepare_for_next_token () { - last_input_ = here_input(); + last_input_ = here_input (); } -#if 0 -SCM -My_lily_lexer::scan_markup_word (String s) +void +My_lily_lexer::set_encoding (String s) { - /* - TODO: better implementation: - - - make a table of markup functions, for quicker lookup - - - error handling. - - */ - SCM s = scm_c_eval_str ((s + "-markup").to_str0()); - yylval.scm = s; - return MARKUP_HEAD; + if (s.length ()) + encoding_ = ly_symbol2scm (s.to_str0 ()); + else + encoding_ = SCM_EOL; } -#endif