X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flily-lexer.cc;h=178853fc15b5cf5a9242710437c6e110ebed1184;hb=66cf32a015a733a69d7faf46ad84dd1049a9fb38;hp=4a877f2d2e3e4bb6183b1773423202c3f81181cc;hpb=474c8729dc274a30558102a015a01fa5882673db;p=lilypond.git diff --git a/lily/lily-lexer.cc b/lily/lily-lexer.cc index 4a877f2d2e..178853fc15 100644 --- a/lily/lily-lexer.cc +++ b/lily/lily-lexer.cc @@ -1,9 +1,20 @@ /* - lily-lexer.cc -- implement Lily_lexer + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1997--2010 Han-Wen Nienhuys - (c) 1997--2007 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "lily-lexer.hh" @@ -12,6 +23,7 @@ #include using namespace std; +#include "context.hh" // for nested_property_alist #include "international.hh" #include "interval.hh" #include "keyword.hh" @@ -31,6 +43,7 @@ static Keyword_ent the_key_tab[] {"alias", ALIAS}, {"alternative", ALTERNATIVE}, {"book", BOOK}, + {"bookpart", BOOKPART}, {"change", CHANGE}, {"chordmode", CHORDMODE}, {"chords", CHORDS}, @@ -53,6 +66,7 @@ static Keyword_ent the_key_tab[] {"lyricsto", LYRICSTO}, {"mark", MARK}, {"markup", MARKUP}, + {"markuplines", MARKUPLINES}, {"midi", MIDI}, {"name", NAME}, {"new", NEWCONTEXT}, @@ -93,6 +107,7 @@ Lily_lexer::Lily_lexer (Sources *sources, Lily_parser *parser) error_level_ = 0; is_main_input_ = false; start_module_ = SCM_EOL; + chord_repetition_ = Chord_repetition (); smobify_self (); add_scope (ly_make_anonymous_module (false)); @@ -109,6 +124,7 @@ Lily_lexer::Lily_lexer (Lily_lexer const &src, Lily_parser *parser) pitchname_tab_stack_ = src.pitchname_tab_stack_; sources_ = src.sources_; start_module_ = SCM_EOL; + chord_repetition_ = src.chord_repetition_; error_level_ = src.error_level_; is_main_input_ = src.is_main_input_; @@ -197,7 +213,7 @@ Lily_lexer::keyword_list () const scm_from_int (keytable_->table_[i].tokcode_), SCM_EOL); - tail = SCM_CDRLOC(*tail); + tail = SCM_CDRLOC (*tail); } return l; @@ -254,12 +270,20 @@ Lily_lexer::new_input (string str, Sources *ss) Includable_lexer::new_input (str, ss); } +// PATH is either a single symbol (or string) or a list of symbols +// giving the path to a nested property. A symbol is treated the same +// as a list of length 1. void -Lily_lexer::set_identifier (SCM name, SCM s) +Lily_lexer::set_identifier (SCM path, SCM val) { - SCM sym = name; - if (scm_is_string (name)) - sym = scm_string_to_symbol (name); + SCM sym = path; + if (scm_is_string (path)) + sym = scm_string_to_symbol (path); + else if (scm_is_pair (path)) + { + sym = scm_car (path); + path = scm_cdr (path); + } if (scm_is_symbol (sym)) { @@ -271,7 +295,13 @@ Lily_lexer::set_identifier (SCM name, SCM s) SCM mod = scm_car (scopes_); - scm_module_define (mod, sym, s); + if (scm_is_pair (path)) + { + SCM prev = scm_module_lookup (mod, sym); + if (prev != SCM_UNDEFINED) + val = nested_property_alist (prev, path, val); + } + scm_module_define (mod, sym, val); } else programming_error ("identifier is not a symbol"); @@ -341,7 +371,7 @@ 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);