Жаворонок: разбор специальных символов - PullRequest
1 голос
/ 06 февраля 2020

Я начинаю с Lark и застрял в проблеме с анализом специальных символов.

У меня есть выражения, заданные грамматикой. Например, это допустимые выражения: Car{_}, Apple3{3+}, Dog{a_7}, r2d2{A3*}, A{+} ... Более формально они имеют форму: name{feature} где

  • 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
      +

1 Ответ

1 голос
/ 06 февраля 2020

Вы сказали, что пытались поместить ! перед специальными символами. Как я понимаю, вопрос, который вы связали, ! должен быть заменен перед правилом:

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

Это даст мне ожидаемый результат:

start
  object
    name    Apple_3
    feature
      3
      +
...