generate benchmark test to parse makefiles in testcases.

$ go generate
$ go test -bench .
diff --git a/parser.go b/parser.go
index d3c4c28..44b63e3 100644
--- a/parser.go
+++ b/parser.go
@@ -1,5 +1,10 @@
 package main
 
+//go:generate go run testcase/gen_testcase_parse_benchmark.go
+//
+// $ go generate
+// $ go test -bench .
+
 import (
 	"bufio"
 	"bytes"
diff --git a/testcase/gen_testcase_parse_benchmark.go b/testcase/gen_testcase_parse_benchmark.go
new file mode 100644
index 0000000..8c4a0e5
--- /dev/null
+++ b/testcase/gen_testcase_parse_benchmark.go
@@ -0,0 +1,86 @@
+// gen_testcase_parse_benchmark is a program to generate benchmark tests
+// for parsing testcases.
+//
+package main
+
+import (
+	"fmt"
+	"io"
+	"os"
+	"path/filepath"
+	"strings"
+	"text/template"
+)
+
+const preamble = `package main
+
+import (
+	"io/ioutil"
+	"testing"
+)
+
+`
+
+var tmpl = template.Must(template.New("benchmarktest").Parse(`
+
+func BenchmarkTestcaseParse{{.Name}}(b *testing.B) {
+	data, err := ioutil.ReadFile({{.Filename | printf "%q"}})
+	if err != nil {
+		b.Fatal(err)
+	}
+	mk := string(data)
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		ParseMakefileString(mk, {{.Filename | printf "%q"}}, 0)
+	}
+}
+`))
+
+func testName(fname string) string {
+	base := filepath.Base(fname)
+	i := strings.Index(base, ".")
+	if i >= 0 {
+		base = base[:i]
+	}
+	base = strings.Replace(base, "-", "", -1)
+	tn := strings.Title(base)
+	return tn
+}
+
+func writeBenchmarkTest(w io.Writer, fname string) {
+	name := testName(fname)
+	if strings.HasPrefix(name, "Err") {
+		return
+	}
+	err := tmpl.Execute(w, struct {
+		Name     string
+		Filename string
+	}{
+		Name:     testName(fname),
+		Filename: fname,
+	})
+	if err != nil {
+		panic(err)
+	}
+}
+
+func main() {
+	f, err := os.Create("testcase_benchmark_test.go")
+	if err != nil {
+		panic(err)
+	}
+	defer func() {
+		err := f.Close()
+		if err != nil {
+			panic(err)
+		}
+	}()
+	fmt.Fprint(f, preamble)
+	matches, err := filepath.Glob("testcase/*.mk")
+	if err != nil {
+		panic(err)
+	}
+	for _, tc := range matches {
+		writeBenchmarkTest(f, tc)
+	}
+}