public void AddFirst(DotItem item, MutableIntSet output) { bool isNullable = tables.AddFirst(item.GetPattern(), item.Position, output); if (isNullable) { output.AddAll(item.LA); } }
public DotTransition(MutableIntSet tokens, DotState to) { this.Tokens = tokens; this.To = to; }
/// <summary> /// Firsts set of the token chain /// </summary> /// <param name="tokenChain"></param> /// <param name="output"></param> /// <returns><c>true</c> if chain is nullable, <c>false</c> otherwise</returns> public bool AddFirst(int[] tokenChain, int startIndex, MutableIntSet output) { bool result = true; while (startIndex != tokenChain.Length) { int token = tokenChain[startIndex]; output.AddAll(firsts[token]); if (!isNullable[token]) { result = false; break; } ++startIndex; } return result; }
// Fill FIRST set for the chain of tokens. // Returns true if anything was added, false otherwise. private bool InternalAddFirsts(IEnumerable<int> chain, MutableIntSet result) { bool changed = false; bool nullable = true; foreach (int item in chain) { bool itemNullable = false; foreach (var f in firsts[item].ToArray()) { if (f == PredefinedTokens.Epsilon) { itemNullable = true; // current part is nullable continue; } if (!result.Contains(f)) { result.Add(f); changed = true; } } if (!itemNullable) { nullable = false; break; } } if (nullable && !result.Contains(PredefinedTokens.Epsilon)) { result.Add(PredefinedTokens.Epsilon); changed = true; } return changed; }
public TdfaTransition(int from, MutableIntSet symbols, int to) { From = from; Symbols = symbols; To = to; }