Macros 匹配nom中几个字节中的一个

Macros 匹配nom中几个字节中的一个,macros,rust,nom,Macros,Rust,Nom,我正在使用解析一些二进制65c816汇编数据。我的解析器结构的一部分将操作码拆分为单独的形式,然后获取它们的参数(如果有)。当前的示例解析器如下所示: named!(absolute_long<Instruction>, do_parse!(op: bits!(alt!( opcode!(0x0F) | opcode!(0x22) | opcode!(0x2F) | opcode!(0x4F) | opcode!(0x5C) | opcod

我正在使用解析一些二进制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))));
相反,我希望有如下代码,但无法确定如何制作宏或函数:

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)));
有什么方法可以实现这样的功能吗?或者我最好只使用
标记位
?我觉得我应该能够使用
一个
,但我无法让它与字节一起工作。

我们可以使用如下方式:

#[宏使用]
外部板条箱名称;
使用名称::*;
//你的类型可能看起来不同,我推断我可以:
#[导出(调试)]
枚举指令{
绝对长度(u8,u32)
}
命名!(绝对长,不要解析(
op:of!([0x0F,0x22,0x2F,0x4F,0x5C,0x6F,0x8F,0xAF,0xCF,0xEF])中的一个
>>参数:le_u24
>>(说明:绝对长度(操作为u8,参数))
));
fn main(){
println!(“{:?}”,绝对长度(&[0x0F,0x01,0x01,0x01]);
}

指定一个要使用的切片。我们可以通过向其施放阵列来获得一个。

谢谢!我试着用
一个
已经有相当一段时间了,但因为我是一个生锈的新手,所以我不知道
.as\u ref()
或者如何解释与切片相关的错误。这样做可以摆脱我的宏,使所有这些解析器看起来更干净。数组和切片语法可能有点棘手。不客气()
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),*)))
    );
);
#[macro_use]
extern crate nom;
use nom::*;

// Your type might look a different, I infered what I could:
#[derive(Debug)]
enum Instruction {
    AbsoluteLong(u8, u32)
}

named!(absolute_long<Instruction>, do_parse!(
       op: one_of!([0x0F, 0x22, 0x2F, 0x4F, 0x5C, 0x6F, 0x8F, 0xAF, 0xCF, 0xEF].as_ref())
    >> param: le_u24
    >> (Instruction::AbsoluteLong(op as u8, param))
));

fn main() {
    println!("{:?}", absolute_long(&[0x0F, 0x01, 0x01, 0x01, 0x01]));
}