123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package token
-
- import (
- "fmt"
- "strconv"
-
- hcltoken "github.com/hashicorp/hcl/hcl/token"
- )
-
- // Token defines a single HCL token which can be obtained via the Scanner
- type Token struct {
- Type Type
- Pos Pos
- Text string
- }
-
- // Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language)
- type Type int
-
- const (
- // Special tokens
- ILLEGAL Type = iota
- EOF
-
- identifier_beg
- literal_beg
- NUMBER // 12345
- FLOAT // 123.45
- BOOL // true,false
- STRING // "abc"
- NULL // null
- literal_end
- identifier_end
-
- operator_beg
- LBRACK // [
- LBRACE // {
- COMMA // ,
- PERIOD // .
- COLON // :
-
- RBRACK // ]
- RBRACE // }
-
- operator_end
- )
-
- var tokens = [...]string{
- ILLEGAL: "ILLEGAL",
-
- EOF: "EOF",
-
- NUMBER: "NUMBER",
- FLOAT: "FLOAT",
- BOOL: "BOOL",
- STRING: "STRING",
- NULL: "NULL",
-
- LBRACK: "LBRACK",
- LBRACE: "LBRACE",
- COMMA: "COMMA",
- PERIOD: "PERIOD",
- COLON: "COLON",
-
- RBRACK: "RBRACK",
- RBRACE: "RBRACE",
- }
-
- // String returns the string corresponding to the token tok.
- func (t Type) String() string {
- s := ""
- if 0 <= t && t < Type(len(tokens)) {
- s = tokens[t]
- }
- if s == "" {
- s = "token(" + strconv.Itoa(int(t)) + ")"
- }
- return s
- }
-
- // IsIdentifier returns true for tokens corresponding to identifiers and basic
- // type literals; it returns false otherwise.
- func (t Type) IsIdentifier() bool { return identifier_beg < t && t < identifier_end }
-
- // IsLiteral returns true for tokens corresponding to basic type literals; it
- // returns false otherwise.
- func (t Type) IsLiteral() bool { return literal_beg < t && t < literal_end }
-
- // IsOperator returns true for tokens corresponding to operators and
- // delimiters; it returns false otherwise.
- func (t Type) IsOperator() bool { return operator_beg < t && t < operator_end }
-
- // String returns the token's literal text. Note that this is only
- // applicable for certain token types, such as token.IDENT,
- // token.STRING, etc..
- func (t Token) String() string {
- return fmt.Sprintf("%s %s %s", t.Pos.String(), t.Type.String(), t.Text)
- }
-
- // HCLToken converts this token to an HCL token.
- //
- // The token type must be a literal type or this will panic.
- func (t Token) HCLToken() hcltoken.Token {
- switch t.Type {
- case BOOL:
- return hcltoken.Token{Type: hcltoken.BOOL, Text: t.Text}
- case FLOAT:
- return hcltoken.Token{Type: hcltoken.FLOAT, Text: t.Text}
- case NULL:
- return hcltoken.Token{Type: hcltoken.STRING, Text: ""}
- case NUMBER:
- return hcltoken.Token{Type: hcltoken.NUMBER, Text: t.Text}
- case STRING:
- return hcltoken.Token{Type: hcltoken.STRING, Text: t.Text, JSON: true}
- default:
- panic(fmt.Sprintf("unimplemented HCLToken for type: %s", t.Type))
- }
- }
|