mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-09-18 17:19:58 +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)
|
|||
|
}
|
|||
|
}
|