-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEstados.cs
109 lines (105 loc) · 4.31 KB
/
Estados.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using LFA_Proyecto.Help;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LFA_Proyecto.Modelos;
namespace LFA_Proyecto.Arbol
{
class Estados
{
private Dictionary<List<int>, Dictionary<string, List<int>>> TablaEstados = new Dictionary<List<int>, Dictionary<string, List<int>>>();
private Dictionary<int, List<int>> Follows;
private ArbolB miArbol;
private List<string> TerminalesArbol = new List<string>();
private List<string> Terminales = new List<string>();
public Estados(Dictionary<int, List<int>> follows, ArbolB miArbol, List<Datos.AllData> simbolosTerminales)
{
Follows = follows;
this.miArbol = miArbol;
GetNodos(simbolosTerminales);
}
public void GetNodos(List<Datos.AllData> ST)
{
foreach (var item in ST)
{
if (!Utilities.Ter.Contains(item.StringData))
{
this.TerminalesArbol.Add(item.StringData);
}
}
foreach (var item in TerminalesArbol)
{
if (!Terminales.Contains(item) && item != "#")
{
Terminales.Add(item);
Datos.Instance.SimbolosTotales.Add(item);
}
}
}
public Dictionary<List<int>, Dictionary<string, List<int>>> CrearEstados(ArbolB Arbol)
{
Queue<List<int>> EstadosAprobar = new Queue<List<int>>();
List<List<int>> EstadosHistorial = new List<List<int>>();
var diccModificar = new Dictionary<string, List<int>>();
var EstadoInicial = Arbol.First;
EstadosHistorial.Add(EstadoInicial);
foreach (var Simbolo in Terminales)
{
var ListaConcordancia = new List<int>();
var ListaFollows = new List<int>();
foreach (var item in EstadoInicial)
{
var SimbolosArbol = TerminalesArbol[item - 1];//Arbol
if (Simbolo == SimbolosArbol)
{
ListaConcordancia.Add(item);
}
}
foreach (var SimblosItem in ListaConcordancia)
{
Follows.TryGetValue(SimblosItem, out var follows);
ListaFollows.AddRange(follows);
}
diccModificar.Add(Simbolo, ListaFollows);
if (!EstadosAprobar.Any(c => c.SequenceEqual(ListaFollows)) && !EstadosHistorial.Any(c => c.SequenceEqual(ListaFollows)) && ListaFollows.Count != 0)
{
EstadosAprobar.Enqueue(ListaFollows);
}
}
TablaEstados.Add(EstadoInicial, diccModificar);
while (EstadosAprobar.Count() != 0)
{
var diccModificarNoInicial = new Dictionary<string, List<int>>();
var Estado = EstadosAprobar.Dequeue();
EstadosHistorial.Add(Estado);
foreach (var Simbolo in Terminales)
{
var ListaConcordancia = new List<int>();
var ListaFollows = new List<int>();
foreach (var item in Estado)
{
var SimbolosArbol = TerminalesArbol[item - 1];
if (Simbolo == SimbolosArbol)
{
ListaConcordancia.Add(item);
}
}
foreach (var SimblosItem in ListaConcordancia)
{
Follows.TryGetValue(SimblosItem, out var follows);
ListaFollows.AddRange(follows);
}
diccModificarNoInicial.Add(Simbolo, ListaFollows);
if (!EstadosAprobar.Any(c => c.SequenceEqual(ListaFollows)) && !EstadosHistorial.Any(c => c.SequenceEqual(ListaFollows)) && ListaFollows.Count != 0)
{
EstadosAprobar.Enqueue(ListaFollows);
}
}
TablaEstados.Add(Estado, diccModificarNoInicial);
}
return TablaEstados;
}
}
}