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))
添加回答
舉報