有没有办法让终端匹配除特定关键字之外的每个名称?

Is there a way to make a Terminal match every NAME except for specific keywords?

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

这是我设置关键字格式的方式

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

感谢所有帮助!

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

P.S。请记住,“TERMINAL”是大写字母,“rule”是小写字母,它们在 Lark 中的行为不同,因此请务必牢记区别。