X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flily-lexer.cc;h=4eaa4415690e298d140047f6b5bae9dd65ae4e58;hb=00e3e15364b9d3c94cda1bcab9f889bb95f6832d;hp=b7460bb609f093dc0b18d3deb7d980cc8f7de0b0;hpb=621e7e7fadf18a606275cb0c7619009423b56667;p=lilypond.git diff --git a/lily/lily-lexer.cc b/lily/lily-lexer.cc index b7460bb609..4eaa441569 100644 --- a/lily/lily-lexer.cc +++ b/lily/lily-lexer.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "lily-lexer.hh" @@ -21,6 +21,8 @@ using namespace std; #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[] = { @@ -80,8 +82,9 @@ static Keyword_ent the_key_tab[] {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; @@ -97,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_; @@ -179,6 +183,26 @@ Lily_lexer::lookup_keyword (string s) return keytable_->lookup (s.c_str ()); } +SCM +Lily_lexer::keyword_list () const +{ + if (!keytable_) + return SCM_EOL; + + SCM l = SCM_EOL; + SCM *tail = &l; + for (vsize i = 0; i < keytable_->table_.size (); i++) + { + *tail = scm_acons (scm_from_locale_string (keytable_->table_[i].name_), + scm_from_int (keytable_->table_[i].tokcode_), + SCM_EOL); + + tail = SCM_CDRLOC (*tail); + } + + return l; +} + SCM Lily_lexer::lookup_identifier_symbol (SCM sym) { @@ -201,15 +225,33 @@ Lily_lexer::lookup_identifier (string name) void Lily_lexer::start_main_input () { - // yy_flex_debug = 1; - new_input (main_input_name_, sources_); + yy_flex_debug = get_program_option ("debug-lexer"); + parser_->set_yydebug (get_program_option ("debug-parser")); - /* Do not allow \include in --safe-mode */ - allow_includes_b_ = allow_includes_b_ && !be_safe_global; + + new_input (main_input_name_, sources_); scm_module_define (scm_car (scopes_), ly_symbol2scm ("input-file-name"), - scm_makfrom0str (main_input_name_.c_str ())); + ly_string2scm (main_input_name_)); +} + +void +Lily_lexer::new_input (string str, string d, Sources *ss) +{ + Includable_lexer::new_input (str, d, ss); +} + +void +Lily_lexer::new_input (string str, Sources *ss) +{ + if (is_main_input_ && be_safe_global) + { + LexerError (_ ("include files are not allowed in safe mode").c_str ()); + return; + } + + Includable_lexer::new_input (str, ss); } void @@ -299,11 +341,13 @@ IMPLEMENT_DEFAULT_EQUAL_P (Lily_lexer); SCM Lily_lexer::mark_smob (SCM s) { - ASSERT_LIVE_IS_ALLOWED(); + 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_;