71 lines
2.1 KiB
Go
71 lines
2.1 KiB
Go
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 <nil>
|
|
// abcd <nil>
|
|
// <nil> unexpected character 'a' (expected abcd)
|
|
// <nil> 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
|
|
}
|