%token STRING
%token SYMBOL_LIST
%token TONICNAME_PITCH
-%token WORD
+%token SYMBOL
%left '-' '+'
*/
assignment_id:
STRING
- | WORD
+ {
+ $$ = scm_string_to_symbol ($1);
+ }
+ | SYMBOL
+ {
+ $$ = scm_string_to_symbol ($1);
+ }
;
assignment:
$$ = SCM_UNSPECIFIED;
}
| assignment_id '.' property_path '=' identifier_init {
- SCM path = scm_cons (scm_string_to_symbol ($1), $3);
+ SCM path = scm_cons ($1, $3);
parser->lexer_->set_identifier (path, $5);
$$ = SCM_UNSPECIFIED;
}
| assignment_id ',' property_path '=' identifier_init {
- SCM path = scm_cons (scm_string_to_symbol ($1), $3);
+ SCM path = scm_cons ($1, $3);
parser->lexer_->set_identifier (path, $5);
$$ = SCM_UNSPECIFIED;
}
+ | markup_mode_word '=' identifier_init
+ {
+ if (scm_is_false (Lily::markup_function_p ($3)))
+ {
+ parser->parser_error (@3, _ ("Not a markup function"));
+ } else {
+ scm_primitive_eval
+ (scm_list_3
+ (Lily::define_markup_command,
+ scm_string_to_symbol ($1),
+ ly_quote_scm ($3)));
+ }
+ $$ = SCM_UNSPECIFIED;
+ }
;
symbol_list_part_bare:
- WORD
+ SYMBOL
{
$$ = try_word_variants (Lily::key_list_p, $1);
if (SCM_UNBNDP ($$)) {
else
MYREPARSE (@4, $2, SCM_ARG, $4);
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup WORD
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup SYMBOL
{
$$ = $3;
SCM res = try_word_variants ($2, $4);
MYBACKUP (STRING, $4, @4);
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup WORD
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup SYMBOL
{
SCM res = try_word_variants ($2, $4);
if (!SCM_UNBNDP (res))
// know the predicate to be false.
MYREPARSE (@3, $1, SCM_ARG, $3);
}
- | EXPECT_SCM function_arglist_optional WORD
+ | EXPECT_SCM function_arglist_optional SYMBOL
{
$$ = $2;
SCM res = try_word_variants ($1, $3);
| context_def_mod STRING {
$$ = scm_list_2 ($1, $2);
}
- | context_def_mod WORD {
+ | context_def_mod SYMBOL {
$$ = scm_list_2 ($1, $2);
}
| context_def_mod embedded_scm
string:
STRING
- | WORD
+ | SYMBOL
| full_markup
;
text:
STRING
- | WORD
+ | SYMBOL
| full_markup
| embedded_scm_bare
{
;
simple_string: STRING
- | WORD
+ | SYMBOL
| embedded_scm_bare
{
if (scm_is_string ($1)) {
STRING {
$$ = scm_string_to_symbol ($1);
}
- | WORD
+ | SYMBOL
{
if (!is_regular_identifier ($1, false))
parser->parser_error (@1, (_ ("symbol expected")));
make_simple_markup ($1));
$$ = t->unprotect ();
}
- | WORD {
+ | SYMBOL {
// Flag a warning? could be unintentional
Music *t = MY_MAKE_MUSIC ("TextScriptEvent", @$);
t->set_property ("text",
bass_number:
UNSIGNED
| STRING
- | WORD
+ | SYMBOL
| full_markup
| embedded_scm_bare
{
parser->parser_error (@1, _ ("markup outside of text script or \\lyricmode"));
$$ = $1;
}
- | WORD {
+ | SYMBOL {
if (!parser->lexer_->is_lyric_state ())
parser->parser_error (@1, _f ("not a note name: %s", ly_scm2string ($1)));
$$ = $1;
}
;
+// Sort-of ugly: We need this as markup of its own as well as in
+// markup function assignments, without triggering lookahead or the
+// '=' for assignments will be parsed in markup mode and not
+// recognized. Worse: the next token following something like
+// \markup "string" would be parsed in markup mode as well.
+//
+// So we make a single production here that's used either in markup or
+// in assignment.
+
+markup_mode_word:
+ markup_mode markup_word
+ {
+ $$ = $2;
+ parser->lexer_->pop_state ();
+ }
+ ;
+
+
full_markup:
markup_mode markup_top {
$$ = $2;
parser->lexer_->pop_state ();
}
+ | markup_mode_word
+ {
+ $$ = make_simple_markup ($1);
+ }
;
partial_markup:
$$ = scm_car (MAKE_SYNTAX (composed_markup_list,
@2, $1, scm_list_1 ($2)));
}
- | simple_markup {
+ | simple_markup_noword {
$$ = $1;
}
;
}
;
+markup_word:
+ STRING
+ | SYMBOL
+ ;
+
simple_markup:
- STRING {
- $$ = make_simple_markup ($1);
- }
- | WORD {
+ markup_word
+ {
$$ = make_simple_markup ($1);
}
- | SCORE {
+ | simple_markup_noword
+ ;
+
+simple_markup_noword:
+ SCORE {
parser->lexer_->push_note_state (Lily::pitchnames);
} '{' score_body '}' {
Score *sc = unsmob<Score> ($4);