From 9dcef68d82cacda1ec74ba698976b9e8a8c2b2a3 Mon Sep 17 00:00:00 2001 From: Parker TenBroeck <51721964+ParkerTenBroeck@users.noreply.github.com> Date: Fri, 9 Jan 2026 23:23:58 -0500 Subject: [PATCH] fixed final state parsing for FA, made FA transitions more visually appealing, supported identifiers starting with a numeric character --- automata/src/automatan/fa.rs | 4 ++-- automata/src/loader/lexer.rs | 2 +- web/root/src/visualizer.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/automata/src/automatan/fa.rs b/automata/src/automatan/fa.rs index d52354f..e5fb674 100644 --- a/automata/src/automatan/fa.rs +++ b/automata/src/automatan/fa.rs @@ -111,7 +111,7 @@ impl<'a> Fa<'a> { } } TL::Item(S("F", _), list) => { - if final_states.is_empty() { + if !final_states.is_empty() { ctx.emit_error("final states already set", span); } let Some(list) = list.expect_set(ctx) else { @@ -124,7 +124,7 @@ impl<'a> Fa<'a> { if states.contains_key(&State(ident)) { if final_states .insert(State(ident), StateInfo { definition: item.1 }) - .is_none() + .is_some() { ctx.emit_error("final state redefined", item.1); } diff --git a/automata/src/loader/lexer.rs b/automata/src/loader/lexer.rs index fbb9d67..4023531 100644 --- a/automata/src/loader/lexer.rs +++ b/automata/src/loader/lexer.rs @@ -92,7 +92,7 @@ impl<'a> Lexer<'a> { } fn begin_ident(c: char) -> bool { - c.is_alphabetic() || c == '_' || (!c.is_ascii() && !c.is_control() && !c.is_whitespace()) + c.is_alphanumeric() || c == '_' || (!c.is_ascii() && !c.is_control() && !c.is_whitespace()) } fn continue_ident(c: char) -> bool { diff --git a/web/root/src/visualizer.ts b/web/root/src/visualizer.ts index 1954d6b..a6ca14b 100644 --- a/web/root/src/visualizer.ts +++ b/web/root/src/visualizer.ts @@ -160,7 +160,7 @@ export function setAutomaton(auto: Machine) { font, from: to_from[0], to: to_from[1], - label: transitions.map(i => i.repr).join("\n"), + label: transitions.map(i => i.repr).join(auto.type=="fa"?",":"\n"), }); } else { edges.add({ @@ -168,7 +168,7 @@ export function setAutomaton(auto: Machine) { font, from: to_from[0], to: to_from[1], - label: transitions.map(i => i.repr).join("\n"), + label: transitions.map(i => i.repr).join(auto.type=="fa"?",":"\n"), }); } }