public RegularToDfaAlgorithm(RegularTree regTree, IRegularAlphabet alphabet) { this.alphabet = alphabet; data = new TdfaData(alphabet); data.AddState(new TdfaState(data) { Positions = regTree.FirstPos }); foreach (var st in data.EnumerateStates()) { int Sindex = st.Index; var S = st.Positions; if (S.Contains(regTree.EoiPosition)) { data.GetState(Sindex).IsAccepting = true; } var actionPosList = new SortedList <int, int>(); foreach (var position in S) { var action = regTree.GetPosAction(position); if (action.HasValue) { actionPosList[position] = action.Value; } } if (actionPosList.Count != 0) { st.Actions.AddRange(actionPosList.Values); } var transitionSymbols = alphabet.SymbolSetType.Union( st.Positions .Select(regTree.GetPosSymbols) .Select(alphabet.Encode)); foreach (var symbol in transitionSymbols) { if (symbol == alphabet.EoiSymbol) { continue; } var U = TdfaData.PositionSetType.Mutable(); foreach (var position in S) { var cset = alphabet.Encode(regTree.GetPosSymbols(position)); if (cset.Contains(symbol)) { U.AddAll(regTree.GetFollowPos(position)); } } if (!U.IsEmpty) { int Uindex = data.IndexOfState(U); if (Uindex < 0) { Uindex = data.AddState(new TdfaState(data) { Positions = U }); } data.AddTransition(from: Sindex, symbol: symbol, to: Uindex); } } } }
public RegularToDfaAlgorithm(RegularTree regTree, IRegularAlphabet alphabet) { this.alphabet = alphabet; data = new TdfaData(alphabet); data.AddState(new TdfaState(data) { Positions = regTree.FirstPos }); foreach (var st in data.EnumerateStates()) { int Sindex = st.Index; var S = st.Positions; if (S.Contains(regTree.EoiPosition)) { data.GetState(Sindex).IsAccepting = true; } var actionPosList = new SortedList<int, int>(); foreach (var position in S) { var action = regTree.GetPosAction(position); if (action.HasValue) { actionPosList[position] = action.Value; } } if (actionPosList.Count != 0) { st.Actions.AddRange(actionPosList.Values); } var transitionSymbols = alphabet.SymbolSetType.Union( st.Positions .Select(regTree.GetPosSymbols) .Select(alphabet.Encode)); foreach (var symbol in transitionSymbols) { if (symbol == alphabet.EoiSymbol) { continue; } var U = TdfaData.PositionSetType.Mutable(); foreach (var position in S) { var cset = alphabet.Encode(regTree.GetPosSymbols(position)); if (cset.Contains(symbol)) { U.AddAll(regTree.GetFollowPos(position)); } } if (!U.IsEmpty) { int Uindex = data.IndexOfState(U); if (Uindex < 0) { Uindex = data.AddState(new TdfaState(data) { Positions = U }); } data.AddTransition(from: Sindex, symbol: symbol, to: Uindex); } } } }