From e510ecfca199f22128477250d8848a9c65a7a15f Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Fri, 26 Oct 2012 14:34:43 +0200 Subject: [PATCH] Issue 2931: Allow non-LilyPond identifiers like "violin1" to be called as \"violin1" A frequent complaint is the absence of identifiers with numbers in them, like violin1. Defining such identifiers has always been possible with "violin1" = { c''4 c c c } This patch lets one actually use them by calling them as \"violin1" --- lily/lexer.ll | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/lily/lexer.ll b/lily/lexer.ll index e896de3d63..9a859e5a6a 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -91,6 +91,15 @@ bool is_valid_version (string s); yylval = SCM_EOL; \ } while (0) +/* + The inside of \"violin1" is marked by commandquote mode +*/ + +#define start_command_quote() do { \ + yy_push_state (commandquote); \ + yylval = SCM_EOL; \ + } while (0) + #define yylval (*lexval_) #define yylloc (*lexloc_) @@ -124,6 +133,7 @@ SCM (* scm_parse_error_handler) (void *); %x markup %x notes %x quote +%x commandquote %x sourcefileline %x sourcefilename %x version @@ -503,7 +513,9 @@ BOM_UTF8 \357\273\277 {WORD} { return scan_bare_word (YYText_utf8 ()); } - + \\\" { + start_command_quote (); + } {COMMAND}/[-_] | // backup rule {COMMAND} { return scan_escaped_word (YYText_utf8 () + 1); @@ -527,7 +539,7 @@ BOM_UTF8 \357\273\277 } } -{ +{ \\{ESCAPED} { char c = escaped_char (YYText ()[1]); yylval = scm_cons (scm_from_locale_stringn (&c, 1), @@ -539,14 +551,19 @@ BOM_UTF8 \357\273\277 } \" { - yy_pop_state (); - /* yylval is union. Must remember STRING before setting SCM*/ yylval = scm_string_concatenate_reverse (yylval, SCM_UNDEFINED, SCM_UNDEFINED); + if (get_state () == commandquote) { + yy_pop_state (); + return scan_escaped_word (ly_scm2string (yylval)); + } + + yy_pop_state (); + return STRING; } \\ { @@ -572,6 +589,9 @@ BOM_UTF8 \357\273\277 yylval = scm_c_read_string (YYText ()); return UNSIGNED; } + \\\" { + start_command_quote (); + } {COMMAND}/[-_] | // backup rule {COMMAND} { return scan_escaped_word (YYText_utf8 () + 1); @@ -609,6 +629,9 @@ BOM_UTF8 \357\273\277 {WORD} { return scan_bare_word (YYText_utf8 ()); } + \\\" { + start_command_quote (); + } {COMMAND}/[-_] | // backup rule {COMMAND} { return scan_escaped_word (YYText_utf8 () + 1); @@ -650,6 +673,9 @@ BOM_UTF8 \357\273\277 yylval = SCM_UNSPECIFIED; return SCORE; } + \\\" { + start_command_quote (); + } {COMMAND}/[-_] | // backup rule {COMMAND} { string str (YYText_utf8 () + 1); @@ -718,7 +744,7 @@ BOM_UTF8 \357\273\277 yy_pop_state (); } -<> { +<> { LexerError (_ ("EOF found inside string").c_str ()); yy_pop_state (); } @@ -763,6 +789,9 @@ BOM_UTF8 \357\273\277 {WORD} { return scan_bare_word (YYText_utf8 ()); } + \\\" { + start_command_quote (); + } {COMMAND}/[-_] | // backup rule {COMMAND} { return scan_escaped_word (YYText_utf8 () + 1); -- 2.39.5