]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lexer.ll
Issue 5145/1: Lexer: factor out push_markup_predicates
[lilypond.git] / lily / lexer.ll
index 775cbdde0f831fc359ccde97e9b87ca2f713db40..19f84616f36ca3d38179f397daddfb1291a1d9ab 100644 (file)
@@ -71,6 +71,7 @@ using namespace std;
 #include "std-string.hh"
 #include "version.hh"
 #include "warn.hh"
+#include "lily-imports.hh"
 
 /*
 RH 7 fix (?)
@@ -156,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                [-+*/=<>{}!?_^'',.:]
@@ -187,7 +188,7 @@ BOM_UTF8    \357\273\277
    /* Use the trailing context feature. Otherwise, the BOM will not be
       found if the file starts with an identifier definition. */
 <INITIAL,chords,lyrics,figures,notes>{BOM_UTF8}/.* {
-  if (this->lexloc_->line_number () != 1 || this->lexloc_->column_number () != 0)
+  if (lexloc_->line_number () != 1 || lexloc_->column_number () != 0)
     {
       LexerWarning (_ ("stray UTF-8 BOM encountered").c_str ());
       // exit (1);
@@ -243,7 +244,7 @@ BOM_UTF8    \357\273\277
        s = s.substr (0, s.rfind ('\"'));
 
        yy_pop_state ();
-       this->here_input().get_source_file ()->name_ = s;
+       here_input().get_source_file ()->name_ = s;
        message (_f ("Renaming input to: `%s'", s.c_str ()));
        progress_indication ("\n");
        scm_module_define (scm_car (scopes_),
@@ -257,7 +258,7 @@ BOM_UTF8    \357\273\277
        sscanf (YYText (), "%d", &i);
 
        yy_pop_state ();
-       this->here_input ().get_source_file ()->set_line (here_input ().start (), i);
+       here_input ().get_source_file ()->set_line (here_input ().start (), i);
 }
 
 <version>{ANY_CHAR}    {
@@ -361,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.
      */
 
@@ -475,8 +476,8 @@ BOM_UTF8    \357\273\277
 }
 
 <notes,figures>{
-       {WORD}/[-_]     | // backup rule
-       {WORD}  {
+       {SYMBOL}/[-_]   | // backup rule
+       {SYMBOL}        {
                return scan_bare_word (YYText_utf8 ());
        }
        \\\"    {
@@ -582,7 +583,7 @@ BOM_UTF8    \357\273\277
                s = lyric_fudge (s);
                yylval = ly_string2scm (s);
 
-               return STRING;
+               return SYMBOL;
        }
        /* This should really just cover {} */
        [{}] {
@@ -591,8 +592,8 @@ BOM_UTF8    \357\273\277
        }
 }
 <chords>{
-       {WORD}/[-_]     | // backup rule
-       {WORD}  {
+       {SYMBOL}/[-_]   | // backup rule
+       {SYMBOL}        {
                return scan_bare_word (YYText_utf8 ());
        }
        \\\"    {
@@ -683,25 +684,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 (predicate == ly_lily_module_constant ("markup-list?"))
-                   push_extra_token (here_input (), EXPECT_MARKUP_LIST);
-                 else if (predicate == ly_lily_module_constant ("markup?"))
-                   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;
@@ -755,8 +746,8 @@ BOM_UTF8    \357\273\277
 }
 
 <INITIAL>{
-       {WORD}/[-_]     | // backup rule
-       {WORD}  {
+       {SYMBOL}/[-_]   | // backup rule
+       {SYMBOL}        {
                return scan_bare_word (YYText_utf8 ());
        }
        \\\"    {
@@ -826,7 +817,7 @@ Lily_lexer::pop_extra_token ()
                return -1;
 
   /* produce requested token */
-       yylloc = *Input::unsmob (scm_caar (extra_tokens_));
+       yylloc = *unsmob<Input> (scm_caar (extra_tokens_));
        int type = scm_to_int (scm_cadar (extra_tokens_));
        yylval = scm_cddar (extra_tokens_);
        extra_tokens_ = scm_cdr (extra_tokens_);
@@ -891,6 +882,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)
 {
@@ -913,7 +921,7 @@ Lily_lexer::scan_escaped_word (const string &str)
                return i;
 
        SCM sid = lookup_identifier (str);
-       if (Music *m = Music::unsmob (sid))
+       if (Music *m = unsmob<Music> (sid))
        {
                m->set_spot (override_input (here_input ()));
        }
@@ -926,14 +934,14 @@ Lily_lexer::scan_escaped_word (const string &str)
 
        yylval = ly_string2scm (str);
 
-       return STRING;
+       return STRING; // SYMBOL would cause additional processing
 }
 
 int
 Lily_lexer::scan_shorthand (const string &str)
 {
        SCM sid = lookup_identifier (str);
-       if (Music *m = Music::unsmob (sid))
+       if (Music *m = unsmob<Music> (sid))
        {
                m->set_spot (override_input (here_input ()));
        }
@@ -952,7 +960,7 @@ Lily_lexer::scan_shorthand (const string &str)
 int
 Lily_lexer::scan_scm_id (SCM sid)
 {
-       if (Music_function *fun = Music_function::unsmob (sid))
+       if (Music_function *fun = unsmob<Music_function> (sid))
        {
                int funtype = SCM_FUNCTION;
 
@@ -966,9 +974,9 @@ Lily_lexer::scan_scm_id (SCM sid)
                        cs = SCM_CAR (cs);
                }
 
-               if (scm_is_eq (cs, ly_lily_module_constant ("ly:music?")))
+               if (scm_is_eq (cs, SCM (Lily::ly_music_p)))
                        funtype = MUSIC_FUNCTION;
-               else if (scm_is_eq (cs, ly_lily_module_constant ("ly:event?")))
+               else if (scm_is_eq (cs, SCM (Lily::ly_event_p)))
                        funtype = EVENT_FUNCTION;
                else if (ly_is_procedure (cs))
                        funtype = SCM_FUNCTION;
@@ -1003,17 +1011,16 @@ Lily_lexer::scan_scm_id (SCM sid)
 }
 
 int
-Lily_lexer::scan_bare_word (const string &str)
+Lily_lexer::scan_word (SCM & output, SCM sym)
 {
-       SCM sym = ly_symbol2scm (str.c_str ());
        if ((YYSTATE == notes) || (YYSTATE == chords)) {
                SCM handle = SCM_BOOL_F;
                if (scm_is_pair (pitchname_tab_stack_))
                        handle = scm_hashq_get_handle (scm_cdar (pitchname_tab_stack_), sym);
 
                if (scm_is_pair (handle)) {
-                       yylval = scm_cdr (handle);
-                       if (Pitch::is_smob (yylval))
+                       output = scm_cdr (handle);
+                       if (unsmob<Pitch> (yylval))
                            return (YYSTATE == notes) ? NOTENAME_PITCH : TONICNAME_PITCH;
                        else if (scm_is_symbol (yylval))
                            return DRUM_PITCH;
@@ -1021,12 +1028,24 @@ Lily_lexer::scan_bare_word (const string &str)
                else if ((YYSTATE == chords)
                        && scm_is_true (handle = scm_hashq_get_handle (chordmodifier_tab_, sym)))
                {
-                   yylval = scm_cdr (handle);
+                   output = scm_cdr (handle);
                    return CHORD_MODIFIER;
                }
        }
+       output = SCM_UNDEFINED;
+       return -1;
+}
+
+int
+Lily_lexer::scan_bare_word (const string &str)
+{
+       int state = scan_word (yylval, ly_symbol2scm (str.c_str ()));
+       if (state >= 0)
+       {
+               return state;
+       }
        yylval = ly_string2scm (str);
-       return STRING;
+       return SYMBOL;
 }
 
 int
@@ -1095,9 +1114,9 @@ Lily_lexer::eval_scm (SCM readerdata, Input hi, char extra_token)
                             p = scm_cdr (p))
                        {
                                SCM v = scm_car (p);
-                               if (Music *m = Music::unsmob (v))
+                               if (Music *m = unsmob<Music> (v))
                                {
-                                       if (!Input::is_smob (m->get_property ("origin")))
+                                       if (!unsmob<Input> (m->get_property ("origin")))
                                                m->set_spot (override_input (here_input ()));
                                }
 
@@ -1120,9 +1139,9 @@ Lily_lexer::eval_scm (SCM readerdata, Input hi, char extra_token)
                        sval = SCM_UNSPECIFIED;
        }
 
-       if (Music *m = Music::unsmob (sval))
+       if (Music *m = unsmob<Music> (sval))
        {
-               if (!Input::is_smob (m->get_property ("origin")))
+               if (!unsmob<Input> (m->get_property ("origin")))
                        m->set_spot (override_input (here_input ()));
        }
 
@@ -1327,15 +1346,13 @@ scan_fraction (string frac)
 SCM
 lookup_markup_command (string s)
 {
-       SCM proc = ly_lily_module_constant ("lookup-markup-command");
-       return scm_call_1 (proc, ly_string2scm (s));
+       return Lily::lookup_markup_command (ly_string2scm (s));
 }
 
 SCM
 lookup_markup_list_command (string s)
 {
-       SCM proc = ly_lily_module_constant ("lookup-markup-list-command");
-       return scm_call_1 (proc, ly_string2scm (s));
+       return Lily::lookup_markup_list_command (ly_string2scm (s));
 }
 
 /* Shut up lexer warnings.  */