]> 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 787b324204e90d36503adcea1967c8537c8dc2f0..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);
 
@@ -66,6 +66,10 @@ bool is_valid_version (String s);
        yy_push_state (quote);\
        yylval.string = new String
 
+#define start_lyric_quote()    \
+       yy_push_state (lyric_quote);\
+       yylval.string = new String
+
 #define yylval \
        (*(YYSTYPE*)lexval)
 
@@ -88,22 +92,23 @@ 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
 
-%x encoding
-%x renameinput
-%x version
 %x chords
+%x encoding
+%x figures
 %x incl
 %x lyrics
-%x notes
-%x figures
-%x quote
+%x lyric_quote
 %x longcomment
 %x markup 
+%x notes
+%x quote
+%x renameinput
+%x version
 
 A              [a-zA-Z]
 AA             {A}|_
@@ -156,7 +161,7 @@ HYPHEN              --
   }
 }
 
-<INITIAL>\\encoding{WHITE}*    {
+<INITIAL,notes>\\encoding{WHITE}* {
        yy_push_state (encoding);
 }
 <INITIAL,chords,lyrics,notes,figures>\\version{WHITE}* {
@@ -237,6 +242,7 @@ HYPHEN              --
        yy_push_state (incl);
 }
 <incl>\"[^"]*\";?   { /* got the include file name */
+/* FIXME: semicolon? */
        String s (YYText ()+1);
        s = s.left_string (s.index_last ('"'));
 
@@ -244,13 +250,14 @@ HYPHEN            --
        yy_pop_state ();
 }
 <incl>\\{BLACK}*;?{WHITE} { /* got the include identifier */
+/* FIXME: semicolon? */
        String s = YYText () + 1;
        strip_trailing_white (s);
        if (s.length () && (s[s.length () - 1] == ';'))
          s = s.left_string (s.length () - 1);
 
        SCM sid = lookup_identifier (s);
-       if (is_string (sid)) {
+       if (ly_c_string_p (sid)) {
                new_input (ly_scm2string (sid), sources_);
                yy_pop_state ();
        } else { 
@@ -284,7 +291,7 @@ HYPHEN              --
        if (sval == SCM_UNDEFINED)
        {
                sval = SCM_UNSPECIFIED;
-               errorlevel_ = 1;
+               error_level_ = 1;
        }
 
        for (int i=0; i < n; i++)
@@ -304,10 +311,10 @@ HYPHEN            --
 }
 <INITIAL,notes,lyrics>{ 
        \<\<   {
-               return LESSLESS;
+               return DOUBLE_ANGLE_OPEN;
        }
        \>\>   {
-               return MOREMORE;
+               return DOUBLE_ANGLE_CLOSE;
        }
 }
 <figures>{
@@ -377,10 +384,31 @@ HYPHEN            --
                *yylval.string += YYText ();
        }
 }
+<lyric_quote>{
+       \\{ESCAPED}     {
+               *yylval.string += to_string (escaped_char (YYText ()[1]));
+       }
+       [^\\"]+ {
+               *yylval.string += YYText ();
+       }
+       \"      {
+
+               yy_pop_state ();
+
+               /* yylval is union. Must remember STRING before setting SCM*/
+               String *sp = yylval.string;
+               yylval.scm = scm_makfrom0str (sp->to_str0 ());
+               delete sp;
+               return LYRICS_STRING;
+       }
+       .       {
+               *yylval.string += YYText ();
+       }
+}
 
 <lyrics>{
        \" {
-               start_quote ();
+               start_lyric_quote ();
        }
        {FRACTION}      {
                yylval.scm =  scan_fraction (YYText ());
@@ -409,7 +437,7 @@ HYPHEN              --
                yylval.scm = scm_makfrom0str (s.to_str0 ());
 
 
-               return STRING;
+               return LYRICS_STRING;
        }
        . {
                return YYText ()[0];
@@ -464,11 +492,14 @@ HYPHEN            --
        \> {
                return '>';
        }
+       \\score {
+               return SCORE;
+       }
        {MARKUPCOMMAND} {
                String str (YYText () + 1);
                SCM s = lookup_markup_command (str);
 
-               if (is_pair (s) && is_symbol (ly_cdr (s)) ) {
+               if (ly_c_pair_p (s) && ly_c_symbol_p (ly_cdr (s)) ) {
                        yylval.scm = ly_car(s);
                        SCM tag = ly_cdr(s);
                        if (tag == ly_symbol2scm("markup0"))
@@ -519,10 +550,16 @@ HYPHEN            --
 }
 
 <<EOF>> {
-       main_input_b_ = false;
-       if (! close_input ()) { 
-         yyterminate (); // can't move this, since it actually rets a YY_NULL
+       if (main_input_b_)
+       {
+               main_input_b_ = false;
+               if (!close_input ())
+               /* Returns YY_NULL */
+                       yyterminate ();
        }
+       else if (!close_input ())
+               /* Returns YY_NULL */
+               yyterminate ();
 }
 
 
@@ -598,38 +635,45 @@ HYPHEN            --
 %%
 
 void
-My_lily_lexer::push_note_state (SCM tab)
+Lily_lexer::push_chord_state (SCM tab)
 {
        pitchname_tab_stack_ = scm_cons (tab, pitchname_tab_stack_);
-       yy_push_state (notes);
+       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_chord_state (SCM tab)
+Lily_lexer::push_initial_state ()
 {
-       pitchname_tab_stack_ = scm_cons (tab, pitchname_tab_stack_);
-       yy_push_state (chords);
+       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::pop_state ()
+Lily_lexer::push_note_state (SCM tab)
+{
+       pitchname_tab_stack_ = scm_cons (tab, pitchname_tab_stack_);
+       yy_push_state (notes);
+}
+
+void
+Lily_lexer::pop_state ()
 {
        if (YYSTATE == notes || YYSTATE == chords)
                pitchname_tab_stack_ = ly_cdr (pitchname_tab_stack_);
@@ -637,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;
@@ -645,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.
 
@@ -656,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;
@@ -671,19 +722,19 @@ 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)) {
                SCM handle = SCM_BOOL_F;
-               if (is_pair (pitchname_tab_stack_))
+               if (ly_c_pair_p (pitchname_tab_stack_))
                        handle = scm_hashq_get_handle (ly_car (pitchname_tab_stack_), sym);
                
-               if (is_pair (handle)) {
+               if (ly_c_pair_p (handle)) {
                        yylval.scm = ly_cdr (handle);
                        if (unsmob_pitch (yylval.scm)) 
                            return (YYSTATE == notes) ? NOTENAME_PITCH : TONICNAME_PITCH;
-                       else if (is_symbol (yylval.scm))
+                       else if (ly_c_symbol_p (yylval.scm))
                            return DRUM_PITCH;
                }
                else if ((handle = scm_hashq_get_handle (chordmodifier_tab_, sym))!= SCM_BOOL_F)
@@ -698,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;
 }
@@ -837,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;
+}