]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lexer.ll
Issue 5167/6: Changes: show \markup xxx = ... \etc assignments
[lilypond.git] / lily / lexer.ll
index 6bf0084c70707c0e116929ee189a508cfc51df86..dde8fc00dc98a9050bd6fb766b0e28d175ec6cc4 100644 (file)
@@ -157,8 +157,8 @@ A           [a-zA-Z\200-\377]
 AA             {A}|_
 N              [0-9]
 ANY_CHAR       (.|\n)
-WORD           {A}([-_]{A}|{A})*
-COMMAND                \\{WORD}
+SYMBOL         {A}([-_]{A}|{A})*
+COMMAND                \\{SYMBOL}
 /* SPECIAL category is for every letter that needs to get passed to
  * the parser rather than being redefinable by the user */
 SPECIAL                [-+*/=<>{}!?_^'',.:]
@@ -362,7 +362,7 @@ BOM_UTF8    \357\273\277
 
     /* Flex picks the longest matching pattern including trailing
      * contexts.  Without the backup pattern, r-. does not trigger the
-     * {RESTNAME} rule but rather the {WORD}/[-_] rule coming later,
+     * {RESTNAME} rule but rather the {SYMBOL}/[-_] rule coming later,
      * needed for avoiding backup states.
      */
 
@@ -417,6 +417,19 @@ BOM_UTF8   \357\273\277
 
        sval = eval_scm (sval, hi, '$');
 
+       if (YYSTATE == markup && ly_is_procedure (sval))
+       {
+               SCM sig = Lily::markup_command_signature (sval);
+               if (scm_is_true (sig))
+               {
+                       yylval = sval;
+                       int token = MARKUP_FUNCTION;
+                       if (scm_is_true (Lily::markup_list_function_p (sval)))
+                               token = MARKUP_LIST_FUNCTION;
+                       push_markup_predicates (sig);
+                       return token;
+               }
+       }
        int token = scan_scm_id (sval);
        if (!scm_is_eq (yylval, SCM_UNSPECIFIED))
                return token;
@@ -476,8 +489,8 @@ BOM_UTF8    \357\273\277
 }
 
 <notes,figures>{
-       {WORD}/[-_]     | // backup rule
-       {WORD}  {
+       {SYMBOL}/[-_]   | // backup rule
+       {SYMBOL}        {
                return scan_bare_word (YYText_utf8 ());
        }
        \\\"    {
@@ -583,7 +596,7 @@ BOM_UTF8    \357\273\277
                s = lyric_fudge (s);
                yylval = ly_string2scm (s);
 
-               return STRING;
+               return SYMBOL;
        }
        /* This should really just cover {} */
        [{}] {
@@ -592,8 +605,8 @@ BOM_UTF8    \357\273\277
        }
 }
 <chords>{
-       {WORD}/[-_]     | // backup rule
-       {WORD}  {
+       {SYMBOL}/[-_]   | // backup rule
+       {SYMBOL}        {
                return scan_bare_word (YYText_utf8 ());
        }
        \\\"    {
@@ -684,25 +697,15 @@ BOM_UTF8  \357\273\277
                // value (for token type MARKUP_FUNCTION or
                // MARKUP_LIST_FUNCTION).
 
-               push_extra_token (here_input (), EXPECT_NO_MORE_ARGS);
-               s = scm_cdr(s);
-               for (; scm_is_pair(s); s = scm_cdr(s)) {
-                 SCM predicate = scm_car(s);
-
-                 if (scm_is_eq (predicate, SCM (Lily::markup_list_p)))
-                   push_extra_token (here_input (), EXPECT_MARKUP_LIST);
-                 else if (scm_is_eq (predicate, SCM (Lily::markup_p)))
-                   push_extra_token (here_input (), EXPECT_MARKUP);
-                 else
-                   push_extra_token (here_input (), EXPECT_SCM, predicate);
-               }
+               push_markup_predicates (scm_cdr (s));
+
                return token_type;
        }
        [^$#{}\"\\ \t\n\r\f]+ {
                string s (YYText_utf8 ()); 
 
                yylval = ly_string2scm (s);
-               return STRING;
+               return SYMBOL;
        }
        [{}]  {
                 yylval = SCM_UNSPECIFIED;
@@ -756,8 +759,8 @@ BOM_UTF8    \357\273\277
 }
 
 <INITIAL>{
-       {WORD}/[-_]     | // backup rule
-       {WORD}  {
+       {SYMBOL}/[-_]   | // backup rule
+       {SYMBOL}        {
                return scan_bare_word (YYText_utf8 ());
        }
        \\\"    {
@@ -892,6 +895,23 @@ Lily_lexer::pop_state ()
 
 }
 
+void
+Lily_lexer::push_markup_predicates (SCM sig)
+{
+       push_extra_token (here_input (), EXPECT_NO_MORE_ARGS);
+       for (SCM s = sig; scm_is_pair(s); s = scm_cdr(s)) {
+               SCM predicate = scm_car(s);
+
+               if (scm_is_eq (predicate, SCM (Lily::markup_list_p)))
+                       push_extra_token (here_input (), EXPECT_MARKUP_LIST);
+               else if (scm_is_eq (predicate, SCM (Lily::markup_p)))
+                       push_extra_token (here_input (), EXPECT_MARKUP);
+               else
+                       push_extra_token (here_input (), EXPECT_SCM, predicate);
+       }
+}
+
+
 int
 Lily_lexer::identifier_type (SCM sid)
 {
@@ -927,7 +947,7 @@ Lily_lexer::scan_escaped_word (const string &str)
 
        yylval = ly_string2scm (str);
 
-       return STRING;
+       return STRING; // SYMBOL would cause additional processing
 }
 
 int
@@ -1038,7 +1058,7 @@ Lily_lexer::scan_bare_word (const string &str)
                return state;
        }
        yylval = ly_string2scm (str);
-       return STRING;
+       return SYMBOL;
 }
 
 int