Lark:解析特殊字符

Lark: parsing special characters

我从 Lark 开始,但遇到了解析特殊字符的问题。

我有语法给出的表达式。例如,这些是有效的表达式:Car{_}Apple3{3+}Dog{a_7}r2d2{A3*}A{+}...更正式地说,它们具有以下形式:name{feature} 其中

常量的定义可以参考here.

问题是生成的树中不存在特殊字符(请参见下面的示例)。我看过这个 ,但它对我没有帮助。我试图将 ! 放在特殊字符之前,转义它们。我还启用了 keep_all_tokens,但这是不需要的,因为字符 {} 也出现在树中。任何想法如何解决这个问题?谢谢。

from lark import Lark

grammar = r"""
    start: object

    object : name "{" feature "}" | name

    feature: (DIGIT|LETTER|"+"|"-"|"*"|"_")+
    name: CNAME

    %import common.LETTER
    %import common.DIGIT
    %import common.CNAME
    %import common.WS
    %ignore WS
"""

parser = Lark(grammar, parser='lalr',
                   lexer='standard',
                   propagate_positions=False,
                   maybe_placeholders=False
                   )
def test():
    test_str = '''
        Apple_3{3+}
    '''

    j = parser.parse(test_str)
    print(j.pretty())

if __name__ == '__main__':
    test()

输出如下所示:

start
  object
    name    Apple_3
    feature 3

而不是

start
  object
    name    Apple_3
    feature 
      3
      +

您说您尝试在特殊字符前放置 !。据我了解您链接的问题, ! 必须在规则之前被替换:

!feature: (DIGIT|LETTER|"+"|"-"|"*"|"_")+

这产生了我预期的结果:

start
  object
    name    Apple_3
    feature
      3
      +