using namespace std;
#include "book.hh"
+#include "context.hh"
#include "context-def.hh"
#include "context-mod.hh"
#include "dimensions.hh"
%token EVENT_IDENTIFIER
%token EVENT_FUNCTION
%token FRACTION
+%token LOOKUP_IDENTIFIER
%token LYRIC_ELEMENT
%token MARKUP_FUNCTION
%token MARKUP_LIST_FUNCTION
}
;
+lookup:
+ LOOKUP_IDENTIFIER
+ | LOOKUP_IDENTIFIER '.' symbol_list_rev
+ {
+ $$ = loc_on_music (parser, @$,
+ nested_property ($1, scm_reverse_x ($3, SCM_EOL)));
+ }
+ ;
+
embedded_scm_bare:
SCM_TOKEN
{
embedded_scm_active:
SCM_IDENTIFIER
| scm_function_call
+ | lookup
;
embedded_scm_bare_arg:
| book_block
| bookpart_block
| output_def
+ | lookup
;
/* The generic version may end in music, or not */
embedded_scm:
embedded_scm_bare
| scm_function_call
+ | lookup
;
/* embedded_scm_arg is _not_ casting pitches to music by default, this
parser->lexer_->set_identifier ($1, $3);
$$ = SCM_UNSPECIFIED;
}
- | assignment_id property_path '=' identifier_init {
- SCM path = scm_cons (scm_string_to_symbol ($1), $2);
- parser->lexer_->set_identifier (path, $4);
+ | assignment_id '.' property_path '=' identifier_init {
+ SCM path = scm_cons (scm_string_to_symbol ($1), $3);
+ parser->lexer_->set_identifier (path, $5);
$$ = SCM_UNSPECIFIED;
}
- | assignment_id '.' property_path '=' identifier_init {
+ | assignment_id ',' property_path '=' identifier_init {
SCM path = scm_cons (scm_string_to_symbol ($1), $3);
parser->lexer_->set_identifier (path, $5);
$$ = SCM_UNSPECIFIED;
{
$$ = scm_append (scm_list_2 ($1, scm_reverse_x ($3, SCM_EOL)));
}
+ | SYMBOL_LIST ',' symbol_list_rev
+ {
+ $$ = scm_append (scm_list_2 ($1, scm_reverse_x ($3, SCM_EOL)));
+ }
;
symbol_list_rev:
{
$$ = scm_append_x (scm_list_2 ($3, $1));
}
+ | symbol_list_rev ',' symbol_list_part
+ {
+ $$ = scm_append_x (scm_list_2 ($3, $1));
+ }
;
// symbol_list_part delivers elements in reverse copy.
symbol_list_part:
symbol_list_element
{
- $$ = try_string_variants (Lily::symbol_list_p, $1);
+ $$ = try_string_variants (Lily::key_list_p, $1);
if (SCM_UNBNDP ($$)) {
- parser->parser_error (@1, _("not a symbol"));
+ parser->parser_error (@1, _("not a key"));
$$ = SCM_EOL;
} else
$$ = scm_reverse ($$);
symbol_list_element:
STRING
| embedded_scm_bare
+ | UNSIGNED
;
if (scm_is_true (scm_call_1 ($2, $4)))
// May be 3 \cm or similar
MYREPARSE (@4, $2, REAL, $4);
+ else if (scm_is_true (scm_call_1 ($2, scm_list_1 ($4))))
+ MYREPARSE (@4, $2, SYMBOL_LIST, scm_list_1 ($4));
else {
SCM d = make_duration ($4);
if (!SCM_UNBNDP (d)) {
if (scm_is_true (scm_call_1 ($2, $4)))
// May be 3 \cm or similar
MYREPARSE (@4, $2, REAL, $4);
+ else if (scm_is_true (scm_call_1 ($2, scm_list_1 ($4))))
+ MYREPARSE (@4, $2, SYMBOL_LIST, scm_list_1 ($4));
else {
SCM d = make_duration ($4);
if (!SCM_UNBNDP (d)) {
if (scm_is_true (scm_call_1 ($1, $3)))
// May be 3 \cm or similar
MYREPARSE (@3, $1, REAL, $3);
+ else if (scm_is_true (scm_call_1 ($1, scm_list_1 ($3))))
+ MYREPARSE (@3, $1, SYMBOL_LIST, scm_list_1 ($3));
else {
SCM d = make_duration ($3);
if (!SCM_UNBNDP (d)) {
symbol_list_rev {
$$ = scm_reverse_x ($1, SCM_EOL);
}
- | symbol_list_rev property_path {
- $$ = scm_reverse_x ($1, $2);
- }
;
property_operation:
| UNSET symbol {
$$ = scm_list_2 (ly_symbol2scm ("unset"), $2);
}
- | OVERRIDE property_path '=' scalar {
+ | OVERRIDE revert_arg '=' scalar {
if (scm_ilength ($2) < 2) {
parser->parser_error (@2, _("bad grob property path"));
$$ = SCM_UNDEFINED;
{
$$ = scm_append_x (scm_list_2 ($5, $3));
}
+ | revert_arg_backup BACKUP SCM_ARG ',' symbol_list_part
+ {
+ $$ = scm_append_x (scm_list_2 ($5, $3));
+ }
| revert_arg_backup BACKUP SCM_ARG symbol_list_part
{
$$ = scm_append_x (scm_list_2 ($4, $3));
} else if (unsmob<Score> (sid)) {
*destination = unsmob<Score> (sid)->clone ()->unprotect ();
return SCM_IDENTIFIER;
+ } else if (scm_is_pair (sid)
+ && scm_is_pair (scm_car (sid))
+ && scm_is_true (Lily::key_p (scm_caar (sid)))) {
+ *destination = sid;
+ return LOOKUP_IDENTIFIER;
}
-
return -1;
}
if (scm_is_true (scm_call_1 (pred, str)))
return str;
// a symbol may be interpreted as a list of symbols if it helps
- if (scm_is_symbol (str)) {
+ if (scm_is_true (Lily::key_p (str))) {
str = scm_list_1 (str);
if (scm_is_true (scm_call_1 (pred, str)))
return str;
return SCM_UNDEFINED;
str = scm_string_split (str, SCM_MAKE_CHAR ('.'));
+ for (SCM p = str; scm_is_pair (p); p = scm_cdr (p))
+ scm_set_car_x (p, scm_string_split (scm_car (p),
+ SCM_MAKE_CHAR (',')));
+ str = scm_append_x (str);
for (SCM p = str; scm_is_pair (p); p = scm_cdr (p))
scm_set_car_x (p, scm_string_to_symbol (scm_car (p)));
|| (c >= 'A' && c <= 'Z')
|| c > 0x7f)
middle = true;
- else if (middle && (c == '-' || c == '_' || (multiple && c == '.')))
+ else if (middle && (c == '-' || c == '_' || (multiple &&
+ (c == '.' || c == ','))))
middle = false;
else
return false;