vala-parser/scanner/token.go
2020-03-22 18:24:45 +04:00

221 lines
5.0 KiB
Go

package scanner
type TokenKind int
const (
Using TokenKind = iota // using
Class // class
Identifier // any identifier
Colon // :
Comma // ,
Semicolon // ;
OpenBrace // {
CloseBrace // }
StringLiteral // "
Namespace // namespace
PublicModifier // public
PrivateModifier // private
Add // +
Minus // -
Mult // *
Divide // /
Var // var
Whitespace //
OpenParens // (
CloseParens // )
Percent // %
OpenMultilineComments // /*
CloseMultilineComments // */
Dot // .
Return // return
Null // null
LambdaArrow // =>
If // if
Equal // ==
OpenSingleComments // //
Assign // =
OpenBracket // [
CloseBracket // ]
ProtectedModifier // protected
False // false
True // true
New // new
IntegerLiteral // any int number
RealLiteral // any real number
EOF // end of file
Illegal = -1 // just illegal token
)
func (tok TokenKind) String() string {
switch tok {
case Class:
return "class"
case Colon:
return ":"
case Comma:
return ","
case Semicolon:
return ";"
case OpenBrace:
return "{"
case CloseBrace:
return "}"
case StringLiteral:
return "\""
case Using:
return "using"
case Var:
return "var"
case Add:
return "+"
case Minus:
return "-"
case Mult:
return "*"
case Divide:
return "/"
case Namespace:
return "namespace"
case PublicModifier:
return "public"
case PrivateModifier:
return "private"
case OpenParens:
return "("
case CloseParens:
return ")"
case Percent:
return "%"
case OpenMultilineComments:
return "/*"
case CloseMultilineComments:
return "*/"
case Dot:
return "."
case Return:
return "return"
case Null:
return "null"
case LambdaArrow:
return "=>"
case If:
return "if"
case Equal:
return "=="
case OpenSingleComments:
return "//"
case Assign:
return "="
case OpenBracket:
return "["
case CloseBracket:
return "]"
case ProtectedModifier:
return "protected"
case False:
return "false"
case True:
return "true"
case New:
return "new"
}
return ""
}
func (tok TokenKind) PrettyString() string {
switch tok {
case Class:
return "CLASS"
case Colon:
return "COLON"
case Comma:
return "COMMA"
case Semicolon:
return "SEMICOLON"
case OpenBrace:
return "OPEN_BRACE"
case CloseBrace:
return "CLOSE_BRACE"
case StringLiteral:
return "STRING_LITERAL"
case Using:
return "USING"
case Var:
return "VAR"
case Add:
return "OP_SUM"
case Minus:
return "OP_MINUS"
case Mult:
return "OP_MULT"
case Divide:
return "OP_DIVIDE"
case Namespace:
return "NAMESPACE"
case PublicModifier:
return "PUBLIC_MODIFIER"
case PrivateModifier:
return "PRIVATE_MODIFIER"
case OpenParens:
return "OPEN_PARENS"
case CloseParens:
return "CLOSE_PARENS"
case Percent:
return "PERCENT"
case OpenMultilineComments:
return "OPEN_MULTILINE_COMMENTS"
case CloseMultilineComments:
return "CLOSE_MULTILINE_COMMENTS"
case Dot:
return "DOT"
case Return:
return "RETURN"
case Null:
return "NULL"
case LambdaArrow:
return "LAMBDA_ARROW"
case If:
return "IF_STMT"
case Illegal:
return "ILLEGAL"
case Equal:
return "EQUAL"
case OpenSingleComments:
return "OPEN_SINGLE_COMMENTS"
case Assign:
return "ASSIGN_OP"
case OpenBracket:
return "OPEN_BRACKET"
case CloseBracket:
return "CLOSE_BRACKET"
case ProtectedModifier:
return "PROTECTED_MODIFIER"
case False:
return "FALSE"
case True:
return "TRUE"
case New:
return "NEW"
case IntegerLiteral:
return "INTEGER_LITERAL"
case RealLiteral:
return "REAL_LITERAL"
}
return ""
}
type Token struct {
Kind TokenKind
Literal string
}
func (t Token) String() string {
if t.Kind != Identifier && t.Kind != Whitespace {
return "Token{kind: " + t.Kind.PrettyString() + ", literal: " + t.Literal + "}"
} else if t.Kind == Whitespace {
return "Token{kind: WHITESPACE}"
} else {
return "Token{kind: IDENTIFIER, literal: " + t.Literal + "}"
}
}