summaryrefslogtreecommitdiff
path: root/src/chomp/check
diff options
context:
space:
mode:
authorGreg Brown <gmb60@cam.ac.uk>2021-01-09 14:31:02 +0000
committerGreg Brown <gmb60@cam.ac.uk>2021-01-09 14:31:02 +0000
commit0d01692c97ea8ca6fc4b229e5b9678cb252bceda (patch)
tree6c5ed07740b814f50dddbc6afaefc21c11dc3440 /src/chomp/check
parent487ce4fe0fa081f58d790d7d6417bf7d2659197c (diff)
Introduce chomp as a procedural macro.
Add a bunch of tests. Fix chomp and chewed so autochomp compiles.
Diffstat (limited to 'src/chomp/check')
-rw-r--r--src/chomp/check/inline.rs119
1 files changed, 117 insertions, 2 deletions
diff --git a/src/chomp/check/inline.rs b/src/chomp/check/inline.rs
index 43a2eb8..da501f1 100644
--- a/src/chomp/check/inline.rs
+++ b/src/chomp/check/inline.rs
@@ -158,7 +158,7 @@ mod tests {
None,
)
.into(),
- None
+ None,
);
let inlined = expr.fold(&mut InlineCalls::new(function));
assert_eq!(
@@ -208,7 +208,7 @@ mod tests {
None,
)
.into(),
- None
+ None,
);
let inlined = expr.fold(&mut InlineCalls::new(function));
assert_eq!(
@@ -231,4 +231,119 @@ mod tests {
.into())
)
}
+
+ #[test]
+ fn test_inline_double_subst() {
+ let expr = Call::new(
+ Name::Spanless("opt".to_string()),
+ vec![Call::new(
+ Name::Spanless("opt".to_string()),
+ vec![Literal::Spanless("x".to_string()).into()],
+ None,
+ )
+ .into()],
+ None,
+ );
+ let inlined = expr.fold(&mut InlineCalls::new(opt()));
+ assert_eq!(
+ inlined,
+ Ok(Alt::new(
+ Epsilon::default().into(),
+ None,
+ Alt::new(
+ Epsilon::default().into(),
+ None,
+ Literal::Spanless("x".to_string()).into()
+ )
+ .into()
+ )
+ .into())
+ )
+ }
+
+ #[test]
+ fn test_inline_call_args() {
+ let expr = Fix::new(
+ Name::Spanless("rec".to_string()),
+ Cat::new(
+ Literal::Spanless("a".to_string()).into(),
+ None,
+ Call::new(
+ Name::Spanless("opt".to_string()),
+ vec![Cat::new(
+ Cat::new(
+ Literal::Spanless("a".to_string()).into(),
+ None,
+ Fix::new(
+ Name::Spanless("star".to_string()),
+ Call::new(
+ Name::Spanless("opt".to_string()),
+ vec![Cat::new(
+ Literal::Spanless(" ".to_string()).into(),
+ None,
+ Variable::new(Name::Spanless("star".to_string()), 0).into(),
+ )
+ .into()],
+ None,
+ )
+ .into(),
+ None,
+ )
+ .into(),
+ )
+ .into(),
+ None,
+ Variable::new(Name::Spanless("rec".to_string()), 0).into(),
+ )
+ .into()],
+ None,
+ )
+ .into(),
+ )
+ .into(),
+ None,
+ );
+ let inlined = expr.fold(&mut InlineCalls::new(opt()));
+ assert_eq!(inlined,
+ Ok(Fix::new(
+ Name::Spanless("rec".to_string()),
+ Cat::new(
+ Literal::Spanless("a".to_string()).into(),
+ None,
+ Alt::new(
+ Epsilon::default().into(),
+ None,
+ Cat::new(
+ Cat::new(
+ Literal::Spanless("a".to_string()).into(),
+ None,
+ Fix::new(
+ Name::Spanless("star".to_string()),
+ Alt::new(
+ Epsilon::default().into(),
+ None,
+ Cat::new(
+ Literal::Spanless(" ".to_string()).into(),
+ None,
+ Variable::new(Name::Spanless("star".to_string()), 0).into(),
+ )
+ .into()
+ )
+ .into(),
+ None,
+ )
+ .into(),
+ )
+ .into(),
+ None,
+ Variable::new(Name::Spanless("rec".to_string()), 0).into(),
+ )
+ .into(),
+ )
+ .into(),
+ )
+ .into(),
+ None,
+ ).into()))
+ }
}