/* Artificial tokens, for more generic function syntax */
%token EXPECT_MARKUP "markup?"
-%token EXPECT_DURATION "ly:duration?"
%token EXPECT_SCM "scheme?"
%token BACKUP "(backed-up?)"
%token REPARSE "(reparsed?)"
function_arglist_skip:
function_arglist_common
- | EXPECT_OPTIONAL EXPECT_DURATION function_arglist_skip
- {
- $$ = scm_cons ($1, $3);
- } %prec FUNCTION_ARGLIST
| EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip
{
$$ = scm_cons ($1, $3);
function_arglist_nonbackup:
function_arglist_nonbackup_common
- | EXPECT_OPTIONAL EXPECT_DURATION function_arglist_closed duration_length
- {
- $$ = scm_cons ($4, $3);
- }
| EXPECT_OPTIONAL EXPECT_SCM function_arglist embedded_scm_arg
{
if (scm_is_true (scm_call_1 ($2, $4)))
(parser, @4, $4),
$3, $2);
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed bare_number
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed bare_number_common
{
$$ = check_scheme_arg (parser, @4, $4, $3, $2);
}
+ | function_arglist_nonbackup_reparse REPARSE duration_length
+ {
+ $$ = check_scheme_arg (parser, @3, $3, $1, $2);
+ }
+ | function_arglist_nonbackup_reparse REPARSE bare_number_common
+ {
+ $$ = check_scheme_arg (parser, @3, $3, $1, $2);
+ }
| function_arglist_nonbackup_reparse REPARSE SCM_ARG
{
$$ = check_scheme_arg (parser, @3, $3, $1, $2);
else
MYREPARSE (@4, $2, SCM_ARG, $4);
}
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed UNSIGNED
+ {
+ $$ = $3;
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ MYREPARSE (@4, $2, REAL, $4);
+ else {
+ SCM d = make_duration ($4);
+ if (SCM_UNBNDP (d) || scm_is_false (scm_call_1 ($2, d)))
+ MYREPARSE (@4, $2, REAL, $4); // trigger error
+ else
+ MYREPARSE (@4, $2, DURATION_IDENTIFIER, d);
+ }
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed DURATION_IDENTIFIER {
+ $$ = $3;
+ MYREPARSE (@4, $2, DURATION_IDENTIFIER, $4);
+ }
;
function_arglist_keep:
{
if (scm_is_true (scm_call_1 ($2, $4)))
{
+ MYREPARSE (@4, $2, REAL, $4);
$$ = $3;
- MYREPARSE (@4, $2, UNSIGNED, $4);
} else {
- $$ = scm_cons (loc_on_music (@3, $1), $3);
- MYBACKUP (UNSIGNED, $4, @4);
+ SCM d = make_duration ($4);
+ if (SCM_UNBNDP (d) || scm_is_false (scm_call_1 ($2, d)))
+ {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (UNSIGNED, $4, @4);
+ } else {
+ MYREPARSE (@4, $2, DURATION_IDENTIFIER, d);
+ $$ = $3;
+ }
}
}
| EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_keep REAL
MYBACKUP (TONICNAME_PITCH, $4, @4);
}
}
- | EXPECT_OPTIONAL EXPECT_DURATION function_arglist_closed_keep duration_length
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_keep DURATION_IDENTIFIER
{
- $$ = scm_cons ($4, $3);
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ {
+ MYREPARSE (@4, $2, DURATION_IDENTIFIER, $4);
+ $$ = $3;
+ } else {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (DURATION_IDENTIFIER, $4, @4);
+ }
}
| EXPECT_OPTIONAL EXPECT_SCM function_arglist_keep SCM_IDENTIFIER
{
$$ = scm_cons ($1, $3);
MYBACKUP(0, SCM_UNDEFINED, @3);
}
- | function_arglist_backup REPARSE bare_number
+ | function_arglist_backup REPARSE bare_number_common
+ {
+ $$ = check_scheme_arg (parser, @3,
+ $3, $1, $2);
+ }
+ | function_arglist_backup REPARSE duration_length
{
$$ = check_scheme_arg (parser, @3,
$3, $1, $2);
(parser, @3, $3),
$2, $1);
}
- | EXPECT_SCM function_arglist_closed_optional bare_number
+ | EXPECT_SCM function_arglist_closed_optional bare_number_common
{
$$ = check_scheme_arg (parser, @3,
$3, $2, $1);
$$ = check_scheme_arg (parser, @3,
$3, $1, $2);
}
- | function_arglist_common_reparse REPARSE bare_number
+ | function_arglist_common_reparse REPARSE bare_number_common
+ {
+ $$ = check_scheme_arg (parser, @3,
+ $3, $1, $2);
+ }
+ | function_arglist_common_reparse REPARSE duration_length
{
$$ = check_scheme_arg (parser, @3,
$3, $1, $2);
// know the predicate to be false.
MYREPARSE (@3, $1, SCM_ARG, $3);
}
+ | EXPECT_SCM function_arglist_closed_optional UNSIGNED
+ {
+ $$ = $2;
+ if (scm_is_true (scm_call_1 ($1, $3)))
+ MYREPARSE (@3, $1, REAL, $3);
+ else {
+ SCM d = make_duration ($3);
+ if (SCM_UNBNDP (d) || scm_is_false (scm_call_1 ($1, d)))
+ MYREPARSE (@3, $1, REAL, $3);
+ else
+ MYREPARSE (@3, $1, DURATION_IDENTIFIER, d);
+ }
+ }
+ | EXPECT_SCM function_arglist_closed_optional DURATION_IDENTIFIER
+ {
+ $$ = $2;
+ MYREPARSE (@3, $1, DURATION_IDENTIFIER, $3);
+ }
| EXPECT_SCM function_arglist_closed_optional '-' UNSIGNED
{
$$ = $2;
$$ = check_scheme_arg (parser, @3,
$3, $2, $1);
}
- | EXPECT_SCM function_arglist_closed_optional bare_number
+ | EXPECT_SCM function_arglist_closed_optional bare_number_common_closed
{
$$ = check_scheme_arg (parser, @3,
$3, $2, $1);
$$ = check_scheme_arg (parser, @3,
$3, $1, $2);
}
- | function_arglist_common_reparse REPARSE bare_number
+ | function_arglist_common_reparse REPARSE bare_number_common_closed
{
$$ = check_scheme_arg (parser, @3,
$3, $1, $2);
function_arglist_optional:
function_arglist_keep %prec FUNCTION_ARGLIST
| function_arglist_backup BACKUP
- | EXPECT_OPTIONAL EXPECT_DURATION function_arglist_optional
- {
- $$ = scm_cons ($1, $3);
- }
;
function_arglist_closed_optional:
function_arglist_closed_keep %prec FUNCTION_ARGLIST
| function_arglist_backup BACKUP
- | EXPECT_OPTIONAL EXPECT_DURATION function_arglist_closed_optional
- {
- $$ = scm_cons ($1, $3);
- }
;
embedded_scm_closed:
EXPECT_NO_MORE_ARGS {
$$ = SCM_EOL;
}
- | EXPECT_DURATION function_arglist_closed_optional duration_length {
- $$ = scm_cons ($3, $2);
- }
- | EXPECT_OPTIONAL EXPECT_DURATION function_arglist_skip DEFAULT {
- $$ = scm_cons ($1, $3);
- }
| EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip DEFAULT {
$$ = scm_cons ($1, $3);
}
| bare_number
;
+bare_number_common:
+ bare_number_common_closed
+ | REAL NUMBER_IDENTIFIER
+ {
+ $$ = scm_product ($1, $2);
+ }
+ ;
+
+bare_number_common_closed:
+ REAL
+ | NUMBER_IDENTIFIER
+ ;
bare_number:
- bare_number_closed
+ bare_number_common
+ | UNSIGNED
| UNSIGNED NUMBER_IDENTIFIER {
$$ = scm_product ($1, $2);
}
- | REAL NUMBER_IDENTIFIER {
- $$ = scm_product ($1, $2);
- }
;
bare_number_closed:
UNSIGNED
- | REAL
- | NUMBER_IDENTIFIER
+ | bare_number_common_closed
;
unsigned_number: