protected Tuple <Token <T>, Token <T>, Token <T> > BasicTypedShakerFunction( Token <T> target, TypedShakeCondition <T> cond, TypedShakeSelector <T> selector) { Func <TypedSegment, Token <T>, int> getRest = (seg, hunk) => (hunk.Length - (seg.Start + seg.Length)); Func <TypedSegment, int> getComputedStart = (seg) => seg.Start + seg.Length; TypedSegment result = cond(target); if (result == null) { return(new Tuple <Token <T>, Token <T>, Token <T> >(null, null, target)); } else { TypedSegment restSection = new TypedSegment(getRest(result, target), string.Empty, getComputedStart(result)); var matchTokens = selector(result, target); var before = matchTokens.Item1; var match = matchTokens.Item2; match.IsBig = false; var restTokens = selector(restSection, target); var rest = restTokens.Item2; rest.IsBig = true; return(new Tuple <Token <T>, Token <T>, Token <T> >(before, match, rest)); } }
public static TypedShakeCondition <string> GenerateMultiCharacterTypedCond(string lookingFor, string type) { return(GenerateTypedCond <string>((val, ind, len) => { int v = val.IndexOf(lookingFor); bool result = v != -1; TypedSegment target = new TypedSegment(lookingFor.Length, type, v); return new Tuple <bool, TypedSegment>(result, target); })); }
public static Tuple <Token <T>, Token <T> > DefaultTypedSelector <T>(TypedSegment seg, Token <T> hunk, Func <T, TypedSegment, Token <T>, T> transform) { int offset = hunk.Start; if (seg.Start == 0) { var value = new Tuple <Token <T>, Token <T> >( null, new Token <T>(transform(hunk.Value, seg, hunk), seg.Type, seg.Length, seg.Start + offset, true)); return(value); } else { var value = new Tuple <Token <T>, Token <T> >( new Token <T>(transform(hunk.Value, new TypedSegment(seg.Start, string.Empty), hunk), string.Empty, seg.Start, offset), //forward new Token <T>(transform(hunk.Value, seg, hunk), seg.Type, seg.Length, seg.Start + offset, true)); //match return(value); } }
public override bool Equals(object other) { TypedSegment seg = (TypedSegment)other; return(seg.Type.Equals(Type) && base.Equals(other)); }
public TypedSegment(TypedSegment seg) : base(seg) { Type = seg.Type; }
public static Tuple <Token <string>, Token <string> > DefaultTypedStringSelector(TypedSegment seg, Token <string> tok) { return(DefaultTypedSelector <string>(seg, tok, (x, y, z) => x.Substring(y.Start, y.Length))); }
public TypedSegment(TypedSegment seg) : base(seg) { Type = seg.Type; }