X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flily-lexer.cc;h=394e20089b9586676e6e40048d6196e14d76feee;hb=08b2a48bdd102e2e53b4eafaf8bdc4726e4f1119;hp=dd4c5e1b1d3cefec46ecd1c6baa8cc8150dc81e2;hpb=75eebcb49e52d296b1da3e1074e0825d2c780db4;p=lilypond.git diff --git a/lily/lily-lexer.cc b/lily/lily-lexer.cc index dd4c5e1b1d..394e20089b 100644 --- a/lily/lily-lexer.cc +++ b/lily/lily-lexer.cc @@ -12,20 +12,22 @@ #include using namespace std; -#include "scm-hash.hh" +#include "international.hh" #include "interval.hh" -#include "parser.hh" #include "keyword.hh" -#include "warn.hh" -#include "source-file.hh" #include "main.hh" #include "moment.hh" +#include "parser.hh" +#include "scm-hash.hh" +#include "source-file.hh" +#include "warn.hh" +#include "program-option.hh" +#include "lily-parser.hh" static Keyword_ent the_key_tab[] = { {"accepts", ACCEPTS}, {"addlyrics", ADDLYRICS}, - {"addquote", ADDQUOTE}, {"alias", ALIAS}, {"alternative", ALTERNATIVE}, {"book", BOOK}, @@ -56,7 +58,6 @@ static Keyword_ent the_key_tab[] {"new", NEWCONTEXT}, {"notemode", NOTEMODE}, {"objectid", OBJECTID}, - {"octave", OCTAVE}, {"once", ONCE}, {"override", OVERRIDE}, {"paper", PAPER}, @@ -75,15 +76,15 @@ static Keyword_ent the_key_tab[] {"time", TIME_T}, {"times", TIMES}, {"transpose", TRANSPOSE}, - {"transposition", TRANSPOSITION}, {"type", TYPE}, {"unset", UNSET}, {"with", WITH}, {0, 0} }; -Lily_lexer::Lily_lexer (Sources *sources) +Lily_lexer::Lily_lexer (Sources *sources, Lily_parser *parser) { + parser_ = parser; keytable_ = new Keyword_table (the_key_tab); chordmodifier_tab_ = SCM_EOL; pitchname_tab_stack_ = SCM_EOL; @@ -99,9 +100,10 @@ Lily_lexer::Lily_lexer (Sources *sources) chordmodifier_tab_ = scm_make_vector (scm_from_int (1), SCM_EOL); } -Lily_lexer::Lily_lexer (Lily_lexer const &src) +Lily_lexer::Lily_lexer (Lily_lexer const &src, Lily_parser *parser) : Includable_lexer () { + parser_ = parser; keytable_ = (src.keytable_) ? new Keyword_table (*src.keytable_) : 0; chordmodifier_tab_ = src.chordmodifier_tab_; pitchname_tab_stack_ = src.pitchname_tab_stack_; @@ -147,6 +149,11 @@ Lily_lexer::add_scope (SCM module) set_current_scope (); } +bool +Lily_lexer::has_scope () const +{ + return scm_is_pair (scopes_); +} SCM Lily_lexer::remove_scope () @@ -171,9 +178,9 @@ Lily_lexer::set_current_scope () } int -Lily_lexer::lookup_keyword (String s) +Lily_lexer::lookup_keyword (string s) { - return keytable_->lookup (s.to_str0 ()); + return keytable_->lookup (s.c_str ()); } SCM @@ -190,15 +197,18 @@ Lily_lexer::lookup_identifier_symbol (SCM sym) } SCM -Lily_lexer::lookup_identifier (String name) +Lily_lexer::lookup_identifier (string name) { - return lookup_identifier_symbol (ly_symbol2scm (name.to_str0 ())); + return lookup_identifier_symbol (ly_symbol2scm (name.c_str ())); } void Lily_lexer::start_main_input () { - // yy_flex_debug = 1; + yy_flex_debug = get_program_option ("debug-lexer"); + parser_->set_yydebug (get_program_option ("debug-parser")); + + new_input (main_input_name_, sources_); /* Do not allow \include in --safe-mode */ @@ -206,7 +216,7 @@ Lily_lexer::start_main_input () scm_module_define (scm_car (scopes_), ly_symbol2scm ("input-file-name"), - scm_makfrom0str (main_input_name_.to_str0 ())); + scm_makfrom0str (main_input_name_.c_str ())); } void @@ -220,8 +230,8 @@ Lily_lexer::set_identifier (SCM name, SCM s) { if (lookup_keyword (ly_symbol2string (sym)) >= 0) { - String symstr = ly_symbol2string (sym); - warning (_f ("identifier name is a keyword: `%s'", symstr.to_str0 ())); + string symstr = ly_symbol2string (sym); + warning (_f ("identifier name is a keyword: `%s'", symstr.c_str ())); } SCM mod = scm_car (scopes_); @@ -235,7 +245,7 @@ Lily_lexer::set_identifier (SCM name, SCM s) void Lily_lexer::LexerError (char const *s) { - if (include_stack_.is_empty ()) + if (include_stack_.empty ()) message (_f ("error at EOF: %s", s) + "\n"); else { @@ -284,7 +294,7 @@ Lily_lexer::add_lexed_char (int count) char const *start = here_str0 (); lexloc->set (get_source_file (), start, start + count); - char_count_stack_.top () += count; + char_count_stack_.back () += count; } #include "ly-smobs.icc" @@ -296,9 +306,13 @@ IMPLEMENT_DEFAULT_EQUAL_P (Lily_lexer); SCM Lily_lexer::mark_smob (SCM s) { + ASSERT_LIVE_IS_ALLOWED(); + Lily_lexer *lexer = (Lily_lexer *) SCM_CELL_WORD_1 (s); scm_gc_mark (lexer->chordmodifier_tab_); + if (lexer->parser_) + scm_gc_mark (lexer->parser_->self_scm ()); scm_gc_mark (lexer->pitchname_tab_stack_); scm_gc_mark (lexer->start_module_); return lexer->scopes_;