From cc9f25fa7ad9eecd1d1d9cfc2b3c50d96a847386 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Sat, 1 Apr 2017 14:54:05 +0200 Subject: [PATCH] Issue 5113/1: Reorganize Lily_lexer::scan_bare_word This also redefines LilyPond's manners of converting simple expressions into music, most notably checking drum types for being defined before accepting them as note values. --- lily/include/lily-lexer.hh | 1 + lily/lexer.ll | 19 +++++++++++++++---- lily/parser.yy | 22 +++++++++++++++++++--- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/lily/include/lily-lexer.hh b/lily/include/lily-lexer.hh index 626d24efa6..eb26403b00 100644 --- a/lily/include/lily-lexer.hh +++ b/lily/include/lily-lexer.hh @@ -38,6 +38,7 @@ public: SCM mark_smob () const; static const char * const type_p_name_; virtual ~Lily_lexer (); + int scan_word (SCM & output, SCM sym); private: int lookup_keyword (const string&); int scan_bare_word (const string&); diff --git a/lily/lexer.ll b/lily/lexer.ll index 5348231180..6bf0084c70 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -1004,16 +1004,15 @@ 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); + output = scm_cdr (handle); if (unsmob (yylval)) return (YYSTATE == notes) ? NOTENAME_PITCH : TONICNAME_PITCH; else if (scm_is_symbol (yylval)) @@ -1022,10 +1021,22 @@ 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; } diff --git a/lily/parser.yy b/lily/parser.yy index d4ab27c2bb..43037e404f 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -4262,13 +4262,29 @@ make_music_from_simple (Lily_parser *parser, Input loc, SCM simple) { if (unsmob (simple)) return simple; - if (parser->lexer_->is_note_state ()) { - if (scm_is_symbol (simple)) { + + if (scm_is_symbol (simple)) + { + SCM out = SCM_UNDEFINED; + switch (parser->lexer_->scan_word (out, simple)) + { + case DRUM_PITCH: + { Music *n = MY_MAKE_MUSIC ("NoteEvent", loc); n->set_property ("duration", parser->default_duration_.smobbed_copy ()); - n->set_property ("drum-type", simple); + n->set_property ("drum-type", out); return n->unprotect (); } + case NOTENAME_PITCH: + case TONICNAME_PITCH: + // Take the parsed pitch + simple = out; + break; + // Don't scan CHORD_MODIFIER etc. + } + } + + if (parser->lexer_->is_note_state ()) { if (unsmob (simple)) { Music *n = MY_MAKE_MUSIC ("NoteEvent", loc); n->set_property ("duration", parser->default_duration_.smobbed_copy ()); -- 2.39.2