【发布时间】:2021-10-08 04:09:02
【问题描述】:
我正在尝试使用 Pyparser 解析 Csound 操作码行(以创建自定义自动格式化程序),但我一直在尝试定义以下公式:
optional comma list + keyword + optional comma list
Csound 代码行的可能变化:
prints "int: %d%n", 45
a1 oscil 0.5, 440, -1
aL, aR stereo a1
outs aL, aR
以及它们的语法:
opcode string, param
output opcode param, param, param
output, output opcode param
opcode param, param
到目前为止,我想出了这个:
import pyparsing as pp
samples = [
"prints \"int: %d%n\", 45",
"a1 oscil 0.5, 440",
"aL, aR stereo a1",
"outs aL, aR"
]
var = pp.Word(pp.alphanums)
outputs = pp.Optional(pp.delimitedList(var))
opcode = pp.Word(pp.alphanums)
param = var | pp.dblQuotedString
params = pp.Optional(pp.delimitedList(param))
csound_line = outputs("outputs") \
+ opcode("opcode") \
+ params("params")
parsed = csound_line.parseString(samples[1])
print(parsed.dump())
parsed = csound_line.parseString(samples[2])
print(parsed.dump())
parsed = csound_line.parseString(samples[3])
print(parsed.dump())
parsed = csound_line.parseString(samples[0])
print(parsed.dump())
但它给了我这个:
['a1', 'oscil', '0']
- opcode: 'oscil'
- outputs: ['a1']
- params: ['0']
['aL', 'aR', 'stereo', 'a1']
- opcode: 'stereo'
- outputs: ['aL', 'aR']
- params: ['a1']
['outs', 'aL']
- opcode: 'aL'
- outputs: ['outs']
Traceback (most recent call last):
File "/home/oliver/projects/personal/local/csoundformat/./test.py", line 33, in <module>
parsed = csound_line.parseString(samples[0])
File "/usr/lib/python3.9/site-packages/pyparsing.py", line 1955, in parseString
raise exc
File "/usr/lib/python3.9/site-packages/pyparsing.py", line 3250, in parseImpl
raise ParseException(instring, loc, self.errmsg, self)
pyparsing.ParseException: Expected W:(ABCD...), found '"' (at char 7), (line:1, col:8)
解析第 2 行工作正常,但第 1 行和第 3 行缺少结束参数,第 0 行导致抱怨双引号,尽管我使用了dblQuotedString。
我似乎无法确定Optional/ZeroOrMore 和delimitedList 的正确组合。任何帮助将不胜感激。
谢谢!
【问题讨论】:
标签: python string parsing pyparsing