Newer
Older
// code generated: do not modify
package lex
type Keyword int
func (K Keyword) Discard() bool {
return false
}
var _ Token = (Keyword)(0)
type Mapper func(rune) (Mapper, Keyword)
{{define "makeMapper" -}}
{{range $char, $sub := .Map -}}
{{template "makeMapper" $sub}}
{{end -}}
func mapper{{.Id}}(char rune) (Mapper, Keyword) {
switch char {
{{range $char, $sub := .Map -}}
case '{{printf "%c" $char}}'
{{- if not (eq (toUpper $char) $char) -}}
, '{{printf "%c" (toUpper $char)}}'
{{- else if not (eq (toLower $char) $char) -}}
, '{{printf "%c" (toLower $char)}}'
{{- end -}}
:
return mapper{{$sub.Id}}, {{if $sub.Default -}}
Keyword{{camelCase $sub.Default}}
{{- else -}}
InvalidKeyword
{{- end}}
Keyword{{camelCase .Default}}
{{- else -}}
InvalidKeyword
{{- end}}
}
}
{{end -}}
{{$tokenMap := buildTokenMap .Keywords -}}
{{template "makeMapper" $tokenMap}}
type KeywordBuilder struct {
mapper Mapper
token Keyword
}
func NewKeywordBuilder() *KeywordBuilder {
return &KeywordBuilder{
mapper: mapper{{$tokenMap.Id}},
token: InvalidKeyword,
}
}
func (T *KeywordBuilder) Append(char rune) BuilderState {
return Failed
}
return Ok
}
func (T *KeywordBuilder) Finish() Token {
if T.token == InvalidKeyword {
return nil
}
return T.token
}
var _ Builder = (*KeywordBuilder)(nil)
const (
{{range $name, $words := .Keywords -}}
Keyword{{camelCase $name}} Keyword = iota
{{end -}}
InvalidKeyword
)