用Python解析Lisp文件

用Python解析Lisp文件,第1张

用Python解析Lisp文件

如此答案所示,pyparsing似乎是正确的工具:

inputdata = '(1 ((st 8) (pitch 67) (dur 4) (keysig 1) (timesig 12) (fermata 0))((st 12) (pitch 67) (dur 8) (keysig 1) (timesig 12) (fermata 0)))'from pyparsing import OneOrMore, nestedExprdata = oneOrMore(nestedExpr()).parseString(inputdata)print data# [['1', [['st', '8'], ['pitch', '67'], ['dur', '4'], ['keysig', '1'], ['timesig', '12'], ['fermata', '0']], [['st', '12'], ['pitch', '67'], ['dur', '8'], ['keysig', '1'], ['timesig', '12'], ['fermata', '0']]]]

为了完整起见,这是格式化结果的格式(使用texttable):

from texttable import Texttabletab = Texttable()for row in data.asList()[0][1:]:    row = dict(row)    tab.header(row.keys())    tab.add_row(row.values())print tab.draw()+ --------- + -------- + ---- + ------- + ----- + --------- +| Timesig | keyig | st | 音高| dur | Fermata |+ ========= + ======== + ============================= +| 12 | 1 | 8 | 67 | 4 | 0 |+ --------- + -------- + ---- + ------- + ----- + --------- +| 12 | 1 | 12 | 67 | 8 | 0 |+ --------- + -------- + ---- + ------- + ----- + --------- +

将该数据转换回Lisp表示法:

def lisp(x):    return '(%s)' % ' '.join(lisp(y) for y in x) if isinstance(x, list) else xd = lisp(d[0])


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5649103.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存