mirror of
https://github.com/ChronosX88/vala-parser.git
synced 2024-10-18 05:51:00 +00:00
221 lines
5.0 KiB
Go
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 + "}"
|
||
|
}
|
||
|
}
|