用 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")+
我怀疑这是最优雅的解决方案,所以我很感激其他答案或建议。
给出以下 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")+
我怀疑这是最优雅的解决方案,所以我很感激其他答案或建议。