Я начинаю с 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
+