// Code generated by gocc; DO NOT EDIT.

package token

import (
	"fmt"
)

type Token struct {
	Type
	Lit []byte
	Pos
}

type Type int

const (
	INVALID Type = iota
	EOF
)

type Pos struct {
	Offset int
	Line   int
	Column int
}

func (p Pos) String() string {
	return fmt.Sprintf("Pos(offset=%d, line=%d, column=%d)", p.Offset, p.Line, p.Column)
}

type TokenMap struct {
	typeMap []string
	idMap   map[string]Type
}

func (m TokenMap) Id(tok Type) string {
	if int(tok) < len(m.typeMap) {
		return m.typeMap[tok]
	}
	return "unknown"
}

func (m TokenMap) Type(tok string) Type {
	if typ, exist := m.idMap[tok]; exist {
		return typ
	}
	return INVALID
}

func (m TokenMap) TokenString(tok *Token) string {
	//TODO: refactor to print pos & token string properly
	return fmt.Sprintf("%s(%d,%s)", m.Id(tok.Type), tok.Type, tok.Lit)
}

func (m TokenMap) StringType(typ Type) string {
	return fmt.Sprintf("%s(%d)", m.Id(typ), typ)
}

var TokMap = TokenMap{
	typeMap: []string{
		"INVALID",
		"$",
		"graphx",
		"{",
		"}",
		"strict",
		"digraph",
		";",
		"=",
		"node",
		"edge",
		"[",
		"]",
		",",
		":",
		"subgraph",
		"->",
		"--",
		"id",
	},

	idMap: map[string]Type{
		"INVALID":  0,
		"$":        1,
		"graphx":   2,
		"{":        3,
		"}":        4,
		"strict":   5,
		"digraph":  6,
		";":        7,
		"=":        8,
		"node":     9,
		"edge":     10,
		"[":        11,
		"]":        12,
		",":        13,
		":":        14,
		"subgraph": 15,
		"->":       16,
		"--":       17,
		"id":       18,
	},
}