]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/parser.yy
Issue 4798/4: Parser work for key lists including numbers
[lilypond.git] / lily / parser.yy
index 29ecf1c3222f88e4d8a7b6325486d24c098fa605..54de4727b5b75d8f16776198ee3e0d94bff6fcce 100644 (file)
@@ -119,6 +119,7 @@ FIXME:
 using namespace std;
 
 #include "book.hh"
+#include "context.hh"
 #include "context-def.hh"
 #include "context-mod.hh"
 #include "dimensions.hh"
@@ -353,6 +354,7 @@ If we give names, Bison complains.
 %token EVENT_IDENTIFIER
 %token EVENT_FUNCTION
 %token FRACTION
+%token LOOKUP_IDENTIFIER
 %token LYRIC_ELEMENT
 %token MARKUP_FUNCTION
 %token MARKUP_LIST_FUNCTION
@@ -492,6 +494,15 @@ toplevel_expression:
        }
        ;
 
+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
        {
@@ -503,6 +514,7 @@ embedded_scm_bare:
 embedded_scm_active:
        SCM_IDENTIFIER
        | scm_function_call
+       | lookup
        ;
 
 embedded_scm_bare_arg:
@@ -520,6 +532,7 @@ embedded_scm_bare_arg:
        | book_block
        | bookpart_block
        | output_def
+       | lookup
        ;
 
 /* The generic version may end in music, or not */
@@ -527,6 +540,7 @@ embedded_scm_bare_arg:
 embedded_scm:
        embedded_scm_bare
        | scm_function_call
+       | lookup
        ;
 
 /* embedded_scm_arg is _not_ casting pitches to music by default, this
@@ -1701,9 +1715,9 @@ symbol_list_rev:
 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 ($$);
@@ -1714,6 +1728,7 @@ symbol_list_part:
 symbol_list_element:
        STRING
        | embedded_scm_bare
+       | UNSIGNED
        ;
 
 
@@ -4034,8 +4049,11 @@ Lily_lexer::try_special_identifiers (SCM *destination, SCM sid)
        } else if (unsmob<Score> (sid)) {
                *destination = unsmob<Score> (sid)->clone ()->unprotect ();
                return SCM_IDENTIFIER;
+       } else if (scm_is_pair (sid)
+                  && scm_is_true (Lily::key_list_p (sid))) {
+               *destination = sid;
+               return LOOKUP_IDENTIFIER;
        }
-
        return -1;
 }
 
@@ -4105,7 +4123,7 @@ try_string_variants (SCM pred, SCM str)
        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;