我正在使用nom来解析一些二进制 65c816 汇编数据。我的解析器结构的一部分将操作码拆分为单独的形式,然后获取它们的参数(如果有的话)。当前的示例解析器如下所示:
named!(absolute_long<Instruction>,
do_parse!(op: bits!(alt!(
opcode!(0x0F) | opcode!(0x22) | opcode!(0x2F) | opcode!(0x4F) |
opcode!(0x5C) | opcode!(0x6F) | opcode!(0x8F) | opcode!(0xAF) |
opcode!(0xCF) | opcode!(0xEF)))
>> param: le_u24
>> (Instruction::AbsoluteLong(op, param))));
我制作的宏在哪里opcode!
执行以下操作:
macro_rules! opcode(
($i:expr, $op:expr) => (
tag_bits!($i, u8, 8, $op);
);
($i:expr, $f:expr) => (
opcode!($i, call!($f));
);
);
相反,我希望拥有如下代码,但无法弄清楚如何制作宏或函数来做到这一点:
named!(absolute_long<Instruction>,
do_parse!(op: opcodes!(
0x0F, 0x22, 0x2F, 0x4F, 0x5C, 0x6F, 0x8F, 0xAF,
0xCF, 0xEF)
>> param: le_u24
>> (Instruction::AbsoluteLong(op, parm)));
我得到的最接近的是制作这个宏,但它几乎立即遇到递归限制,而且总的来说它似乎真的不是最理想的:
macro_rules! opcodes(
($i:expr, $op:expr) => {
opcode!($i, $op)
};
($i:expr, $op:expr, $($more:expr), *) => (
bits!($i, alt!(opcode!($op) | opcodes!($($more),*)))
);
);
有什么办法可以实现这样的东西,还是我最好只使用tag_bits
?我觉得我应该可以使用one_of
,但我无法让它与字节一起使用。