diff options
author | Greg Brown <gmb60@cam.ac.uk> | 2021-01-06 14:56:11 +0000 |
---|---|---|
committer | Greg Brown <gmb60@cam.ac.uk> | 2021-01-06 14:56:11 +0000 |
commit | dc10a278cca74d737e4af0fe034a1caa8abb291d (patch) | |
tree | 3fbb9efc0bdc9fd3bc24d2ad743585071b7006a4 /src/ast/typed.rs | |
parent | 4fb6b740e79c1942fd0bfde9b167ea273c7d0b4b (diff) |
Restructure code base to separate compilation phases.
Diffstat (limited to 'src/ast/typed.rs')
-rw-r--r-- | src/ast/typed.rs | 284 |
1 files changed, 0 insertions, 284 deletions
diff --git a/src/ast/typed.rs b/src/ast/typed.rs deleted file mode 100644 index 7c3f89e..0000000 --- a/src/ast/typed.rs +++ /dev/null @@ -1,284 +0,0 @@ -use std::collections::BTreeSet; - -#[derive(Clone, Debug, Default, Eq, PartialEq, Hash)] -pub struct FirstSet { - inner: BTreeSet<char>, -} - -impl FirstSet { - pub fn new() -> Self { - Self::default() - } - - pub fn of_str(s: &str) -> Self { - let mut inner = BTreeSet::new(); - s.chars().next().map(|c| inner.insert(c)); - - Self { inner } - } - - pub fn is_empty(&self) -> bool { - self.inner.is_empty() - } - - pub fn union(&mut self, mut other: Self) { - self.inner.append(&mut other.inner); - } - - pub fn intersect(&self, other: &Self) -> Self { - Self { - inner: self.inner.intersection(&other.inner).copied().collect(), - } - } -} - -impl IntoIterator for FirstSet { - type Item = char; - - type IntoIter = <BTreeSet<char> as IntoIterator>::IntoIter; - - fn into_iter(self) -> Self::IntoIter { - self.inner.into_iter() - } -} - -#[derive(Clone, Debug, Default, Eq, PartialEq, Hash)] -pub struct FlastSet { - inner: BTreeSet<char>, -} - -impl FlastSet { - pub fn new() -> Self { - Self::default() - } - - pub fn is_empty(&self) -> bool { - self.inner.is_empty() - } - - pub fn union_first(&mut self, mut other: FirstSet) { - self.inner.append(&mut other.inner); - } - - pub fn union(&mut self, mut other: Self) { - self.inner.append(&mut other.inner); - } - - pub fn intersect_first(&self, other: &FirstSet) -> Self { - Self { - inner: self.inner.intersection(&other.inner).copied().collect(), - } - } - - pub fn intersect(&self, other: &Self) -> Self { - Self { - inner: self.inner.intersection(&other.inner).copied().collect(), - } - } -} - -#[derive(Debug)] -pub struct NullContext<'a> { - inner: &'a mut FlastContext, -} - -impl NullContext<'_> { - pub fn depth(&self) -> usize { - self.inner.depth() - } - - pub fn is_guarded(&self, index: usize) -> Option<bool> { - self.inner.is_guarded(index) - } - - pub fn with_unguard<F: FnOnce(&mut Self) -> R, R>(&mut self, f: F) -> R { - self.unguard(); - let res = f(self); - self.guard(); - res - } - - pub(crate) fn unguard(&mut self) { - self.inner.unguard() - } - - pub(crate) fn guard(&mut self) { - self.inner.guard() - } - - pub fn is_nullable(&self, index: usize) -> Option<bool> { - self.inner.is_nullable(index) - } - - pub fn with_nullable<F: FnOnce(&mut Self) -> R, R>(&mut self, nullable: bool, f: F) -> R { - self.push_nullable(nullable); - let res = f(self); - self.guard(); - res - } - - pub(crate) fn push_nullable(&mut self, nullable: bool) { - self.inner.push_nullable(nullable) - } - - pub(crate) fn pop_nullable(&mut self) { - self.inner.pop_nullable() - } -} - -#[derive(Debug)] -pub struct FirstContext<'a> { - inner: &'a mut FlastContext, -} - -impl FirstContext<'_> { - pub fn depth(&self) -> usize { - self.inner.depth() - } - - pub fn is_guarded(&self, index: usize) -> Option<bool> { - self.inner.is_guarded(index) - } - - pub fn with_unguard<F: FnOnce(&mut Self) -> R, R>(&mut self, f: F) -> R { - self.unguard(); - let res = f(self); - self.guard(); - res - } - - pub(crate) fn unguard(&mut self) { - self.inner.unguard() - } - - pub(crate) fn guard(&mut self) { - self.inner.guard() - } - - pub fn first_set(&self, index: usize) -> Option<&FirstSet> { - self.inner.first_set(index) - } - - pub fn with_first_set<F: FnOnce(&mut Self) -> R, R>( - &mut self, - nullable: bool, - first_set: FirstSet, - f: F, - ) -> R { - self.push_first_set(nullable, first_set); - let res = f(self); - self.pop_first_set(); - res - } - - pub(crate) fn push_first_set(&mut self, nullable: bool, first_set: FirstSet) { - self.inner.push_first_set(nullable, first_set) - } - - pub(crate) fn pop_first_set(&mut self) { - self.inner.pop_first_set() - } - - pub fn as_null(&mut self) -> NullContext<'_> { - NullContext { inner: self.inner } - } -} - -#[derive(Debug, Default)] -pub struct FlastContext { - binds: Vec<(bool, FirstSet, FlastSet)>, - unguard_points: Vec<usize>, -} - -impl FlastContext { - pub fn new() -> Self { - Self::default() - } - - pub fn depth(&self) -> usize { - self.binds.len() - } - - pub fn is_guarded(&self, index: usize) -> Option<bool> { - if self.binds.len() <= index { - None - } else if self.unguard_points.is_empty() { - Some(true) - } else { - Some(self.unguard_points[self.unguard_points.len() - 1] + index < self.binds.len()) - } - } - - pub fn with_unguard<F: FnOnce(&mut Self) -> R, R>(&mut self, f: F) -> R { - self.unguard(); - let res = f(self); - self.guard(); - res - } - - pub(crate) fn unguard(&mut self) { - self.unguard_points.push(self.binds.len()); - } - - pub(crate) fn guard(&mut self) { - self.unguard_points.pop(); - } - - fn is_nullable(&self, index: usize) -> Option<bool> { - self.binds.get(self.binds.len() - index - 1).map(|(null, _, _)| *null) - } - - fn push_nullable(&mut self, nullable: bool) { - self.binds - .push((nullable, FirstSet::default(), FlastSet::default())) - } - - fn pop_nullable(&mut self) { - self.binds.pop(); - } - - fn first_set(&self, index: usize) -> Option<&FirstSet> { - self.binds.get(self.binds.len() - index - 1).map(|(_, first, _)| first) - } - - fn push_first_set(&mut self, nullable: bool, first_set: FirstSet) { - self.binds.push((nullable, first_set, FlastSet::default())) - } - - fn pop_first_set(&mut self) { - self.binds.pop(); - } - - pub fn flast_set(&self, index: usize) -> Option<&FlastSet> { - self.binds.get(self.binds.len() - index - 1).map(|(_, _, flast)| flast) - } - - pub fn with_flast_set<F: FnOnce(&mut Self) -> R, R>( - &mut self, - nullable: bool, - first_set: FirstSet, - flast_set: FlastSet, - f: F, - ) -> R { - self.push_flast_set(nullable, first_set, flast_set); - let res = f(self); - self.pop_flast_set(); - res - } - - pub(crate) fn push_flast_set(&mut self, nullable: bool, first_set: FirstSet, flast_set: FlastSet) { - self.binds.push((nullable, first_set, flast_set)); - } - - pub(crate) fn pop_flast_set(&mut self) { - self.binds.pop(); - } - - pub fn as_first(&mut self) -> FirstContext<'_> { - FirstContext { inner: self } - } - - pub fn as_null(&mut self) -> NullContext<'_> { - NullContext { inner: self } - } -} |