Since context modifications and context definitions are somewhat more
concerned with musical content, it makes sense to parse them in a mode
where note names are recognized and can be used in music and scheme
function arguments.
The main argument for a separate INITIAL lexer mode is for being able
to specify REAL number values in a lenient syntax, such as .5\cm.
However, dimensions are almost never used in context definitions
or modifications but rather in output definitions like layout, midi,
paper and header blocks.
music_or_context_def:
music_arg
- {
- parser->lexer_->pop_state ();
- }
- | CONTEXT
- {
- parser->lexer_->pop_state ();
- } '{' context_def_spec_body '}'
- {
- $$ = $4;
- unsmob_context_def ($$)->origin ()->set_spot (@$);
- }
+ | context_def_spec_block
;
output_def_body:
parser->lexer_->push_note_state (nn);
} music_or_context_def
{
+ parser->lexer_->pop_state ();
if (unsmob_context_def ($3))
assign_context_def (unsmob_output_def ($1), $3);
else {
;
context_modification:
- WITH { parser->lexer_->push_initial_state (); } '{' context_mod_list '}'
+ WITH
+ {
+ SCM nn = parser->lexer_->lookup_identifier ("pitchnames");
+ parser->lexer_->push_note_state (nn);
+ } '{' context_mod_list '}'
{
parser->lexer_->pop_state ();
$$ = $4;