diff --git a/CanonSharp.Parser/CanonSharp.Parser.fsproj b/CanonSharp.Parser/CanonSharp.Parser.fsproj
index b53f1b2..defded5 100644
--- a/CanonSharp.Parser/CanonSharp.Parser.fsproj
+++ b/CanonSharp.Parser/CanonSharp.Parser.fsproj
@@ -5,4 +5,9 @@
true
+
+
+
+
+
diff --git a/CanonSharp.Parser/LexicalAnalyzer/NondeterministicFiniteAutomation.fs b/CanonSharp.Parser/LexicalAnalyzer/NondeterministicFiniteAutomation.fs
new file mode 100644
index 0000000..4e8150f
--- /dev/null
+++ b/CanonSharp.Parser/LexicalAnalyzer/NondeterministicFiniteAutomation.fs
@@ -0,0 +1,38 @@
+module CanonSharp.Parser.LexicalAnalyzer.NondeterministicFiniteAutomation
+
+open System
+open System.Collections.Generic
+open CanonSharp.Parser.LexicalAnalyzer.RegularExpression
+
+type NondeterministicState(id: Guid, transaction: Option -> list) =
+ member val id = id
+ member val transaction = transaction
+
+ override this.GetHashCode() = this.id.GetHashCode()
+
+ new() = NondeterministicState(Guid.NewGuid(), fun a -> list.Empty)
+
+
+type NondeterministicFiniteAutomation(states: HashSet, entryTransaction: Option -> list) =
+ member val states = states
+ member val entryTransaction = entryTransaction
+
+let convertEmptyToNonDeterministicFiniteAutomation (expression: EmptyExpression) =
+ let final = NondeterministicState()
+ let transaction (a: Option) =
+ match a with
+ | Some _ -> list.Empty
+ | None -> [final]
+
+ let states = HashSet()
+ let _ = states.Add(final)
+
+ NondeterministicFiniteAutomation(states, transaction)
+
+
+
+
+
+let convertToNondeterministicFiniteAutomation expression: RegularExpression =
+ match expression with
+ | EmptyExpression ->
diff --git a/CanonSharp.Parser/LexicalAnalyzer/RegularExpression.fs b/CanonSharp.Parser/LexicalAnalyzer/RegularExpression.fs
new file mode 100644
index 0000000..2bc366f
--- /dev/null
+++ b/CanonSharp.Parser/LexicalAnalyzer/RegularExpression.fs
@@ -0,0 +1,12 @@
+module CanonSharp.Parser.LexicalAnalyzer.RegularExpression
+
+type RegularExpression =
+ | EmptyExpression
+ | SymbolExpression of symbol: char
+ | AlternationExpression of left: RegularExpression * right : RegularExpression
+ | ConcatenationExpression of first: RegularExpression * second : RegularExpression
+ | KleeneExpression of expression: RegularExpression
+
+let convertToNondeterministicFiniteAutomation expression =
+ match expression with
+ | EmptyExpression emptyExpression ->