X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flily-lexer.cc;h=6db0e653e5480d224427df3488bd12ae5c1a3bb5;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=64878444a18f5164e7bc898d59e7b5c7cea46bfd;hpb=48dfdac8c2a8044d3154041bf67a531f302ac4d1;p=lilypond.git diff --git a/lily/lily-lexer.cc b/lily/lily-lexer.cc index 64878444a1..6db0e653e5 100644 --- a/lily/lily-lexer.cc +++ b/lily/lily-lexer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2011 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,6 +35,7 @@ using namespace std; #include "warn.hh" #include "program-option.hh" #include "lily-parser.hh" +#include "ly-module.hh" static Keyword_ent the_key_tab[] = @@ -56,9 +57,9 @@ static Keyword_ent the_key_tab[] {"description", DESCRIPTION}, {"drummode", DRUMMODE}, {"drums", DRUMS}, + {"etc", ETC}, {"figuremode", FIGUREMODE}, {"figures", FIGURES}, - {"grobdescriptions", GROBDESCRIPTIONS}, {"header", HEADER}, {"layout", LAYOUT}, {"lyricmode", LYRICMODE}, @@ -97,17 +98,18 @@ Lily_lexer::Lily_lexer (Sources *sources, Lily_parser *parser) scopes_ = SCM_EOL; error_level_ = 0; is_main_input_ = false; + main_input_level_ = 0; start_module_ = SCM_EOL; - chord_repetition_ = Chord_repetition (); extra_tokens_ = SCM_EOL; smobify_self (); add_scope (ly_make_module (false)); - push_note_state (scm_c_make_hash_table (0)); + push_note_state (SCM_EOL); chordmodifier_tab_ = scm_make_vector (scm_from_int (1), SCM_EOL); } -Lily_lexer::Lily_lexer (Lily_lexer const &src, Lily_parser *parser) +Lily_lexer::Lily_lexer (Lily_lexer const &src, Lily_parser *parser, + SCM override_input) : Includable_lexer () { parser_ = parser; @@ -115,29 +117,20 @@ Lily_lexer::Lily_lexer (Lily_lexer const &src, Lily_parser *parser) chordmodifier_tab_ = src.chordmodifier_tab_; pitchname_tab_stack_ = src.pitchname_tab_stack_; sources_ = src.sources_; + scopes_ = src.scopes_; start_module_ = SCM_EOL; - chord_repetition_ = src.chord_repetition_; error_level_ = 0; is_main_input_ = src.is_main_input_; + main_input_level_ = 0; - scopes_ = SCM_EOL; extra_tokens_ = SCM_EOL; + if (unsmob (override_input)) + override_input_ = *unsmob (override_input); smobify_self (); - SCM scopes = SCM_EOL; - SCM *tail = &scopes; - for (SCM s = src.scopes_; scm_is_pair (s); s = scm_cdr (s)) - { - SCM newmod = ly_make_module (false); - ly_module_copy (newmod, scm_car (s)); - *tail = scm_cons (newmod, SCM_EOL); - tail = SCM_CDRLOC (*tail); - } - - scopes_ = scopes; - push_note_state (scm_c_make_hash_table (0)); + push_note_state (SCM_EOL); } Lily_lexer::~Lily_lexer () @@ -187,7 +180,7 @@ Lily_lexer::set_current_scope () } int -Lily_lexer::lookup_keyword (string s) +Lily_lexer::lookup_keyword (const string &s) { return keytable_->lookup (s.c_str ()); } @@ -202,7 +195,7 @@ Lily_lexer::keyword_list () const SCM *tail = &l; for (vsize i = 0; i < keytable_->table_.size (); i++) { - *tail = scm_acons (scm_from_locale_string (keytable_->table_[i].name_), + *tail = scm_acons (scm_from_utf8_string (keytable_->table_[i].name_), scm_from_int (keytable_->table_[i].tokcode_), SCM_EOL); @@ -218,7 +211,7 @@ Lily_lexer::lookup_identifier_symbol (SCM sym) for (SCM s = scopes_; scm_is_pair (s); s = scm_cdr (s)) { SCM var = ly_module_lookup (scm_car (s), sym); - if (var != SCM_BOOL_F) + if (scm_is_true (var)) return scm_variable_ref (var); } @@ -226,7 +219,7 @@ Lily_lexer::lookup_identifier_symbol (SCM sym) } SCM -Lily_lexer::lookup_identifier (string name) +Lily_lexer::lookup_identifier (const string &name) { return lookup_identifier_symbol (ly_symbol2scm (name.c_str ())); } @@ -245,13 +238,13 @@ Lily_lexer::start_main_input () } void -Lily_lexer::new_input (string str, string d, Sources *ss) +Lily_lexer::new_input (const string &str, string d, Sources *ss) { Includable_lexer::new_input (str, d, ss); } void -Lily_lexer::new_input (string str, Sources *ss) +Lily_lexer::new_input (const string &str, Sources *ss) { if (is_main_input_ && be_safe_global) { @@ -290,8 +283,10 @@ Lily_lexer::set_identifier (SCM path, SCM val) if (scm_is_pair (path)) { SCM prev = ly_module_lookup (mod, sym); - if (prev != SCM_BOOL_F) + if (scm_is_true (prev)) val = nested_property_alist (scm_variable_ref (prev), path, val); + else + val = nested_create_alist (path, val); } scm_module_define (mod, sym, val); } @@ -308,7 +303,7 @@ Lily_lexer::LexerError (char const *s) { error_level_ |= 1; Input spot (*lexloc_); - spot.error (s); + spot.non_fatal_error (s); } } @@ -347,6 +342,13 @@ Lily_lexer::here_input () const return Input (*lexloc_); } +Input const & +Lily_lexer::override_input (Input const &in) const +{ + return override_input_.get_source_file () + ? override_input_ : in; +} + void Lily_lexer::prepare_for_next_token () { @@ -366,35 +368,28 @@ Lily_lexer::add_lexed_char (int count) char_count_stack_.back () += count; } -#include "ly-smobs.icc" -IMPLEMENT_SMOBS (Lily_lexer); -IMPLEMENT_TYPE_P (Lily_lexer, "ly:lily-lexer?"); -IMPLEMENT_DEFAULT_EQUAL_P (Lily_lexer); +const char * const Lily_lexer::type_p_name_ = "ly:lily-lexer?"; SCM -Lily_lexer::mark_smob (SCM s) +Lily_lexer::mark_smob () const { - 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_); - scm_gc_mark (lexer->extra_tokens_); - return lexer->scopes_; + ASSERT_LIVE_IS_ALLOWED (self_scm ()); + + scm_gc_mark (chordmodifier_tab_); + if (parser_) + scm_gc_mark (parser_->self_scm ()); + scm_gc_mark (pitchname_tab_stack_); + scm_gc_mark (start_module_); + scm_gc_mark (extra_tokens_); + return scopes_; } int -Lily_lexer::print_smob (SCM s, SCM port, scm_print_state *) +Lily_lexer::print_smob (SCM port, scm_print_state *) const { - Lily_lexer *lexer = Lily_lexer::unsmob (s); - scm_puts ("#scopes_, port); + scm_display (scopes_, port); scm_puts (" >", port); return 1; }