Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Ralle/336941d1472a598d1121 to your computer and use it in GitHub Desktop.
Save Ralle/336941d1472a598d1121 to your computer and use it in GitHub Desktop.
problem with rust parser using parser-combinators
extern crate parser_combinators;
use parser_combinators::{
between,
char,
digit,
many,
many1,
ParseError,
parser,
Parser,
ParseResult,
ParserExt,
};
use parser_combinators::primitives::{
State,
Stream,
};
#[derive(Debug)]
enum Expr {
Int(i32),
Float(f32),
Pair(Box<Expr>, Box<Expr>),
}
fn expr<I>(input: State<I>) -> ParseResult<Expr, I> where I: Stream<Item=char> {
let int_parser = many1(digit())
.map(|i : String|
Expr::Int(i.parse::<i32>().unwrap())
);
let float_parser = many1(digit())
.skip(char('.'))
.and(many(digit()))
.map(|(i, j) : (String, String)|
Expr::Float((i + "." + &j).parse::<f32>().unwrap())
);
let parens_parser = between(char('('), char(')'), parser(expr::<I>).skip(char(',')).and(parser(expr::<I>)))
.map(|(i, j) : (Expr, Expr)| Expr::Pair(Box::new(i), Box::new(j)));
float_parser
.or(int_parser)
.or(parens_parser)
.parse_state(input)
}
fn main() {
let input = "(512,312)";
// let input = "(512.1,312.1)";
let result2 : Result<(Expr, &str), ParseError<char>> = parser(expr).parse(input);
match result2 {
Ok((value, _remaining_input)) => println!("Result: {:?}, Remain: {:?}", value, _remaining_input),
Err(err) => println!("Err: {}", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment