-
Notifications
You must be signed in to change notification settings - Fork 31
/
operator.go
62 lines (58 loc) · 1.19 KB
/
operator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package tokenizer
var lexPhpOps = map[string]ItemType{
"&=": T_AND_EQUAL,
"&&": T_BOOLEAN_AND,
"||": T_BOOLEAN_OR,
"??": T_COALESCE,
"?>": T_CLOSE_TAG,
".=": T_CONCAT_EQUAL,
"--": T_DEC,
"++": T_INC,
"/=": T_DIV_EQUAL,
"=>": T_DOUBLE_ARROW,
"::": T_PAAMAYIM_NEKUDOTAYIM,
"...": T_ELLIPSIS,
"==": T_IS_EQUAL,
">=": T_IS_GREATER_OR_EQUAL,
"===": T_IS_IDENTICAL,
"!=": T_IS_NOT_EQUAL,
"<>": T_IS_NOT_EQUAL,
"!==": T_IS_NOT_IDENTICAL,
"<=": T_IS_SMALLER_OR_EQUAL,
"<=>": T_SPACESHIP,
"-=": T_MINUS_EQUAL,
"%=": T_MOD_EQUAL,
"*=": T_MUL_EQUAL,
"->": T_OBJECT_OPERATOR,
"|=": T_OR_EQUAL,
"+=": T_PLUS_EQUAL,
"**": T_POW,
"**=": T_POW_EQUAL,
"<<": T_SL,
"<<=": T_SL_EQUAL,
">>": T_SR,
">>=": T_SR_EQUAL,
"^=": T_XOR_EQUAL,
}
func lexPhpOperator(l *Lexer) lexState {
if t, ok := lexPhpOps[l.peekString(3)]; ok {
l.advance(3)
l.emit(t)
return l.base
}
if t, ok := lexPhpOps[l.peekString(2)]; ok {
l.advance(2)
if t == T_CLOSE_TAG {
// falling back to HTML mode - make linebreak part of closing tag
l.accept("\r")
l.accept("\n")
l.emit(t)
l.pop()
return l.base
}
l.emit(t)
return l.base
}
l.emit(Rune(l.next()))
return l.base
}