diff options
-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 |