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:
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 {