Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/onurakkaya/nfa-to-dfa-conversion
FlyWeight Finite Automata Simulator
https://github.com/onurakkaya/nfa-to-dfa-conversion
automata automata-machines-simulator automata-simulator automata-theory automatas csharp dfa dfa-construction dfa-minimization dotnet-core finite-state finite-state-automata finite-state-automaton finite-state-machine netcore netcore3 netcore31 nfa nfa-to-dfa-conversion nfa2dfa
Last synced: about 2 months ago
JSON representation
FlyWeight Finite Automata Simulator
- Host: GitHub
- URL: https://github.com/onurakkaya/nfa-to-dfa-conversion
- Owner: onurakkaya
- License: mit
- Created: 2020-04-14T17:26:36.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2023-11-11T06:11:08.000Z (over 1 year ago)
- Last Synced: 2023-11-11T07:22:46.828Z (over 1 year ago)
- Topics: automata, automata-machines-simulator, automata-simulator, automata-theory, automatas, csharp, dfa, dfa-construction, dfa-minimization, dotnet-core, finite-state, finite-state-automata, finite-state-automaton, finite-state-machine, netcore, netcore3, netcore31, nfa, nfa-to-dfa-conversion, nfa2dfa
- Language: C#
- Size: 70.3 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# nfa-to-dfa-conversion
FlyWeight Finite Automata Simulator.## Objects
### FAState
The object used to operate States of the Automata.
#### Constructor
Has just one constructor. The constructor takes StateName, InitialState and Final State parameters. StateName is required parameter. InitialState and FinalState is optional and default values of they are False.#### Properties
- **IsInitialState:** Read only property. Returns is this state marked as inital state or not.
- **IsFinalState:** Read only property. Returns is this state marked as final state or not.
- **StateName:** Read only property. Returns the name of the state.#### Methods
No method defined yet.### FATransition
The object used to operate Transitions of the Automata.
#### Constructor
Has two constructors. The difference, one the constructor takes only one destination state, the other one is takes `IEnumerable` destination state. Constructor parameters are TransitionSymbol, FromState, ToState. All parameters are required.
#### Properties- **TransitionSymbol:** Read only property. Returns the transition symbol.
- **FromState:** Read only property. Returns source state as `FAState` object.
- **ToState:** Read only property. Returns destination states as `IEnumerable` object.
- **Direction:** Returns the transition direction is Left(false/0) or Right(true/1). (Added for 2DFA support).
#### Methods
- **CompareTo :** Compares states with another state.If there are equal that will be return 0, otherwise wiil be return -1
-
### FiniteAutomata
Finite Automata Object can operate DFA or NFA automats.#### Constructor
Has one constructor. It takes AutomataType and Alphabet parameters. All parameters are required.#### Properties
- **InitialState:** Read only property. Returns the initial state of the automata as `FAState` object.
- **FinalState:** Read only property. Returns the final states of the automata as `IEnumerable` object.
- **States:** Read only property. Returns the all of the states of the automata as `IEnumerable` object.
- **Transitions:** Read only property. Returns the all of the transition declarations of the automata as `IEnumerable` object.
- **AutomataType:** Read only property. Returns the automata type of the automata as `FiniteAutomataType`. Can only takes DFA or NFA.
- **Alphabet:** Read only property. Returns the alphabet of the automata as `IEnumerable` object.
- **IsValid:** Read only property. Returns the current automata model is valid or invalid.
-
#### Methods
- **AddState:** Creates new state to the automata. Returns the result of add operation is success or fail.
- **UpdateState:** Updates the state of the automata. Returns the result of update operation is success or fail.
- **AddTransition:** Creates new transition link between states. Returns the result of add operation is success or fail.
- **Run:** Runs the finite automata with input, then returns true if input is accepted.
### FiniteAutomataConverter
#### Constructor
There is no specific constructor declaration yet.
#### Properties
No property defined yet.
#### Methods
- **ConvertNFAToDFA:** Converts NFA input to DFA. Returns DFA AS `FiniteAutomata` object.
- **Convert2DFAToDFA:** Converts 2DFA input to DFA. Returns DFA AS `FiniteAutomata` object.
## Usage
### Sample DFA Build[![](https://mermaid.ink/img/eyJjb2RlIjoic3RhdGVEaWFncmFtXG5bKl0gLS0-IHEwXG4gIHEwIC0tPiBxMTogYVxuICBxMCAtLT4gcTI6IGJcbiAgcTAgLS0-IHEwOiBjXG4gIHExIC0tPiBxMDogYVxuICBxMSAtLT4gcTE6IGJcbiAgcTEgLS0-IHEyOiBjXG4gIHEyIC0tPiBxMDogYVxuICBxMiAtLT4gcTI6IGIgLGNcbiAgcTIgLS0-IFsqXSIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoic3RhdGVEaWFncmFtXG5bKl0gLS0-IHEwXG4gIHEwIC0tPiBxMTogYVxuICBxMCAtLT4gcTI6IGJcbiAgcTAgLS0-IHEwOiBjXG4gIHExIC0tPiBxMDogYVxuICBxMSAtLT4gcTE6IGJcbiAgcTEgLS0-IHEyOiBjXG4gIHEyIC0tPiBxMDogYVxuICBxMiAtLT4gcTI6IGIgLGNcbiAgcTIgLS0-IFsqXSIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In0sInVwZGF0ZUVkaXRvciI6ZmFsc2V9)
```
// Alphabet of the automata is a, b and c.
List alphabet = new List { 'a', 'b', 'c' };
FiniteAutomata dfaTest = new FiniteAutomata(FiniteAutomataType.DFA, alphabet);_ = dfaTest.AddState(true); // Uses default naming convention.So q0 state created.
_ = dfaTest.AddState(); // Uses default naming convention.So q1 state created.
_ = dfaTest.AddState(isFinalState: true); // Uses default naming convention.So q2 state created._ = dfaTest.AddTransition('a', "q0", "q1"); // Declaration: q0, transits to q1 with 'a' transition.
_ = dfaTest.AddTransition('b', "q0", "q2"); // Declaration: q0, transits to q2 with 'b' transition.
_ = dfaTest.AddTransition('c', "q0", "q0"); // Declaration: q0, transits to q0 with 'c' transition.
_ = dfaTest.AddTransition('a', "q1", "q0"); // Declaration: q1, transits to q0 with 'a' transition.
_ = dfaTest.AddTransition('b', "q1", "q1"); // Declaration: q1, transits to q1 with 'b' transition.
_ = dfaTest.AddTransition('c', "q1", "q2"); // Declaration: q1, transits to q2 with 'c' transition._ = dfaTest.AddTransition('a', "q2", "q0"); // Declaration: q0, transits to q2 with 'a' transition.
_ = dfaTest.AddTransition('b', "q2", "q2"); // Declaration: q2, transits to q2b with 'b' transition.
_ = dfaTest.AddTransition('c', "q2", "q2"); // Declaration: q2, transits to q2 with 'c' transition.
```### Sample NFA Build
[![](https://mermaid.ink/img/eyJjb2RlIjoic3RhdGVEaWFncmFtXG4gIFsqXSAtLT4gQVxuICBBIC0tPiBBOiAwXG4gIEEgLS0-IEI6IDFcbiAgQSAtLT4gQzogMVxuICBCIC0tPiBCOiAwXG4gIEIgLS0-IEE6IDFcbiAgQiAtLT4gQzogMVxuICBDIC0tPiBBOiAwXG4gIEMgLS0-IEI6IDBcbiAgQyAtLT4gQzogMVxuICBDIC0tPiBbKl0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9LCJ1cGRhdGVFZGl0b3IiOmZhbHNlfQ)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoic3RhdGVEaWFncmFtXG4gIFsqXSAtLT4gQVxuICBBIC0tPiBBOiAwXG4gIEEgLS0-IEI6IDFcbiAgQSAtLT4gQzogMVxuICBCIC0tPiBCOiAwXG4gIEIgLS0-IEE6IDFcbiAgQiAtLT4gQzogMVxuICBDIC0tPiBBOiAwXG4gIEMgLS0-IEI6IDBcbiAgQyAtLT4gQzogMVxuICBDIC0tPiBbKl0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9LCJ1cGRhdGVFZGl0b3IiOmZhbHNlfQ)
```
private static FiniteAutomata NFABuilder()
{
// Alphabet of the automata is 0 and 1.
List alphabet = new List { '0', '1' };
// Create new Automata NFA with Alphabet above.
FiniteAutomata nfaTest = new FiniteAutomata(FiniteAutomataType.NFA, alphabet);_ = nfaTest.AddState("A", isInitialState: true); // A state created.
_ = nfaTest.AddState("B"); // B state created.
_ = nfaTest.AddState("C", isFinalState: true); // C state created._ = nfaTest.AddTransition('0', "A", "A"); // Declaration: A, transits to A with '0' transition.
_ = nfaTest.AddTransition('1', "A", "B,C"); // Declaration: A, transits to B or C with '1' transition._ = nfaTest.AddTransition('0', "B", "B"); // Declaration: B, transits to B with '0' transition.
_ = nfaTest.AddTransition('1', "B", "A,C"); // Declaration: B, transits to A or C with '1' transition.
_ = nfaTest.AddTransition('0', "C", "A,B"); // Declaration: C, transits to A or B with '0' transition.
_ = nfaTest.AddTransition('1', "C", "C"); // Declaration: C, transits to C with '1' transition.
return nfaTest;
```
Don't forget check automata with IsValid property. :)FiniteAutomata automata = NFABuilder();
if (automata.IsValid)
{
// Some codes
}You can run input on the automata with Run method.
**Note:** Run method contains IsValid check, so you don't need additionally check that.FiniteAutomata automata = NFABuilder();
bool result = automata.Run(inputString);You can convert your NFA to DFA easily.
FiniteAutomata automata = NFABuilder();
FiniteAutomataConverter dfaConverter = new FiniteAutomataConverter();
FiniteAutomata ConvertedAutomata = dfaConverter.ConvertNFAToDFA(automata);## Benchmarks
### Some test results:[Time To Completion] NFA Creation: 57 ms
[Time To Completion] NFA Validation: 0 ms
[Time To Completion] NFA Run: 35 ms
[Time To Completion] Automata Conversion: 16 ms
[Time To Completion] DFA Validation: 1 ms
[Time To Completion] DFA Run: 28 ms