]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lexer.ll
* lily/include/my-lily-parser.hh: rename My_lily -> Lily
[lilypond.git] / lily / lexer.ll
index 8b25deb071c507bd01b7ea8ef9b39f21985bd5c3..b80af4b60ae87621c943993c9a138ffa52a5e986 100644 (file)
@@ -32,7 +32,7 @@
 
 #include <iostream>
 using namespace std;
-
+#include "music-function.hh"
 #include "source-file.hh"
 #include "parse-scm.hh"
 #include "lily-guile.hh"
@@ -57,7 +57,7 @@ RH 7 fix (?)
 void strip_trailing_white (String&);
 void strip_leading_white (String&);
 String lyric_fudge (String s);
-
+int music_function_type (SCM);
 SCM lookup_markup_command (String s);
 bool is_valid_version (String s);
 
@@ -92,7 +92,7 @@ SCM (* scm_parse_error_handler) (void *);
 %option noyywrap
 %option nodefault
 %option debug
-%option yyclass="My_lily_lexer"
+%option yyclass="Lily_lexer"
 %option stack
 %option never-interactive 
 %option warn
@@ -161,7 +161,7 @@ HYPHEN              --
   }
 }
 
-<INITIAL>\\encoding{WHITE}*    {
+<INITIAL,notes>\\encoding{WHITE}* {
        yy_push_state (encoding);
 }
 <INITIAL,chords,lyrics,notes,figures>\\version{WHITE}* {
@@ -233,8 +233,6 @@ HYPHEN              --
        {
                start_main_input ();
                main_input_b_ = true;
-               SCM nn = lookup_identifier ("pitchnames");
-               push_note_state (alist_to_hashq (nn));
        }
        else
                error (_ ("\\maininput not allowed outside init files"));
@@ -494,6 +492,9 @@ HYPHEN              --
        \> {
                return '>';
        }
+       \\score {
+               return SCORE;
+       }
        {MARKUPCOMMAND} {
                String str (YYText () + 1);
                SCM s = lookup_markup_command (str);
@@ -634,45 +635,45 @@ HYPHEN            --
 %%
 
 void
-My_lily_lexer::push_chord_state (SCM tab)
+Lily_lexer::push_chord_state (SCM tab)
 {
        pitchname_tab_stack_ = scm_cons (tab, pitchname_tab_stack_);
        yy_push_state (chords);
 }
 
 void
-My_lily_lexer::push_figuredbass_state ()
+Lily_lexer::push_figuredbass_state ()
 {
        yy_push_state (figures);
 }
 
 void
-My_lily_lexer::push_initial_state ()
+Lily_lexer::push_initial_state ()
 {
        yy_push_state (INITIAL);
 }
 
 void
-My_lily_lexer::push_lyric_state ()
+Lily_lexer::push_lyric_state ()
 {
        yy_push_state (lyrics);
 }
 
 void
-My_lily_lexer::push_markup_state ()
+Lily_lexer::push_markup_state ()
 {
        yy_push_state (markup);
 }
 
 void
-My_lily_lexer::push_note_state (SCM tab)
+Lily_lexer::push_note_state (SCM tab)
 {
        pitchname_tab_stack_ = scm_cons (tab, pitchname_tab_stack_);
        yy_push_state (notes);
 }
 
 void
-My_lily_lexer::pop_state ()
+Lily_lexer::pop_state ()
 {
        if (YYSTATE == notes || YYSTATE == chords)
                pitchname_tab_stack_ = ly_cdr (pitchname_tab_stack_);
@@ -680,7 +681,7 @@ My_lily_lexer::pop_state ()
 }
 
 int
-My_lily_lexer::identifier_type (SCM sid)
+Lily_lexer::identifier_type (SCM sid)
 {
        int k = try_special_identifiers (&yylval.scm , sid);
        return k >= 0  ? k : SCM_IDENTIFIER;
@@ -688,7 +689,7 @@ My_lily_lexer::identifier_type (SCM sid)
 
 
 int
-My_lily_lexer::scan_escaped_word (String str)
+Lily_lexer::scan_escaped_word (String str)
 {
        // use more SCM for this.
 
@@ -699,6 +700,13 @@ My_lily_lexer::scan_escaped_word (String str)
                return l;
        }
        SCM sid = lookup_identifier (str);
+       if (is_music_function (sid))
+       {
+               yylval.scm = get_music_function_transform (sid);
+               
+               return music_function_type (yylval.scm);
+       }
+
        if (sid != SCM_UNDEFINED)
        {
                yylval.scm = sid;
@@ -714,7 +722,7 @@ My_lily_lexer::scan_escaped_word (String str)
 }
 
 int
-My_lily_lexer::scan_bare_word (String str)
+Lily_lexer::scan_bare_word (String str)
 {
        SCM sym = ly_symbol2scm (str.to_str0 ());
        if ((YYSTATE == notes) || (YYSTATE == chords)) {
@@ -741,25 +749,25 @@ My_lily_lexer::scan_bare_word (String str)
 }
 
 bool
-My_lily_lexer::is_note_state () const
+Lily_lexer::is_note_state () const
 {
        return YY_START == notes;
 }
 
 bool
-My_lily_lexer::is_chord_state () const
+Lily_lexer::is_chord_state () const
 {
        return YY_START == chords;
 }
 
 bool
-My_lily_lexer::is_lyric_state () const
+Lily_lexer::is_lyric_state () const
 {
        return YY_START == lyrics;
 }
 
 bool
-My_lily_lexer::is_figure_state () const
+Lily_lexer::is_figure_state () const
 {
        return YY_START == figures;
 }
@@ -880,3 +888,49 @@ lookup_markup_command (String s)
        SCM proc = ly_scheme_function ("lookup-markup-command");
        return scm_call_1 (proc, scm_makfrom0str (s.to_str0 ()));
 }
+
+
+int
+music_function_type (SCM func)
+{
+       SCM type= scm_object_property (func, ly_symbol2scm ("music-function-signature-keyword"));
+       if (type == ly_symbol2scm ("scm"))
+       {
+               return MUSIC_FUNCTION_SCM;
+       }
+       else if (type == ly_symbol2scm ("music"))
+       {
+               return MUSIC_FUNCTION_MUSIC;
+       }
+       else if (type == ly_symbol2scm ("scm-music"))
+       {
+               return MUSIC_FUNCTION_SCM_MUSIC;
+       }
+       else if (type == ly_symbol2scm ("scm-scm"))
+       {
+               return MUSIC_FUNCTION_SCM_SCM;
+       }
+       else if (type == ly_symbol2scm ("music-music"))
+       {
+               return MUSIC_FUNCTION_MUSIC_MUSIC;
+       }
+       else if (type == ly_symbol2scm ("scm-music-music"))
+       {
+               return MUSIC_FUNCTION_SCM_MUSIC_MUSIC;
+       }
+       else if (type == ly_symbol2scm ("scm-scm-music"))
+       {
+               return MUSIC_FUNCTION_SCM_SCM_MUSIC;
+       }
+       else if (type == ly_symbol2scm ("noarg"))
+       {
+               return MUSIC_FUNCTION;
+       }
+       else
+               {
+               /* TODO: print location */
+               error ("Can not find signature for music function.");
+               }
+
+       return MUSIC_FUNCTION_SCM;
+}