1

给出以下云雀语法和 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终端更高的优先级?

4

1 回答 1

1

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

start: (TEXT _NEWLINE)+

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

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

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

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

于 2020-06-09T16:45:49.057 回答