package parsekit_test import ( "fmt" "git.makaay.nl/mauricem/go-parsekit" ) func ExampleTokenAPI_Fork() { // This custom TokenHandler checks for a sequence of runes: "abcd" // This is done in 4 steps and only after finishing all steps, // the TokenHandler will confirm a successful match. abcdSequence := func(t *parsekit.TokenAPI) bool { child := t.Fork() // fork, so we won't change parent t for _, checkRune := range "abcd" { readRune, err := child.NextRune() if err != nil || readRune != checkRune { return false // report mismatch, parent t is left untouched } child.Accept() // add rune to child output } child.Merge() // we have a match, add resulting output to parent return true // and report the successful match } // Note: a custom TokenHandler is normally not what you need. // You can make use of the parser/combinator tooling to do things // a lot simpler. The handler from above can be replaced with: simpler := parsekit.A.Str("abcd") result, err := parsekit.NewTokenizer(abcdSequence, "abcd").Execute("abcdefgh") fmt.Println(result, err) result, err = parsekit.NewTokenizer(simpler, "abcd").Execute("abcdefgh") fmt.Println(result, err) result, err = parsekit.NewTokenizer(abcdSequence, "abcd").Execute("abcx") fmt.Println(result, err) result, err = parsekit.NewTokenizer(abcdSequence, "abcd").Execute("xyz") fmt.Println(result, err) // Output: // abcd // abcd // unexpected character 'a' (expected abcd) // unexpected character 'x' (expected abcd) } func ExampleTokenAPI_Merge() { tokenHandler := func(t *parsekit.TokenAPI) bool { child1 := t.Fork() child1.NextRune() // reads 'H' child1.Accept() child1.NextRune() // reads 'i' child1.Accept() child2 := child1.Fork() child2.NextRune() // reads ' ' child2.Accept() child2.NextRune() // reads 'd' child2.Accept() child1.Merge() // We merge child1, which has read 'H' and 'i' only. return true } result, _ := parsekit.NewTokenizer(tokenHandler, "a match").Execute("Hi mister X!") fmt.Println(result) // Output: // Hi }