diff options
Diffstat (limited to 'driver/template.go')
-rw-r--r-- | driver/template.go | 102 |
1 files changed, 88 insertions, 14 deletions
diff --git a/driver/template.go b/driver/template.go index f7caa75..2772135 100644 --- a/driver/template.go +++ b/driver/template.go @@ -35,6 +35,67 @@ func GenLexer(clspec *spec.CompiledLexSpec, pkgName string) error { lexerSrc = b.String() } + var modeIDsSrc string + { + var b strings.Builder + fmt.Fprintf(&b, "const (\n") + for i, k := range clspec.ModeNames { + if i == spec.LexModeIDNil.Int() { + fmt.Fprintf(&b, " ModeIDNil ModeID = %v\n", i) + continue + } + fmt.Fprintf(&b, " ModeID%v ModeID = %v\n", spec.SnakeCaseToUpperCamelCase(k.String()), i) + } + fmt.Fprintf(&b, ")") + + modeIDsSrc = b.String() + } + + var modeNamesSrc string + { + var b strings.Builder + fmt.Fprintf(&b, "const (\n") + for i, k := range clspec.ModeNames { + if i == spec.LexModeIDNil.Int() { + fmt.Fprintf(&b, " ModeNameNil = %#v\n", "") + continue + } + fmt.Fprintf(&b, " ModeName%v = %#v\n", spec.SnakeCaseToUpperCamelCase(k.String()), k) + } + fmt.Fprintf(&b, ")") + + modeNamesSrc = b.String() + } + + var kindIDsSrc string + { + var b strings.Builder + fmt.Fprintf(&b, "const (\n") + for i, k := range clspec.KindNames { + if i == spec.LexKindIDNil.Int() { + fmt.Fprintf(&b, " KindIDNil KindID = %v\n", i) + continue + } + fmt.Fprintf(&b, " KindID%v KindID = %v\n", spec.SnakeCaseToUpperCamelCase(k.String()), i) + } + fmt.Fprintf(&b, ")") + + kindIDsSrc = b.String() + } + + var kindNamesSrc string + { + var b strings.Builder + fmt.Fprintf(&b, "const (\n") + fmt.Fprintf(&b, " KindNameNil = %#v\n", "") + for _, k := range clspec.KindNames[1:] { + fmt.Fprintf(&b, " KindName%v = %#v\n", spec.SnakeCaseToUpperCamelCase(k.String()), k) + } + fmt.Fprintf(&b, ")") + + kindNamesSrc = b.String() + } + var specSrc string { t, err := template.New("").Funcs(genTemplateFuncs(clspec)).Parse(lexSpecTemplate) @@ -44,8 +105,8 @@ func GenLexer(clspec *spec.CompiledLexSpec, pkgName string) error { var b strings.Builder err = t.Execute(&b, map[string]interface{}{ - "initialModeID": clspec.InitialModeID, - "modeIDNil": spec.LexModeIDNil, + "initialModeID": "ModeID" + spec.SnakeCaseToUpperCamelCase(clspec.ModeNames[clspec.InitialModeID].String()), + "modeIDNil": "ModeIDNil", "modeKindIDNil": spec.LexModeKindIDNil, "stateIDNil": spec.StateIDNil, "compressionLevel": clspec.CompressionLevel, @@ -62,6 +123,14 @@ func GenLexer(clspec *spec.CompiledLexSpec, pkgName string) error { tmpl := `// Code generated by maleeni-go. DO NOT EDIT. {{ .lexerSrc }} +{{ .modeIDsSrc }} + +{{ .modeNamesSrc }} + +{{ .kindIDsSrc }} + +{{ .kindNamesSrc }} + {{ .specSrc }} ` @@ -72,8 +141,12 @@ func GenLexer(clspec *spec.CompiledLexSpec, pkgName string) error { var b strings.Builder err = t.Execute(&b, map[string]string{ - "lexerSrc": lexerSrc, - "specSrc": specSrc, + "lexerSrc": lexerSrc, + "modeIDsSrc": modeIDsSrc, + "modeNamesSrc": modeNamesSrc, + "kindIDsSrc": kindIDsSrc, + "kindNamesSrc": kindNamesSrc, + "specSrc": specSrc, }) if err != nil { return err @@ -239,11 +312,10 @@ func genTemplateFuncs(clspec *spec.CompiledLexSpec) template.FuncMap { fmt.Fprintf(&b, "[]string{\n") for i, name := range clspec.ModeNames { if i == spec.LexModeIDNil.Int() { - fmt.Fprintf(&b, "%#v,\n", "") + fmt.Fprintf(&b, "ModeNameNil,\n") continue } - - fmt.Fprintf(&b, "%#v,\n", name) + fmt.Fprintf(&b, "ModeName%v,\n", spec.SnakeCaseToUpperCamelCase(name.String())) } fmt.Fprintf(&b, "}") return b.String() @@ -290,10 +362,13 @@ func genTemplateFuncs(clspec *spec.CompiledLexSpec) template.FuncMap { continue } - fmt.Fprintf(&b, "{") - fmt.Fprintf(&b, "%v", ids[0]) - for _, v := range ids[1:] { - fmt.Fprintf(&b, ", %v", v) + fmt.Fprintf(&b, "{\n") + for j, id := range ids { + if j == spec.LexModeKindIDNil.Int() { + fmt.Fprintf(&b, "KindIDNil,\n") + continue + } + fmt.Fprintf(&b, "KindID%v,\n", spec.SnakeCaseToUpperCamelCase(string(clspec.KindNames[id].String()))) } fmt.Fprintf(&b, "},\n") } @@ -305,11 +380,10 @@ func genTemplateFuncs(clspec *spec.CompiledLexSpec) template.FuncMap { fmt.Fprintf(&b, "[]string{\n") for i, name := range clspec.KindNames { if i == spec.LexKindIDNil.Int() { - fmt.Fprintf(&b, "%#v,\n", "") + fmt.Fprintf(&b, "KindNameNil,\n") continue } - - fmt.Fprintf(&b, "%#v,\n", name) + fmt.Fprintf(&b, "KindName%v,\n", spec.SnakeCaseToUpperCamelCase(name.String())) } fmt.Fprintf(&b, "}") return b.String() |