automaton

An automaton library written in Rust
Log | Files | Refs

commit 822ddeb51d020c593aec273138cbbf35842097f0
parent 013bd2e9723438a78cea692d71872a65a968a1ba
Author: Ethan Long <ethandavidlong@gmail.com>
Date:   Sun,  4 Feb 2024 01:16:36 +1100

Labelled some bugs. I will begin bugfixes tomorrow!

Diffstat:
Msrc/bin/regex.rs | 1+
Msrc/lib/regex.rs | 15++++++++++-----
2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/bin/regex.rs b/src/bin/regex.rs @@ -39,6 +39,7 @@ fn main() -> Result<(), Box<dyn Error>> { let input_string: String = args.get(2).map_or("".to_owned(), String::to_owned); let regex = Regex::parse(regex_str.as_str())?; + println!("Regex: {}", regex_str); println!("Running on the following input:\n{input_string}"); println!("Accepts: {}", regex.accepts(&input_string)); diff --git a/src/lib/regex.rs b/src/lib/regex.rs @@ -121,7 +121,7 @@ impl Regex { let mut groups: Vec<Vec<RegexNonTerminal>> = vec![]; groups.push(vec![]); - let mut in_an_or_group = false; + let mut in_a_union = false; let mut or_group: Vec<RegexNonTerminal> = vec![]; for token in regex_tokens.into_iter() { @@ -132,6 +132,7 @@ impl Regex { "Unable to get last group".to_owned(), ))? .push(RegexNonTerminal::Terminal(RegexTerminal::Character(c))), + // FIXME: Wildcards are borked! Either::Right(RegexToken::Wildcard) => groups .last_mut() .ok_or(RegexError::ParseError( @@ -139,11 +140,12 @@ impl Regex { ))? .push(RegexNonTerminal::Terminal(RegexTerminal::Wildcard)), + // FIXME: Parens are buggy! Either::Right(RegexToken::LeftGroup) => { groups.push(vec![]); } Either::Right(RegexToken::RightGroup) => { - if !in_an_or_group { + if !in_a_union { let exited_group = groups.pop().ok_or(RegexError::ParseError( "Unable to pop a group off".to_owned(), ))?; @@ -164,13 +166,14 @@ impl Regex { "Unable to get last group".to_owned(), ))? .push(RegexNonTerminal::Union(or_group)); - in_an_or_group = false; + in_a_union = false; or_group = vec![]; } } Either::Right(RegexToken::Bar) => { - in_an_or_group = true; + // FIXME: Unions are borked! + in_a_union = true; let exited_group = groups.pop().ok_or(RegexError::ParseError( "Unable to pop a group off".to_owned(), ))?; @@ -201,6 +204,7 @@ impl Regex { } Either::Right(RegexToken::KleeneStar) => { + // FIXME: KleeneStars are borked! let last_terminal = groups .last_mut() .ok_or(RegexError::ParseError( @@ -324,6 +328,7 @@ impl GraphENFA { kleene_group: Vec<RegexNonTerminal>, from: u64, ) -> Result<u64, GraphENFAError> { + // FIXME: KLEENE GROUPS ARE BORKED! let start_state = self.add_terminal(RegexTerminal::Epsilon, from)?; let end_state = self.new_state()?; self.insert_transition(start_state, end_state, None)?; @@ -342,7 +347,7 @@ impl GraphENFA { union: Vec<RegexNonTerminal>, from: u64, ) -> Result<u64, GraphENFAError> { - // TODO: Implement this + // FIXME: Unions are buggy, they are looking for the end of scope ')', but won't work as just something like a|b let start_state = self.add_terminal(RegexTerminal::Epsilon, from)?; let end_state = self.new_state()?; for nonterminal in union {