匹配nom

时间:2017-06-09 04:31:51

标签: macros rust nom

我正在使用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,但我无法使用字节。

1 个答案:

答案 0 :(得分:3)

我们可以one_of!(..)使用so

one_of!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UILabel appearance] setFont:[UIFont systemFontOfSize:fontsize]]; } 必须有一个切片才能使用。我们可以通过使用.as_ref()将数组转换为数组来获得一个。