Ich versuche, einen Parser mit Nom zu erstellen, der einen Text analysiert, der eine von vielen Optionen sein könnte. Nom hat alt!
für, wenn die Werte zur Kompilierungszeit bekannt sind, aber meine Werte werden nicht sein.Wie passt man einen Vektor von Strings mit nom zusammen?
Dies war mein Versuch, meinen eigenen Parser zu erstellen, der eine Vec<String>
entgegennehmen kann, und ich bin in ein paar Probleme.
#[macro_use]
extern crate nom;
use nom::IResult;
fn alternative_wrapper<'a>(input: &'a [u8], alternatives: Vec<String>) -> IResult<&'a [u8], &'a [u8]> {
for alternative in alternatives {
// tag!("alternative");
println!("{}", alternative);
}
return IResult::Done(input, "test".as_bytes());
}
#[test]
fn test_date() {
let input = "May";
named!(alternative, call!(alternative_wrapper));
let months = vec!(
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
).iter().map(|s| s.to_string()).collect();
println!("{:?}", alternative("May".as_bytes(), months));
}
Ich bin mir bewusst, dass meine alternative_wrapper
Funktion tatsächlich tut nichts nützlich, aber das ist nicht das Problem. Dies ist, was Rust beschwert mich für diesen Schnipsel über:
error[E0061]: this function takes 1 parameter but 2 parameters were supplied
--> src/parser.rs:32:34
|
17 | named!(alternative, call!(alternative_wrapper));
| ------------------------------------------------ defined here
...
32 | println!("{:?}", alternative("May".as_bytes(), months));
| ^^^^^^^^^^^^^^^^^^^^^^^^ expected 1 parameter
|
= note: this error originates in a macro outside of the current crate
error[E0061]: this function takes 2 parameters but 1 parameter was supplied
--> src/parser.rs:17:5
|
6 |/fn alternative_wrapper<'a>(input: &'a [u8], alternatives: Vec<String>) -> IResult<&'a [u8], &'a
[u8]> {
7 | | for alternative in alternatives {
8 | | // tag!("alternative");
9 | | println!("{}", alternative);
10 | | }
11 | | return IResult::Done(input, "test".as_bytes());
12 | | }
| |_- defined here
...
17 | named!(alternative, call!(alternative_wrapper));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected 2 parameters
|
= note: this error originates in a macro outside of the current crate
Wie ich einen Parser aus meiner Funktion erstellen kann? Und wie kann ich bestehende Parser wie tag!
aus alternative_wrapper
verwenden?