0

我正在使用 lark 来解析一些文本,并且需要一种方法来匹配NAME其中没有某些关键字的内容。我在终端中列出了关键字我只是不确定如何制作我需要使用它的终端。

这是我格式化关键字的方式

keywords: "var"
        | "let"
        | "type"

对此的所有帮助表示赞赏!

4

1 回答 1

2

Lark 内置了对关键字概念的支持。因此,您不太可能需要明确排除关键字NAME

例如:

l = Lark("""
    %import common (LETTER, DIGIT)
    NAME: LETTER (LETTER | DIGIT)*
    keywords: "var"
            | "let"
            | "type"

    start: NAME | keywords
""", parser="lalr")

print(l.parse("hello"))     # Tree('start', [Token('NAME', 'hello')])
print(l.parse("let"))       # Tree('start', [Tree('keywords', [])])

话虽如此,如果必须,您可以使用正则表达式来完成此操作:

l = Lark("""
    %import common (LETTER, DIGIT)
    NAME: /(?!(let|type|var))/ LETTER (LETTER | DIGIT)*
    start: NAME
""")

print(l.parse("hello"))     # Tree('start', [Token('NAME', 'hello')])
print(l.parse("let"))       # Exception, terminal not defined

PS 请记住,“TERMINAL”是大写的,“rule”是小写的,它们在 Lark 中的表现不同,所以记住区别很重要。

于 2021-03-07T13:07:09.373 回答