为什么我们需要指定标准的 Lark 词法分析器才能捕获评论终端?

2024-04-14

我正在开发一个基于 Lark 的项目,我需要能够“捕获”正在解析的代码中的注释。

但是,当使用标准词法分析器而不明确指定标准词法分析器时,它不起作用。

我采取了第二个例子云雀食谱 https://lark-parser.readthedocs.io/en/stable/recipes/并将其修改为使用默认解析器并解析类似 C++ 的一行注释:

import lark

comments = []

grammar = r'''
start: INT*

COMMENT: "//" /[^\n]*/

%import common (INT, WS)
%ignore COMMENT
%ignore WS
'''

# This doesn't work, comments are not appended to the list
# parser = lark.Lark(grammar, lexer_callbacks={'COMMENT': comments.append})

# But this does work
parser = lark.Lark(grammar, lexer='standard', lexer_callbacks={'COMMENT': comments.append})

source = r'''
1 2 3  // hello
// world
4 5 6
'''

parser.parse(source)

print(comments)

如果我没有lexer='standard'结果是一个空列表。

但它不应该已经在使用'standard'当没有明确指定时词法分析器?是我代码的错误,还是Lark的bug?


进一步的实验似乎表明它要么是'dynamic' or 'dynamic_complete'在默认情况下使用(lexer未指定)。


Lark支持不同的组合parser and lexer。一些支持lexer_callbacks,有些则没有:

parser lexer lexer_callbacks
lalr standard Yes
lalr contextual Yes
earley standard Yes
earley dynamic No
earley dynamic_complete No
lalr custom (Maybe)
earley custom (Maybe)

lexer="auto"根据解析器选择词法分析器:对于lalr它选择contextual, for earley它选择dynamic。默认解析器是earley,所以无需选择parser or lexer, lexer_callbacks不支持。

A issue https://github.com/lark-parser/lark/issues/386在这方面已经打开并再次关闭。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们需要指定标准的 Lark 词法分析器才能捕获评论终端? 的相关文章

随机推荐