1 回答
TA贡献1828条经验 获得超3个赞
这不是一个非常干净的实现,我不能 100% 确定它是否完全符合您的要求,但我建议使用Lark库来执行此操作。
与其使用现成的解析器来完成这项工作,不如自己做一个小解析器,为了节省时间,Lark 具有“保存”和“加载”功能,因此您可以保存序列化版本的解析器并加载每个解析器时间而不是在每个运行时重新创建整个解析器。希望这可以帮助 :)
from lark import Lark, Transformer
grammar = """
%import common.WS
%import common.ESCAPED_STRING
%import common.SIGNED_NUMBER
%ignore WS
start : struct
struct : NAME "(" [element ("," element)*] ")"
element : struct | array | primitive
array : "[" [element ("," element)*] "]"
primitive : number
| string
| boolean
string : ESCAPED_STRING
number : SIGNED_NUMBER
boolean : TRUE | FALSE
NAME : /[a-zA-Z][a-zA-Z0-9]*/
TRUE : "true"
FALSE : "false"
"""
class T(Transformer):
def start(self, s):
return s[0]
def string(self, s):
return s[0][1:-1].replace('\\"', '"')
def primitive(self, s):
return s[0]
def struct(self, s):
return { "type": s[0].value, "args": s[1:] }
def boolean(self, s):
return s[0].value == "true"
def element(self, s):
return s[0]
array = list
def number(self, s):
try:
return int(s[0].value)
except:
return float(s[0].value)
parser = Lark(grammar, parser = "lalr", transformer = T())
test = """
Struct(1.5, false, Struct2("text"), [1, 2, 3])
"""
print(parser.parse(test))
添加回答
举报