go-parsekit/tokenapi_example_test.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
}