是否有一种方法使终端匹配除特定关键字以外的每个NAME ?



我使用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', [])])

话虽如此,如果必须这样做,您可以使用regexp:

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

注:请记住"终点站";是大写字母,并且"rule"是小写的,它们在Lark中的行为是不同的,所以记住它们的区别是很重要的。

相关内容

最新更新