mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-09-07 09:36:44 +00:00
106 lines
2.2 KiB
Go
106 lines
2.2 KiB
Go
package scanner
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"github.com/hashicorp/hil/ast"
|
||
)
|
||
|
||
type Token struct {
|
||
Type TokenType
|
||
Content string
|
||
Pos ast.Pos
|
||
}
|
||
|
||
//go:generate stringer -type=TokenType
|
||
type TokenType rune
|
||
|
||
const (
|
||
// Raw string data outside of ${ .. } sequences
|
||
LITERAL TokenType = 'o'
|
||
|
||
// STRING is like a LITERAL but it's inside a quoted string
|
||
// within a ${ ... } sequence, and so it can contain backslash
|
||
// escaping.
|
||
STRING TokenType = 'S'
|
||
|
||
// Other Literals
|
||
INTEGER TokenType = 'I'
|
||
FLOAT TokenType = 'F'
|
||
BOOL TokenType = 'B'
|
||
|
||
BEGIN TokenType = '$' // actually "${"
|
||
END TokenType = '}'
|
||
OQUOTE TokenType = '“' // Opening quote of a nested quoted sequence
|
||
CQUOTE TokenType = '”' // Closing quote of a nested quoted sequence
|
||
OPAREN TokenType = '('
|
||
CPAREN TokenType = ')'
|
||
OBRACKET TokenType = '['
|
||
CBRACKET TokenType = ']'
|
||
COMMA TokenType = ','
|
||
|
||
IDENTIFIER TokenType = 'i'
|
||
|
||
PERIOD TokenType = '.'
|
||
PLUS TokenType = '+'
|
||
MINUS TokenType = '-'
|
||
STAR TokenType = '*'
|
||
SLASH TokenType = '/'
|
||
PERCENT TokenType = '%'
|
||
|
||
AND TokenType = '∧'
|
||
OR TokenType = '∨'
|
||
BANG TokenType = '!'
|
||
|
||
EQUAL TokenType = '='
|
||
NOTEQUAL TokenType = '≠'
|
||
GT TokenType = '>'
|
||
LT TokenType = '<'
|
||
GTE TokenType = '≥'
|
||
LTE TokenType = '≤'
|
||
|
||
QUESTION TokenType = '?'
|
||
COLON TokenType = ':'
|
||
|
||
EOF TokenType = '␄'
|
||
|
||
// Produced for sequences that cannot be understood as valid tokens
|
||
// e.g. due to use of unrecognized punctuation.
|
||
INVALID TokenType = '<27>'
|
||
)
|
||
|
||
func (t *Token) String() string {
|
||
switch t.Type {
|
||
case EOF:
|
||
return "end of string"
|
||
case INVALID:
|
||
return fmt.Sprintf("invalid sequence %q", t.Content)
|
||
case INTEGER:
|
||
return fmt.Sprintf("integer %s", t.Content)
|
||
case FLOAT:
|
||
return fmt.Sprintf("float %s", t.Content)
|
||
case STRING:
|
||
return fmt.Sprintf("string %q", t.Content)
|
||
case LITERAL:
|
||
return fmt.Sprintf("literal %q", t.Content)
|
||
case OQUOTE:
|
||
return fmt.Sprintf("opening quote")
|
||
case CQUOTE:
|
||
return fmt.Sprintf("closing quote")
|
||
case AND:
|
||
return "&&"
|
||
case OR:
|
||
return "||"
|
||
case NOTEQUAL:
|
||
return "!="
|
||
case GTE:
|
||
return ">="
|
||
case LTE:
|
||
return "<="
|
||
default:
|
||
// The remaining token types have content that
|
||
// speaks for itself.
|
||
return fmt.Sprintf("%q", t.Content)
|
||
}
|
||
}
|