private RxNode <TLetter> ComputeRx() { var regex = default(RxNode <TLetter>); using (var enumerator = this.tokens.Values.GetEnumerator()) { if (!enumerator.MoveNext()) { throw new InvalidOperationException("No terminals have been defined"); } regex = enumerator.Current; while (enumerator.MoveNext()) { regex = new RxAlternation <TLetter>(enumerator.Current, regex); } } return(regex); }
public RxNode <LetterId> Alternation(RxAlternation <TLetter> node, Func <RxMatch <TLetter>, ICollection <LetterId> > context) { return(new RxAlternation <LetterId>(node.Left.Visit(this, context), node.Right.Visit(this, context))); }
NfaState <TLetter> IRegexVisitor <TLetter, NfaState <TLetter>, NfaState <TLetter> > .Alternation(RxAlternation <TLetter> node, NfaState <TLetter> context) { var left = this.Create(); context.AddEpsilonTransition(left); var right = this.Create(); context.AddEpsilonTransition(right); var target = this.Create(); node.Left.Visit(this, left).AddEpsilonTransition(target); node.Right.Visit(this, right).AddEpsilonTransition(target); return(target); }
public object Alternation(RxAlternation <TLetter> node, Func <RangeSet <TLetter>, object, RangeSet <TLetter> > context) { node.Left.Visit(this, context); node.Right.Visit(this, context); return(null); }
RxNode <TLetter> IRegexVisitor <TLetter, SymbolId, RxNode <TLetter> > .Alternation(RxAlternation <TLetter> node, SymbolId context) { return(node.Left.Visit(this, context) ?? node.Right.Visit(this, context)); }