From a99986ec4c903f116a5ed264f5cbbcba954c9338 Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Wed, 25 Sep 2024 12:18:02 +0200 Subject: Can parse and evaluate multiple expressions from a single input --- rust/sample/test.txt | 6 +++++- rust/sample/test_normal.txt | 1 + rust/src/parser.rs | 15 +++++++++++---- 3 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 rust/sample/test_normal.txt diff --git a/rust/sample/test.txt b/rust/sample/test.txt index 3cacc0b..76dc68a 100644 --- a/rust/sample/test.txt +++ b/rust/sample/test.txt @@ -1 +1,5 @@ -12 \ No newline at end of file +12 +foo + true + +(x x) diff --git a/rust/sample/test_normal.txt b/rust/sample/test_normal.txt new file mode 100644 index 0000000..00abde9 --- /dev/null +++ b/rust/sample/test_normal.txt @@ -0,0 +1 @@ +((lam x 1) ((lam x (x x)) (lam x (x x)))) diff --git a/rust/src/parser.rs b/rust/src/parser.rs index c54386c..48ef2e0 100644 --- a/rust/src/parser.rs +++ b/rust/src/parser.rs @@ -54,10 +54,12 @@ pub fn parse(arg: &str) -> Vec { let tokens = tokenize(arg); let mut parser = Parser { tokens, index: 0 }; let mut result = Vec::new(); - let expr = parse_expression(&mut parser) - .map_err(|e| panic!("Syntax error: {}", e)) - .unwrap(); - result.push(expr); + while parser.index < parser.tokens.len() { + let expr = parse_expression(&mut parser) + .map_err(|e| panic!("Syntax error: {}", e)) + .unwrap(); + result.push(expr); + } result } @@ -248,6 +250,11 @@ mod tests { ); } + #[test] + fn parse_multiple_values() { + assert_eq!(vec![Sym("foo".to_string()), Num(42)], parse("foo 42")); + } + impl Arbitrary for Value { type Parameters = (); type Strategy = BoxedStrategy; -- cgit v1.2.3