我从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
+