我正在开发一个基于 Lark 的项目,我需要能够“捕获”正在解析的代码中的注释。
但是,在没有明确指定标准词法分析器的情况下使用标准词法分析器时它不起作用。
我从Lark 食谱中获取了第二个示例,并将其修改为使用默认解析器并解析类似 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 中可能存在的错误?
进一步的实验似乎表明它要么是 要么'dynamic'
在'dynamic_complete'
默认情况下使用(lexer
未指定)。