mirror of https://github.com/mono/CppSharp.git
115 changed files with 4017 additions and 3895 deletions
@ -1,20 +1,25 @@
@@ -1,20 +1,25 @@
|
||||
using System; |
||||
|
||||
namespace CppSharp.Utils.FSM{ |
||||
public class ConsoleWriter{ |
||||
public static void Failure(string message){ |
||||
Console.ForegroundColor = ConsoleColor.DarkRed; |
||||
Write(message); |
||||
} |
||||
namespace CppSharp.Utils.FSM |
||||
{ |
||||
public class ConsoleWriter |
||||
{ |
||||
public static void Failure(string message) |
||||
{ |
||||
Console.ForegroundColor = ConsoleColor.DarkRed; |
||||
Write(message); |
||||
} |
||||
|
||||
public static void Success(string message){ |
||||
Console.ForegroundColor = ConsoleColor.DarkGreen; |
||||
Write(message); |
||||
} |
||||
public static void Success(string message) |
||||
{ |
||||
Console.ForegroundColor = ConsoleColor.DarkGreen; |
||||
Write(message); |
||||
} |
||||
|
||||
private static void Write(string message){ |
||||
Console.WriteLine(message); |
||||
Console.ResetColor(); |
||||
} |
||||
} |
||||
private static void Write(string message) |
||||
{ |
||||
Console.WriteLine(message); |
||||
Console.ResetColor(); |
||||
} |
||||
} |
||||
} |
||||
|
@ -1,71 +1,83 @@
@@ -1,71 +1,83 @@
|
||||
using System.Collections.Generic; |
||||
using System.Linq; |
||||
|
||||
namespace CppSharp.Utils.FSM{ |
||||
internal class Minimize{ |
||||
public static DFSM MinimizeDFSM(DFSM fsm){ |
||||
var reversedNDFSM = Reverse(fsm); |
||||
var reversedDFSM = PowersetConstruction(reversedNDFSM); |
||||
var NDFSM = Reverse(reversedDFSM); |
||||
return PowersetConstruction(NDFSM); |
||||
} |
||||
namespace CppSharp.Utils.FSM |
||||
{ |
||||
internal class Minimize |
||||
{ |
||||
public static DFSM MinimizeDFSM(DFSM fsm) |
||||
{ |
||||
var reversedNDFSM = Reverse(fsm); |
||||
var reversedDFSM = PowersetConstruction(reversedNDFSM); |
||||
var NDFSM = Reverse(reversedDFSM); |
||||
return PowersetConstruction(NDFSM); |
||||
} |
||||
|
||||
private static NDFSM Reverse(DFSM d){ |
||||
var delta = new List<Transition>(); |
||||
foreach (var transition in d.Delta){ |
||||
delta.Add(new Transition(transition.EndState, transition.Symbol, transition.StartState)); |
||||
} |
||||
return new NDFSM(d.Q, d.Sigma, delta, d.F, d.Q0); |
||||
} |
||||
private static NDFSM Reverse(DFSM d) |
||||
{ |
||||
var delta = new List<Transition>(); |
||||
foreach (var transition in d.Delta) |
||||
{ |
||||
delta.Add(new Transition(transition.EndState, transition.Symbol, transition.StartState)); |
||||
} |
||||
return new NDFSM(d.Q, d.Sigma, delta, d.F, d.Q0); |
||||
} |
||||
|
||||
public static DFSM PowersetConstruction(NDFSM ndfsm){ |
||||
var Q = new List<string>(); |
||||
var Sigma = ndfsm.Sigma.ToList(); |
||||
var Delta = new List<Transition>(); |
||||
var Q0 = new List<string> { string.Join(" ", ndfsm.Q0) }; |
||||
var F = new List<string>(); |
||||
public static DFSM PowersetConstruction(NDFSM ndfsm) |
||||
{ |
||||
var Q = new List<string>(); |
||||
var Sigma = ndfsm.Sigma.ToList(); |
||||
var Delta = new List<Transition>(); |
||||
var Q0 = new List<string> { string.Join(" ", ndfsm.Q0) }; |
||||
var F = new List<string>(); |
||||
|
||||
var processed = new List<string>(); |
||||
var queue = new Queue<string>(); |
||||
queue.Enqueue(string.Join(",", ndfsm.Q0)); |
||||
var processed = new List<string>(); |
||||
var queue = new Queue<string>(); |
||||
queue.Enqueue(string.Join(",", ndfsm.Q0)); |
||||
|
||||
while (queue.Count > 0){ |
||||
var setState = queue.Dequeue(); |
||||
processed.Add(setState); |
||||
Q.Add(CleanupState(setState)); |
||||
while (queue.Count > 0) |
||||
{ |
||||
var setState = queue.Dequeue(); |
||||
processed.Add(setState); |
||||
Q.Add(CleanupState(setState)); |
||||
|
||||
var statesInCurrentSetState = setState.Split(',').ToList(); |
||||
foreach (var state in statesInCurrentSetState){ |
||||
if (ndfsm.F.Contains(state)){ |
||||
F.Add(CleanupState(setState)); |
||||
break; |
||||
} |
||||
} |
||||
var symbols = ndfsm.Delta |
||||
.Where(t => statesInCurrentSetState.Contains(t.StartState)) |
||||
.Select(t => t.Symbol) |
||||
.Distinct(); |
||||
foreach (var symbol in symbols){ |
||||
var reachableStates = |
||||
ndfsm.Delta |
||||
.Where(t => t.Symbol == symbol && |
||||
statesInCurrentSetState.Contains(t.StartState)) |
||||
.OrderBy(t => t.EndState). |
||||
Select(t => t.EndState); |
||||
var reachableSetState = string.Join(",", reachableStates); |
||||
var statesInCurrentSetState = setState.Split(',').ToList(); |
||||
foreach (var state in statesInCurrentSetState) |
||||
{ |
||||
if (ndfsm.F.Contains(state)) |
||||
{ |
||||
F.Add(CleanupState(setState)); |
||||
break; |
||||
} |
||||
} |
||||
var symbols = ndfsm.Delta |
||||
.Where(t => statesInCurrentSetState.Contains(t.StartState)) |
||||
.Select(t => t.Symbol) |
||||
.Distinct(); |
||||
foreach (var symbol in symbols) |
||||
{ |
||||
var reachableStates = |
||||
ndfsm.Delta |
||||
.Where(t => t.Symbol == symbol && |
||||
statesInCurrentSetState.Contains(t.StartState)) |
||||
.OrderBy(t => t.EndState). |
||||
Select(t => t.EndState); |
||||
var reachableSetState = string.Join(",", reachableStates); |
||||
|
||||
Delta.Add(new Transition(CleanupState(setState), symbol, CleanupState(reachableSetState))); |
||||
Delta.Add(new Transition(CleanupState(setState), symbol, CleanupState(reachableSetState))); |
||||
|
||||
if (!processed.Contains(reachableSetState)){ |
||||
queue.Enqueue(reachableSetState); |
||||
} |
||||
if (!processed.Contains(reachableSetState)) |
||||
{ |
||||
queue.Enqueue(reachableSetState); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return new DFSM(Q, Sigma, Delta, Q0, F); |
||||
} |
||||
return new DFSM(Q, Sigma, Delta, Q0, F); |
||||
} |
||||
|
||||
private static string CleanupState(string state){ |
||||
return state.Replace(",", " "); |
||||
} |
||||
} |
||||
private static string CleanupState(string state) |
||||
{ |
||||
return state.Replace(",", " "); |
||||
} |
||||
} |
||||
} |
@ -1,21 +1,24 @@
@@ -1,21 +1,24 @@
|
||||
using System.Collections.Generic; |
||||
|
||||
namespace CppSharp.Utils.FSM{ |
||||
internal class Program{ |
||||
private static void Main(string[] args){ |
||||
var Q = new List<string>{"q0", "q1"}; |
||||
var Sigma = new List<char>{'0', '1'}; |
||||
var Delta = new List<Transition>{ |
||||
namespace CppSharp.Utils.FSM |
||||
{ |
||||
internal class Program |
||||
{ |
||||
private static void Main(string[] args) |
||||
{ |
||||
var Q = new List<string> { "q0", "q1" }; |
||||
var Sigma = new List<char> { '0', '1' }; |
||||
var Delta = new List<Transition>{ |
||||
new Transition("q0", '0', "q0"), |
||||
new Transition("q0", '1', "q1"), |
||||
new Transition("q1", '1', "q1"), |
||||
new Transition("q1", '0', "q0") |
||||
}; |
||||
var Q0 = new List<string>{"q0"}; |
||||
var F = new List<string>{"q0", "q1"}; |
||||
var DFSM = new DFSM(Q, Sigma, Delta, Q0, F); |
||||
var Q0 = new List<string> { "q0" }; |
||||
var F = new List<string> { "q0", "q1" }; |
||||
var DFSM = new DFSM(Q, Sigma, Delta, Q0, F); |
||||
|
||||
var minimizedDFSM = Minimize.MinimizeDFSM(DFSM); |
||||
} |
||||
} |
||||
var minimizedDFSM = Minimize.MinimizeDFSM(DFSM); |
||||
} |
||||
} |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue