3

我正在开发一个基于 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未指定)。

4

1 回答 1

2

Larkparser支持和的不同组合lexer。有些支持lexer_callbacks,有些不支持:

解析器 词法分析器 lexer_callbacks
拉尔 标准 是的
拉尔 语境 是的
厄利 标准 是的
厄利 动态的
厄利 动态完成
拉尔 风俗 (也许)
厄利 风俗 (也许)

lexer="auto"根据解析器选择词法分析器:因为lalr它选择contextual,因为earley它选择dynamic. 默认解析器是,earley因此不支持不选择parseror 。lexerlexer_callbacks

这方面的一个问题已经打开并再次关闭。

于 2021-07-19T11:18:17.077 回答