X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmy-lily-lexer.cc;h=658b052771340f1f1915d4505c375a7c0cdcaadb;hb=d9b43b93f2c885409bafdb157138158f65cc49aa;hp=1a46c7994cd31195627f23beff14bc683dc3f873;hpb=6bc0a8a090e82c4bce57df8e980b48cc78cb422b;p=lilypond.git diff --git a/lily/my-lily-lexer.cc b/lily/my-lily-lexer.cc index 1a46c7994c..658b052771 100644 --- a/lily/my-lily-lexer.cc +++ b/lily/my-lily-lexer.cc @@ -3,81 +3,105 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1998 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ #include #include -#include "notename-table.hh" + +#include "lily-proto.hh" +#include "scm-hash.hh" #include "interval.hh" -#include "identifier.hh" -#include "assoc-iter.hh" + +#include "lily-guile.hh" #include "parser.hh" #include "keyword.hh" -#include "assoc.hh" #include "my-lily-lexer.hh" #include "debug.hh" #include "source-file.hh" -#include "parseconstruct.hh" #include "main.hh" #include "scope.hh" +#include "input.hh" +#include "moment.hh" static Keyword_ent the_key_tab[]={ + {"alias", ALIAS}, + {"apply", APPLY}, + {"arpeggio", ARPEGGIO }, + {"autochange", AUTOCHANGE}, + {"spanrequest", SPANREQUEST}, + {"commandspanrequest", COMMANDSPANREQUEST}, + {"simultaneous", SIMULTANEOUS}, + {"sequential", SEQUENTIAL}, {"accepts", ACCEPTS}, + {"alternative", ALTERNATIVE}, {"bar", BAR}, - {"cadenza", CADENZA}, - {"clear", CLEAR}, + {"breathe", BREATHE}, + {"char", CHAR_T}, + {"chordmodifiers", CHORDMODIFIERS}, + {"chords", CHORDS}, {"clef", CLEF}, {"cm", CM_T}, {"consists", CONSISTS}, - {"contains", CONTAINS}, + {"consistsend", CONSISTSEND}, + {"context", CONTEXT}, + {"default", DEFAULT}, + {"denies", DENIES}, {"duration", DURATION}, - {"absdynamic", ABSDYNAMIC}, + {"dynamicscript", DYNAMICSCRIPT}, + {"grobdescriptions", GROBDESCRIPTIONS}, + {"figures",FIGURES}, + {"grace", GRACE}, + {"glissando", GLISSANDO}, + {"header", HEADER}, {"in", IN_T}, - {"translator", TRANSLATOR}, - {"type", TYPE}, - {"lyric", LYRIC}, + {"lyrics", LYRICS}, {"key", KEY}, - {"melodic" , MELODIC}, - {"musical_pitch", MUSICAL_PITCH}, - {"meter", METER}, + {"mark", MARK}, + {"pitch", PITCH}, + {"time", TIME_T}, + {"times", TIMES}, {"midi", MIDI}, {"mm", MM_T}, - {"multi", MULTI}, - {"header", HEADER}, - {"notenames", NOTENAMES}, - {"octave", OCTAVE}, - {"output", OUTPUT}, + {"name", NAME}, + {"pitchnames", PITCHNAMES}, + {"notes", NOTES}, + {"outputproperty", OUTPUTPROPERTY}, + {"override", OVERRIDE}, + {"set", SET}, + {"revert", REVERT}, {"partial", PARTIAL}, {"paper", PAPER}, {"penalty", PENALTY}, {"property", PROPERTY}, {"pt", PT_T}, {"relative", RELATIVE}, + {"remove", REMOVE}, + {"repeat", REPEAT}, + {"addlyrics", ADDLYRICS}, + {"partcombine", PARTCOMBINE}, {"score", SCORE}, {"script", SCRIPT}, - {"shape", SHAPE}, + {"stylesheet", STYLESHEET}, {"skip", SKIP}, - {"staff", STAFF}, - {"table", TABLE}, - {"spandynamic", SPANDYNAMIC}, - {"symboltables", SYMBOLTABLES}, {"tempo", TEMPO}, - {"texid", TEXID}, - {"textstyle", TEXTSTYLE}, + {"translator", TRANSLATOR}, {"transpose", TRANSPOSE}, - {"version", VERSION}, - {"grouping", GROUPING}, + {"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_); + toplevel_variable_tab_ = new Scheme_hash_table ; + scope_p_ = new Scope (toplevel_variable_tab_); + + scope_l_arr_.push (scope_p_); + errorlevel_i_ = 0; - note_tab_p_ = new Notename_table; + main_input_b_ = false; } int @@ -86,104 +110,66 @@ My_lily_lexer::lookup_keyword (String s) return keytable_p_->lookup (s.ch_C ()); } -Identifier* +SCM My_lily_lexer::lookup_identifier (String s) { - for (int i = scope_l_arr_.size (); i--; ) - if (scope_l_arr_[i]->elt_b (s)) - return (*scope_l_arr_[i])[s]; - return 0; + SCM sym = ly_symbol2scm (s.ch_C ()); + + for (int i = scope_l_arr_.size (); i--;) + { + SCM val = SCM_UNSPECIFIED; + if (scope_l_arr_[i]->try_retrieve (sym, &val)) + return val; + } + return SCM_UNSPECIFIED; } 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_str_, source_global_l); - - print_declarations(true); + allow_includes_b_ = allow_includes_b_ && ! (safe_global_b); } void -My_lily_lexer::set_identifier (String name_str, Identifier* i, bool unique_b) +My_lily_lexer::set_identifier (String name_str, SCM s) { - Identifier *old = lookup_identifier (name_str); - if (old) + if (lookup_keyword (name_str) >= 0) { - if (unique_b) - old->warning(_("redeclaration of \\") + name_str); - delete old; + warning (_f ("Identifier name is a keyword: `%s'", name_str)); } - (*scope_l_arr_.top ())[name_str] = i; + + scope_l_arr_.top ()->set (name_str, s); } -My_lily_lexer::~My_lily_lexer() +My_lily_lexer::~My_lily_lexer () { delete keytable_p_; - delete toplevel_scope_p_ ; - - - delete note_tab_p_; + scm_gc_unprotect_object (toplevel_variable_tab_->self_scm ()); + delete scope_p_ ; } -void -My_lily_lexer::print_declarations (bool init_b) const -{ - for (int i=scope_l_arr_.size (); i--; ) - { - DOUT << "Scope no. " << i << "\n"; - scope_l_arr_[i]->print (); - } -} + void My_lily_lexer::LexerError (char const *s) { - if (include_stack_.empty()) + if (include_stack_.empty ()) { - *mlog << _("error at EOF") << s << '\n'; + progress_indication (_f ("error at EOF: %s", s)+ String ("\n")); } else { errorlevel_i_ |= 1; - Input spot (source_file_l(),here_ch_C()); + Input spot (source_file_l (),here_ch_C ()); spot.error (s); } } -Musical_pitch -My_lily_lexer::lookup_pitch (String s) -{ - return (*note_tab_p_)[s]; -} - -bool -My_lily_lexer::notename_b (String s) const -{ - return note_tab_p_->elt_b (s); -} - -void -My_lily_lexer::add_notename (String s, Musical_pitch p) -{ - (*note_tab_p_)[s] = p; -} - -void -My_lily_lexer::clear_notenames() -{ - delete note_tab_p_; - note_tab_p_ = new Notename_table; -} - 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'; @@ -197,3 +183,10 @@ My_lily_lexer::escaped_char(char c) const } return 0; } + +Input +My_lily_lexer::here_input () const +{ + Source_file * f_l= source_file_l (); + return Input (f_l, (char*)here_ch_C ()); +}