Lark:解析特殊字符
Lark: parsing special characters
我从 Lark
开始,但遇到了解析特殊字符的问题。
我有语法给出的表达式。例如,这些是有效的表达式:Car{_}
、Apple3{3+}
、Dog{a_7}
、r2d2{A3*}
、A{+}
...更正式地说,它们具有以下形式:name{feature}
其中
name: CNAME
feature: (DIGIT|LETTER|"+"|"-"|"*"|"_")+
常量的定义可以参考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
+
我从 Lark
开始,但遇到了解析特殊字符的问题。
我有语法给出的表达式。例如,这些是有效的表达式:Car{_}
、Apple3{3+}
、Dog{a_7}
、r2d2{A3*}
、A{+}
...更正式地说,它们具有以下形式:name{feature}
其中
name: CNAME
feature: (DIGIT|LETTER|"+"|"-"|"*"|"_")+
常量的定义可以参考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
+