X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flexer.ll;h=c658e7bf8acfe3de6b2fe13fa4292239840dfe8b;hb=6f5b694886301a2facf7293d9f70cf41232103a6;hp=39c9ce81d7376db1af56c9f7792f6e3d4ae9bcc6;hpb=d74aff465ddeb01e9f21886e733e797cfc52f787;p=lilypond.git diff --git a/lily/lexer.ll b/lily/lexer.ll index 39c9ce81d7..c658e7bf8a 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -1,10 +1,10 @@ %{ // -*-Fundamental-*- /* - lexer.l -- implement the Flex lexer + lexer.ll -- implement the Flex lexer source file of the LilyPond music typesetter - (c) 1996--2002 Han-Wen Nienhuys + (c) 1996--2003 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -26,8 +26,14 @@ #include #include +/* Flex >= 2.5.29 fix; FlexLexer.h's multiple include bracing breaks + when building the actual lexer. */ +#define LEXER_CC + #include +using namespace std; +#include "source-file.hh" #include "parse-scm.hh" #include "lily-guile.hh" #include "string.hh" @@ -92,6 +98,7 @@ SCM (* scm_parse_error_handler) (void *); %option never-interactive %option warn +%x renameinput %x version %x chords %x incl @@ -124,7 +131,8 @@ HORIZONTALWHITE [ \t] BLACK [^ \n\t\f\r] RESTNAME [rs] NOTECOMMAND \\{A}+ -LYRICS ({AA}|{TEX})[^0-9 \t\n\f]* +MARKUPCOMMAND \\({A}|[-_])+ +LYRICS ({AA}|{TEX})[^0-9 \t\n\r\f]* ESCAPED [nt\\'"] EXTENDER __ HYPHEN -- @@ -135,17 +143,17 @@ HYPHEN -- // windows-suck-suck-suck } -{ +{ "%{" { yy_push_state (longcomment); } - %[^{\n].*\n { + %[^{\n\r].*[\n\r] { } - %[^{\n] { // backup rule + %[^{\n\r] { // backup rule } - %\n { + %[\n\r] { } - %[^{\n].* { + %[^{\n\r].* { } {WHITE}+ { @@ -155,18 +163,37 @@ HYPHEN -- \\version{WHITE}* { yy_push_state (version); } +\\renameinput{WHITE}* { + yy_push_state (renameinput); +} \"[^"]*\" { /* got the version number */ String s (YYText ()+1); s = s.left_string (s.index_last ('\"')); - yy_pop_state (); - if (!valid_version_b (s)) + yy_pop_state(); + if (!valid_version_b (s)) return INVALID; } +\"[^"]*\" { /* got the version number */ + String s (YYText ()+1); + s = s.left_string (s.index_last ('\"')); + + yy_pop_state(); + this->here_input().source_file_->name_ = s; + scm_module_define (gh_car (scopes_), + ly_symbol2scm ("input-file-name"), + scm_makfrom0str (s.to_str0())); + +} + . { LexerError ("No quoted string found after \\version"); yy_pop_state (); } +. { + LexerError ("No quoted string found after \\renameinput"); + yy_pop_state (); +} { [^\%]* { } @@ -285,12 +312,12 @@ HYPHEN -- yylval.scm = sval; return SCM_T; } -{ +{ \<\< { - return CHORD_OPEN; + return LESSLESS; } \>\> { - return CHORD_CLOSE; + return MOREMORE; } } { @@ -441,11 +468,17 @@ HYPHEN -- \" { start_quote (); } - {NOTECOMMAND} { + \< { + return '<'; + } + \> { + return '>'; + } + {MARKUPCOMMAND} { String str (YYText() + 1); SCM s = lookup_markup_command (str); - if (gh_pair_p (s)) { + if (gh_pair_p (s) && gh_symbol_p (gh_cdr (s)) ) { yylval.scm = gh_car(s); SCM tag = gh_cdr(s); if (tag == ly_symbol2scm("markup0")) @@ -454,44 +487,41 @@ HYPHEN -- return MARKUP_HEAD_MARKUP0_MARKUP1; else if (tag == ly_symbol2scm ("markup-list0")) return MARKUP_HEAD_LIST0; - else if (tag == ly_symbol2scm ("scm0")) + else if (tag == ly_symbol2scm ("scheme0")) return MARKUP_HEAD_SCM0; - else if (tag == ly_symbol2scm ("scm0-scm1")) + else if (tag == ly_symbol2scm ("scheme0-scheme1")) return MARKUP_HEAD_SCM0_SCM1; - else if (tag == ly_symbol2scm ("scm0-markup1")) + else if (tag == ly_symbol2scm ("scheme0-markup1")) return MARKUP_HEAD_SCM0_MARKUP1; - else if (tag == ly_symbol2scm ("scm0-scm1-markup2")) + else if (tag == ly_symbol2scm ("scheme0-scheme1-markup2")) return MARKUP_HEAD_SCM0_SCM1_MARKUP2; + else if (tag == ly_symbol2scm ("scheme0-scheme1-scheme2")) + return MARKUP_HEAD_SCM0_SCM1_SCM2; else { + programming_error ("No parser tag defined for this signature. Abort"); ly_display_scm (s); assert(false); } } else return scan_escaped_word (str); } - {WORD} { - /* ugr. This sux. */ + [{}] { + return YYText()[0]; + } + [^#{}"\\ \t\n\r\f]+ { String s (YYText ()); - if (s == "__") - return yylval.i = EXTENDER; - if (s == "--") - return yylval.i = HYPHEN; - s = lyric_fudge (s); char c = s[s.length () - 1]; if (c == '{' || c == '}') // brace open is for not confusing dumb tools. here_input ().warning ( - _ ("Brace found at end of lyric. Did you forget a space?")); + _ ("Brace found at end of markup. Did you forget a space?")); yylval.scm = scm_makfrom0str (s.to_str0 ()); return STRING; } - {WHITE} { - - } - . { - return YYText ()[0]; + . { + return YYText()[0]; } } @@ -665,7 +695,7 @@ My_lily_lexer::scan_bare_word (String str) } else if ((pitch = scm_hashq_get_handle (chordmodifier_tab_, sym))!= SCM_BOOL_F) { yylval.scm = ly_cdr (pitch); - return CHORDMODIFIER_PITCH; + return CHORD_MODIFIER; } } @@ -725,8 +755,8 @@ strip_trailing_white (String&s) -/* 1.3.146 == removal of ; */ -Lilypond_version oldest_version ("1.3.146"); +/* 1.9.0 == postfix articulations */ +Lilypond_version oldest_version ("1.9.0"); bool @@ -736,7 +766,7 @@ valid_version_b (String s) Lilypond_version ver (s); if (! ((ver >= oldest_version) && (ver <= current))) { - non_fatal_error (_f ("Incorrect lilypond version: %s (%s, %s)", ver.string (), oldest_version.string (), current.string ())); + non_fatal_error (_f ("Incorrect lilypond version: %s (%s, %s)", ver.to_string (), oldest_version.to_string (), current.to_string ())); non_fatal_error (_ ("Consider updating the input with the convert-ly script")); return false; } @@ -744,6 +774,9 @@ valid_version_b (String s) } +/* + substittute _ adn \, +*/ String lyric_fudge (String s) { @@ -784,6 +817,8 @@ scan_fraction (String frac) return gh_cons (gh_int2scm (n), gh_int2scm (d)); } +// Breaks for flex 2.5.31 +#if 0 /* avoid silly flex induced gcc warnings */ static void yy_push_state (int) {;} static void yy_pop_state () {;} @@ -800,6 +835,7 @@ avoid_silly_flex_induced_gcc_warnings () yy_top_state (); avoid_silly_flex_induced_gcc_warnings (); } +#endif SCM lookup_markup_command (String s)