aboutsummaryrefslogtreecommitdiff
path: root/driver/template.go
diff options
context:
space:
mode:
Diffstat (limited to 'driver/template.go')
-rw-r--r--driver/template.go102
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()