1

我从Lark解析特殊字符的问题开始并陷入困境。

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

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

常量的定义可以在这里找到。

问题是生成的树中不存在特殊字符(参见下面的示例)。我已经看到了这个答案,但它对我没有帮助。我试图放在!特殊字符之前,转义它们。我还启用了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
      +
4

1 回答 1

1

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

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

这为我产生了您的预期结果:

start
  object
    name    Apple_3
    feature
      3
      +
于 2020-02-06T20:40:15.920 回答