使用 nom 解析文字和 return 值
Using nom to parse literal and return value
我是 Rust 的新手,三个小时以来我一直在努力思考这个问题,我想我快要疯了。我想要的只是一个解析器,它接受字符串 "true"
和 returns 一个枚举 Value::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));
但我得到的是:
error[E0308]: mismatched types
--> src/parser.rs:25:1
|
25 | named!(literal_true<&[u8], Result<Value, String>>, map_res!(tag!("true"), true_value));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `parser::Value`, found enum `std::result::Result`
|
= note: expected type `parser::Value`
found type `std::result::Result<_, _>`
= note: this error originates in a macro outside of the current crate
我不知道这里发生了什么。我试图找到示例或教程来获得有关如何执行此操作的微小提示,但出于某种原因,这一定是以前没有人尝试过的一些罕见的优势。
您有两个问题:传递给 map_res
(as in map result) must return a Result
, and the function signature you pass to named
must indicate input and output types. If you don't want to return a result, you can use the map
宏的函数
#[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));
我是 Rust 的新手,三个小时以来我一直在努力思考这个问题,我想我快要疯了。我想要的只是一个解析器,它接受字符串 "true"
和 returns 一个枚举 Value::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));
但我得到的是:
error[E0308]: mismatched types
--> src/parser.rs:25:1
|
25 | named!(literal_true<&[u8], Result<Value, String>>, map_res!(tag!("true"), true_value));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `parser::Value`, found enum `std::result::Result`
|
= note: expected type `parser::Value`
found type `std::result::Result<_, _>`
= note: this error originates in a macro outside of the current crate
我不知道这里发生了什么。我试图找到示例或教程来获得有关如何执行此操作的微小提示,但出于某种原因,这一定是以前没有人尝试过的一些罕见的优势。
您有两个问题:传递给 map_res
(as in map result) must return a Result
, and the function signature you pass to named
must indicate input and output types. If you don't want to return a result, you can use the map
宏的函数
#[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));