mirror of
https://github.com/gonum/gonum.git
synced 2025-10-06 07:37:03 +08:00
194 lines
4.1 KiB
Go
194 lines
4.1 KiB
Go
// Code generated by gocc; DO NOT EDIT.
|
|
|
|
// This file is dual licensed under CC0 and The Gonum License.
|
|
//
|
|
// Copyright ©2017 The Gonum Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
//
|
|
// Copyright ©2017 Robin Eklind.
|
|
// This file is made available under a Creative Commons CC0 1.0
|
|
// Universal Public Domain Dedication.
|
|
|
|
package token
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strconv"
|
|
"unicode/utf8"
|
|
)
|
|
|
|
type Token struct {
|
|
Type
|
|
Lit []byte
|
|
Pos
|
|
}
|
|
|
|
type Type int
|
|
|
|
const (
|
|
INVALID Type = iota
|
|
EOF
|
|
)
|
|
|
|
type Pos struct {
|
|
Offset int
|
|
Line int
|
|
Column int
|
|
Context Context
|
|
}
|
|
|
|
func (p Pos) String() string {
|
|
// If the context provides a filename, provide a human-readable File:Line:Column representation.
|
|
switch src := p.Context.(type) {
|
|
case Sourcer:
|
|
return fmt.Sprintf("%s:%d:%d", src.Source(), p.Line, p.Column)
|
|
default:
|
|
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 {
|
|
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)
|
|
}
|
|
|
|
// Equals returns returns true if the token Type and Lit are matches.
|
|
func (t *Token) Equals(rhs interface{}) bool {
|
|
switch rhsT := rhs.(type) {
|
|
case *Token:
|
|
return t == rhsT || (t.Type == rhsT.Type && bytes.Equal(t.Lit, rhsT.Lit))
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
// CharLiteralValue returns the string value of the char literal.
|
|
func (t *Token) CharLiteralValue() string {
|
|
return string(t.Lit[1 : len(t.Lit)-1])
|
|
}
|
|
|
|
// Float32Value returns the float32 value of the token or an error if the token literal does not
|
|
// denote a valid float32.
|
|
func (t *Token) Float32Value() (float32, error) {
|
|
if v, err := strconv.ParseFloat(string(t.Lit), 32); err != nil {
|
|
return 0, err
|
|
} else {
|
|
return float32(v), nil
|
|
}
|
|
}
|
|
|
|
// Float64Value returns the float64 value of the token or an error if the token literal does not
|
|
// denote a valid float64.
|
|
func (t *Token) Float64Value() (float64, error) {
|
|
return strconv.ParseFloat(string(t.Lit), 64)
|
|
}
|
|
|
|
// IDValue returns the string representation of an identifier token.
|
|
func (t *Token) IDValue() string {
|
|
return string(t.Lit)
|
|
}
|
|
|
|
// Int32Value returns the int32 value of the token or an error if the token literal does not
|
|
// denote a valid float64.
|
|
func (t *Token) Int32Value() (int32, error) {
|
|
if v, err := strconv.ParseInt(string(t.Lit), 10, 64); err != nil {
|
|
return 0, err
|
|
} else {
|
|
return int32(v), nil
|
|
}
|
|
}
|
|
|
|
// Int64Value returns the int64 value of the token or an error if the token literal does not
|
|
// denote a valid float64.
|
|
func (t *Token) Int64Value() (int64, error) {
|
|
return strconv.ParseInt(string(t.Lit), 10, 64)
|
|
}
|
|
|
|
// UTF8Rune decodes the UTF8 rune in the token literal. It returns utf8.RuneError if
|
|
// the token literal contains an invalid rune.
|
|
func (t *Token) UTF8Rune() (rune, error) {
|
|
r, _ := utf8.DecodeRune(t.Lit)
|
|
if r == utf8.RuneError {
|
|
err := fmt.Errorf("Invalid rune")
|
|
return r, err
|
|
}
|
|
return r, nil
|
|
}
|
|
|
|
// StringValue returns the string value of the token literal.
|
|
func (t *Token) StringValue() string {
|
|
return string(t.Lit[1 : len(t.Lit)-1])
|
|
}
|
|
|
|
var TokMap = TokenMap{
|
|
typeMap: []string{
|
|
"INVALID",
|
|
"␚",
|
|
"{",
|
|
"}",
|
|
"empty",
|
|
"strict",
|
|
"graphx",
|
|
"digraph",
|
|
";",
|
|
"--",
|
|
"->",
|
|
"node",
|
|
"edge",
|
|
"[",
|
|
"]",
|
|
",",
|
|
"=",
|
|
"subgraph",
|
|
":",
|
|
"id",
|
|
},
|
|
|
|
idMap: map[string]Type{
|
|
"INVALID": 0,
|
|
"␚": 1,
|
|
"{": 2,
|
|
"}": 3,
|
|
"empty": 4,
|
|
"strict": 5,
|
|
"graphx": 6,
|
|
"digraph": 7,
|
|
";": 8,
|
|
"--": 9,
|
|
"->": 10,
|
|
"node": 11,
|
|
"edge": 12,
|
|
"[": 13,
|
|
"]": 14,
|
|
",": 15,
|
|
"=": 16,
|
|
"subgraph": 17,
|
|
":": 18,
|
|
"id": 19,
|
|
},
|
|
}
|