82 lines
2.0 KiB
Go
82 lines
2.0 KiB
Go
package saccharine
|
|
|
|
import "fmt"
|
|
|
|
// A TokenType is an identifier for any token in the Saccharine language.
|
|
type TokenType int
|
|
|
|
// All official tokens of the Saccharine language.
|
|
const (
|
|
// TokenOpenParen denotes the '(' token.
|
|
TokenOpenParen TokenType = iota
|
|
// TokenCloseParen denotes the ')' token.
|
|
TokenCloseParen
|
|
// TokenOpenBrace denotes the '{' token.
|
|
TokenOpenBrace
|
|
// TokenCloseBrace denotes the '}' token.
|
|
TokenCloseBrace
|
|
// TokenHardBreak denotes the ';' token.
|
|
TokenHardBreak
|
|
// TokenAssign denotes the ':=' token.
|
|
TokenAssign
|
|
// TokenAtom denotes an alpha-numeric variable.
|
|
TokenAtom
|
|
// TokenSlash denotes the '/' token.
|
|
TokenSlash
|
|
// TokenDot denotes the '.' token.
|
|
TokenDot
|
|
// TokenSoftBreak denotes a new-line.
|
|
TokenSoftBreak
|
|
)
|
|
|
|
// A Token in the Saccharine language.
|
|
type Token struct {
|
|
Column int // Where the token begins in the source text.
|
|
Type TokenType // What type the token is.
|
|
Value string // The value of the token.
|
|
}
|
|
|
|
// NewToken creates a [Token] of the given type at the given column.
|
|
// The token's value is derived from its [TokenType].
|
|
func NewToken(typ TokenType, column int) *Token {
|
|
return &Token{Type: typ, Column: column, Value: typ.Name()}
|
|
}
|
|
|
|
// NewTokenAtom creates a [TokenAtom] with the given name at the given column.
|
|
func NewTokenAtom(name string, column int) *Token {
|
|
return &Token{Type: TokenAtom, Column: column, Value: name}
|
|
}
|
|
|
|
// Name returns the type of the TokenType, as a string.
|
|
func (t TokenType) Name() string {
|
|
switch t {
|
|
case TokenOpenParen:
|
|
return "("
|
|
case TokenCloseParen:
|
|
return ")"
|
|
case TokenOpenBrace:
|
|
return "{"
|
|
case TokenCloseBrace:
|
|
return "}"
|
|
case TokenHardBreak:
|
|
return ";"
|
|
case TokenAssign:
|
|
return ":="
|
|
case TokenAtom:
|
|
return "ATOM"
|
|
case TokenSlash:
|
|
return "\\"
|
|
case TokenDot:
|
|
return "."
|
|
case TokenSoftBreak:
|
|
return "\\n"
|
|
default:
|
|
panic(fmt.Errorf("unknown token type %v", t))
|
|
}
|
|
}
|
|
|
|
// Name returns the type of the Token, as a string.
|
|
func (t Token) Name() string {
|
|
return t.Type.Name()
|
|
}
|