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