-
Notifications
You must be signed in to change notification settings - Fork 31
/
label.go
117 lines (110 loc) · 2.95 KB
/
label.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package tokenizer
import "strings"
var phpMagicKeywords = map[string]ItemType{
"abstract": T_ABSTRACT,
"array": T_ARRAY,
"as": T_AS,
"break": T_BREAK,
"callable": T_CALLABLE,
"case": T_CASE,
"catch": T_CATCH,
"class": T_CLASS,
"__CLASS__": T_CLASS_C,
"clone": T_CLONE,
"const": T_CONST,
"continue": T_CONTINUE,
"declare": T_DECLARE,
"default": T_DEFAULT,
"__DIR__": T_DIR,
"do": T_DO,
"echo": T_ECHO,
"else": T_ELSE,
"elseif": T_ELSEIF,
"empty": T_EMPTY,
"enddeclare": T_ENDDECLARE,
"endfor": T_ENDFOR,
"endforeach": T_ENDFOREACH,
"endif": T_ENDIF,
"endswitch": T_ENDSWITCH,
"endwhile": T_ENDWHILE,
"eval": T_EVAL,
"exit": T_EXIT,
"die": T_EXIT,
"extends": T_EXTENDS,
"__FILE__": T_FILE,
"final": T_FINAL,
"finally": T_FINALLY,
"for": T_FOR,
"foreach": T_FOREACH,
"function": T_FUNCTION,
"cfunction": T_FUNCTION, // ?
"__FUNCTION__": T_FUNC_C,
"global": T_GLOBAL,
"goto": T_GOTO,
"__halt_compiler": T_HALT_COMPILER,
"if": T_IF,
"implements": T_IMPLEMENTS,
"include": T_INCLUDE,
"include_once": T_INCLUDE_ONCE,
"instanceof": T_INSTANCEOF,
"insteadof": T_INSTEADOF,
"interface": T_INTERFACE,
"isset": T_ISSET,
"__LINE__": T_LINE,
"list": T_LIST,
"and": T_LOGICAL_AND,
"or": T_LOGICAL_OR,
"xor": T_LOGICAL_XOR,
"__METHOD__": T_METHOD_C,
"namespace": T_NAMESPACE,
"__NAMESPACE__": T_NS_C,
"new": T_NEW,
"print": T_PRINT,
"private": T_PRIVATE,
"public": T_PUBLIC,
"protected": T_PROTECTED,
"require": T_REQUIRE,
"require_once": T_REQUIRE_ONCE,
"return": T_RETURN,
"static": T_STATIC,
"switch": T_SWITCH,
"throw": T_THROW,
"trait": T_TRAIT,
"__TRAIT__": T_TRAIT_C,
"try": T_TRY,
"unset": T_UNSET,
"use": T_USE,
"var": T_VAR,
"while": T_WHILE,
"yield": T_YIELD,
// yield from T_YIELD_FROM TODO special case
}
func lexPhpVariable(l *Lexer) lexState {
l.advance(1) // '$' (already confirmed)
if l.acceptPhpLabel() == "" {
l.emit(Rune('$'))
return l.base
}
l.emit(T_VARIABLE)
return l.base
}
func labelType(lbl string) ItemType {
// check for phpMagicKeywords
if v, ok := phpMagicKeywords[strings.ToLower(lbl)]; ok {
return v
}
if v, ok := phpMagicKeywords[lbl]; ok {
return v
}
return T_STRING
}
func lexPhpString(l *Lexer) lexState {
lbl := l.acceptPhpLabel()
t := labelType(lbl)
l.emit(t)
if t == T_HALT_COMPILER {
l.emit(T_EOF)
return nil
}
return l.base
}