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

问题描述

我正在使用 lark 来解析一些文本,并且需要一种方法来匹配没有特定关键字的 from dask.distributed import Client import joblib from sklearn.feature_extraction.text import TfidfVectorizer client = Client(processes=False) # create local cluster with joblib.parallel_backend('dask'): tfidf.fit(corpus) 。我在终端中列出了关键字,但我不确定如何制作我需要使用的终端。

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

NAME

感谢您对此的所有帮助!

解决方法

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','hello')])
print(l.parse("let"))       # Exception,terminal not defined

附言请记住,“TERMINAL”是大写的,而“rule”是小写的,并且它们在 Lark 中的行为不同,因此记住区别很重要。