diff options
author | mitchell <unknown> | 2018-06-12 11:17:33 -0400 |
---|---|---|
committer | mitchell <unknown> | 2018-06-12 11:17:33 -0400 |
commit | bfefbd01a24ccff2f5f0d9ef0bb168dee3a8333a (patch) | |
tree | c2983d2b639e63f46f0a10e85de47632fe64d556 | |
parent | 2b8b27ed8221c50f70e0a35e018aa530856126a5 (diff) | |
download | scintilla-mirror-bfefbd01a24ccff2f5f0d9ef0bb168dee3a8333a.tar.gz |
Fixed child lexers that embed themselves into parents and fixed proxy lexers.
Since the _NAME field of the parent lexer was changed, embedded child references
to it are no longer valid. Keep a copy of the parent name for reference.
-rw-r--r-- | lexlua/lexer.lua | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/lexlua/lexer.lua b/lexlua/lexer.lua index 587479633..30bf25b1d 100644 --- a/lexlua/lexer.lua +++ b/lexlua/lexer.lua @@ -1154,22 +1154,23 @@ local grammar_mt = {__index = { -- Adds lexer *lexer* and any of its embedded lexers to this grammar. -- @param lexer The lexer to add. add_lexer = function(self, lexer) + local lexer_name = lexer._PARENTNAME or lexer._NAME local token_rule = lexer:join_tokens() for i = 1, #lexer._CHILDREN do local child = lexer._CHILDREN[i] if child._CHILDREN then self:add_lexer(child) end - local rules = child._EMBEDDEDRULES[lexer._NAME] + local rules = child._EMBEDDEDRULES[lexer_name] local rules_token_rule = self['__'..child._NAME] or rules.token_rule self[child._NAME] = (-rules.end_rule * rules_token_rule)^0 * - rules.end_rule^-1 * lpeg_V(lexer._NAME) + rules.end_rule^-1 * lpeg_V(lexer_name) local embedded_child = '_'..child._NAME self[embedded_child] = rules.start_rule * (-rules.end_rule * rules_token_rule)^0 * rules.end_rule^-1 token_rule = lpeg_V(embedded_child) + token_rule end - self['__'..lexer._NAME] = token_rule -- can contain embedded lexer rules - self[lexer._NAME] = token_rule^0 + self['__'..lexer_name] = token_rule -- can contain embedded lexer rules + self[lexer_name] = token_rule^0 end }} @@ -1566,10 +1567,11 @@ function M.load(name, alt_name, cache) lexer:add_style((alt_name or name)..'_whitespace', M.STYLE_WHITESPACE) -- If the lexer is a proxy or a child that embedded itself, set the parent to - -- be the main lexer. + -- be the main lexer. Keep a reference to the old parent name since embedded + -- child rules reference and use that name. if lexer._lexer then lexer = lexer._lexer - lexer._NAME = alt_name or name + lexer._PARENTNAME, lexer._NAME = lexer._NAME, alt_name or name end if cache then lexers[alt_name or name] = lexer end |