用 lark 和 LALR 解析尾部注释

Parse trailing line comments with lark and LALR

给出以下 lark 语法和 Python 源代码:

start: (TEXT _NEWLINE)+

TEXT: /[^\n]+/

COMMENT: /\/\/[^\n]*/ _NEWLINE
%ignore COMMENT

_NEWLINE: (" "* "\n")+
from lark import Lark

parser = Lark.open("grammar.lark", parser='lalr')

parser.parse("""Lorem ipsum
// line comment
Text with // trailing comment
""")

上面的解析器生成了这棵树:

第一行文本被正确解析,第二行(注释)按预期被忽略。但是,最后一行包含应该被忽略的注释。

这是预期的输出:

我意识到在 TEXT 节点中有两个连续的斜线在我的语法中是完全合法的(实际上应该引入行注释)。但是,我不知道如何防止这种情况。有什么办法可以禁止 TEXT 中的两个连续斜杠或给予 COMMENT 终端更高的优先级?

我刚找到一个似乎有效的语法:

start: (TEXT _NEWLINE)+

TEXT: /(\/?[^\n\/])+/

COMMENT: /\/\/[^\n]*/
%ignore COMMENT

_NEWLINE: (" "* COMMENT? "\n")+

我怀疑这是最优雅的解决方案,所以我很感激其他答案或建议。