Types 使用nom解析文本并返回值

Types 使用nom解析文本并返回值,types,rust,nom,Types,Rust,Nom,我是个新手,三个小时来我一直在想这个问题,我想我快疯了。我只需要一个解析器,它接受字符串“true”,并返回一个枚举值::Const(true)。这就是我到目前为止所做的: // parser.rs use nom::*; #[derive(PartialEq, Debug, Clone)] pub enum Value { Const(bool), } fn true_value<T>(_: T) -> Value { Value::Const(true) } f

我是个新手,三个小时来我一直在想这个问题,我想我快疯了。我只需要一个解析器,它接受字符串
“true”
,并返回一个枚举
值::Const(true)
。这就是我到目前为止所做的:

// parser.rs
use nom::*;

#[derive(PartialEq, Debug, Clone)]
pub enum Value {
    Const(bool),
}

fn true_value<T>(_: T) -> Value { Value::Const(true) }
fn false_value<T>(_: T) -> Value { Value::Const(false) }

named!(literal_true<&[u8]>, map_res!(tag!("true"), true_value));
named!(literal_false<&[u8]>, map_res!(tag!("false"), false_value));
//parser.rs
使用名称::*;
#[派生(PartialEq、调试、克隆)]
发布枚举值{
康斯特(布尔),
}
fn真值(u:T)->值{value::Const(真)}
fn false_value(u:T)->value{value::Const(false)}
命名!(literal_true,map_res!(tag!(“true”),true_value));
命名!(literal_false,map_res!(tag!(“false”),false_value));
但我得到的是:

错误[E0308]:类型不匹配
-->src/parser.rs:25:1
|
25 |命名!(literal_true,map_res!(tag!(“true”),true_value));
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注意:应为类型`parser::Value`
找到类型“std::result::result”`
=注意:此错误源于当前板条箱外部的宏

我不知道这里发生了什么。我试图找到一些示例或教程来获得一些关于如何实现这一点的提示,但由于某些原因,这肯定是以前没有人尝试过的一些罕见的边缘操作。

您有两个问题:传递给的函数(如映射结果)必须返回一个
结果,传递给的函数签名必须指示输入和输出类型。如果不想返回结果,可以使用宏

#[派生(PartialEq、调试、克隆)]
发布枚举值{
康斯特(布尔),
}
fn真值(u:T)->值{value::Const(真)}
fn false_value(u:T)->value{value::Const(false)}
//输入类型和输出类型
命名!(literal_true,map!(tag!(“true”),true_value));
//输入类型为&[u8]时可以省略
命名!(literal_false,map!(tag!(“false”),false_value));

您有两个问题:传递给的函数(如映射结果)必须返回
结果,传递给的函数签名必须指示输入和输出类型。如果不想返回结果,可以使用宏

#[派生(PartialEq、调试、克隆)]
发布枚举值{
康斯特(布尔),
}
fn真值(u:T)->值{value::Const(真)}
fn false_value(u:T)->value{value::Const(false)}
//输入类型和输出类型
命名!(literal_true,map!(tag!(“true”),true_value));
//输入类型为&[u8]时可以省略
命名!(literal_false,map!(tag!(“false”),false_value));

尝试使用
C--pretty expanded-Z不稳定选项编译
。这将向您显示展开的宏。请尝试使用
c--pretty expanded-Z-unstable选项编译。这将显示展开的宏。
#[derive(PartialEq, Debug, Clone)]
pub enum Value {
    Const(bool),
}

fn true_value<T>(_: T) -> Value { Value::Const(true) }
fn false_value<T>(_: T) -> Value { Value::Const(false) }

// input type and output type 
named!(literal_true<&[u8], Value>, map!(tag!("true"), true_value));
// input type can be omitted if it's &[u8]
named!(literal_false<Value>, map!(tag!("false"), false_value));