85 lines
1.3 KiB
Go
85 lines
1.3 KiB
Go
package token
|
|
|
|
// operator handles all tokens that qualify as an operator.
|
|
func operator(tokens List, buffer []byte, i Position) (List, Position) {
|
|
position := i
|
|
i++
|
|
|
|
for i < Position(len(buffer)) && isOperator(buffer[i]) {
|
|
i++
|
|
}
|
|
|
|
kind := Invalid
|
|
|
|
switch string(buffer[position:i]) {
|
|
case "!":
|
|
kind = Not
|
|
case "!=":
|
|
kind = NotEqual
|
|
case "%":
|
|
kind = Mod
|
|
case "%=":
|
|
kind = ModAssign
|
|
case "&":
|
|
kind = And
|
|
case "&&":
|
|
kind = LogicalAnd
|
|
case "&=":
|
|
kind = AndAssign
|
|
case "*":
|
|
kind = Mul
|
|
case "*=":
|
|
kind = MulAssign
|
|
case "+":
|
|
kind = Add
|
|
case "+=":
|
|
kind = AddAssign
|
|
case ".":
|
|
kind = Period
|
|
case ":=":
|
|
kind = Define
|
|
case "<":
|
|
kind = Less
|
|
case "<<":
|
|
kind = Shl
|
|
case "<<=":
|
|
kind = ShlAssign
|
|
case "<=":
|
|
kind = LessEqual
|
|
case "=":
|
|
kind = Assign
|
|
case "==":
|
|
kind = Equal
|
|
case ">":
|
|
kind = Greater
|
|
case ">=":
|
|
kind = GreaterEqual
|
|
case ">>":
|
|
kind = Shr
|
|
case ">>=":
|
|
kind = ShrAssign
|
|
case "^":
|
|
kind = Xor
|
|
case "^=":
|
|
kind = XorAssign
|
|
case "|":
|
|
kind = Or
|
|
case "|=":
|
|
kind = OrAssign
|
|
case "||":
|
|
kind = LogicalOr
|
|
}
|
|
|
|
tokens = append(tokens, Token{Kind: kind, Position: position, Length: Length(i - position)})
|
|
return tokens, i
|
|
}
|
|
|
|
func isOperator(c byte) bool {
|
|
switch c {
|
|
case '=', ':', '.', '+', '-', '*', '/', '<', '>', '&', '|', '^', '%', '!':
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|