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
118
119
120
121
122
123
124
125
126
127
|
// Package golang provides the lexical specification of Go language.
package golang
import "github.com/mvertes/parscan/lang"
// GoSpec contains the lexical specification of Go.
var GoSpec = &lang.Spec{
CharProp: [lang.ASCIILen]uint{
'\t': lang.CharSep,
'\n': lang.CharLineSep,
' ': lang.CharSep,
'!': lang.CharOp,
'"': lang.CharStr,
'%': lang.CharOp,
'&': lang.CharOp,
'\'': lang.CharStr,
'(': lang.CharBlock,
'*': lang.CharOp,
'+': lang.CharOp,
',': lang.CharGroupSep,
'-': lang.CharOp,
'`': lang.CharStr,
'.': lang.CharOp,
'/': lang.CharOp,
':': lang.CharOp,
';': lang.CharGroupSep,
'<': lang.CharOp,
'=': lang.CharOp,
'>': lang.CharOp,
'[': lang.CharBlock,
'^': lang.CharOp,
'{': lang.CharBlock,
'|': lang.CharOp,
'~': lang.CharOp,
},
End: map[string]string{
"(": ")",
"{": "}",
"[": "]",
"/*": "*/",
`"`: `"`,
"'": "'",
"`": "`",
"//": "\n",
},
BlockProp: map[string]uint{
"(": lang.CharBlock,
"{": lang.CharBlock,
"[": lang.CharBlock,
`"`: lang.CharStr | lang.StrEsc | lang.StrNonl,
"`": lang.CharStr,
"'": lang.CharStr | lang.StrEsc,
"/*": lang.CharStr,
"//": lang.CharStr | lang.ExcludeEnd | lang.EosValidEnd,
},
TokenProps: map[string]lang.TokenProp{
// Block tokens (can be nested)
"{..}": {Token: lang.BraceBlock},
"[..]": {Token: lang.BracketBlock},
"(..)": {Token: lang.ParenBlock},
// String tokens (not nested)
"//..": {Token: lang.Comment},
"/*..": {Token: lang.Comment},
`".."`: {Token: lang.String},
"`..`": {Token: lang.String},
// Separators
",": {Token: lang.Comma},
";": {Token: lang.Semicolon},
".": {Token: lang.Period},
":": {Token: lang.Colon},
// Operators
"&": {Token: lang.And, Precedence: 1},
"*": {Token: lang.Mul, Precedence: 1},
"/": {Token: lang.Quo, Precedence: 1},
"%": {Token: lang.Rem, Precedence: 1},
"<<": {Token: lang.Shl, Precedence: 1},
">>": {Token: lang.Shr, Precedence: 1},
"+": {Token: lang.Add, Precedence: 2},
"-": {Token: lang.Sub, Precedence: 2},
"=": {Token: lang.Assign, Precedence: 6},
"+=": {Token: lang.AddAssign, Precedence: 6},
"<": {Token: lang.Less, Precedence: 3},
">": {Token: lang.Greater, Precedence: 3},
"^": {Token: lang.Xor, Precedence: 2},
"~": {Token: lang.Tilde},
"&&": {Token: lang.Land, Precedence: 4},
"||": {Token: lang.Lor, Precedence: 5},
":=": {Token: lang.Define, Precedence: 6},
"==": {Token: lang.Equal, Precedence: 3},
"<=": {Token: lang.LessEqual, Precedence: 3},
">=": {Token: lang.GreaterEqual, Precedence: 3},
"->": {Token: lang.Arrow},
"!": {Token: lang.Not},
"++": {Token: lang.Inc, SkipSemi: true},
"--": {Token: lang.Dec, SkipSemi: true},
// Reserved keywords
"break": {Token: lang.Break},
"case": {Token: lang.Case, SkipSemi: true},
"chan": {Token: lang.Chan, SkipSemi: true},
"const": {Token: lang.Const, SkipSemi: true},
"continue": {Token: lang.Continue},
"default": {Token: lang.Case, SkipSemi: true},
"defer": {Token: lang.Defer, SkipSemi: true},
"else": {Token: lang.Else, SkipSemi: true},
"fallthrough": {Token: lang.Fallthrough},
"for": {Token: lang.For, SkipSemi: true},
"func": {Token: lang.Func, SkipSemi: true},
"go": {Token: lang.Go, SkipSemi: true},
"goto": {Token: lang.Goto, SkipSemi: true},
"if": {Token: lang.If, SkipSemi: true},
"import": {Token: lang.Import, SkipSemi: true},
"interface": {Token: lang.Interface, SkipSemi: true},
"map": {Token: lang.Map, SkipSemi: true},
"package": {Token: lang.Package, SkipSemi: true},
"range": {Token: lang.Range, SkipSemi: true},
"return": {Token: lang.Return},
"select": {Token: lang.Select, SkipSemi: true},
"struct": {Token: lang.Struct, SkipSemi: true},
"switch": {Token: lang.Switch, SkipSemi: true},
"type": {Token: lang.Type, SkipSemi: true},
"var": {Token: lang.Var, SkipSemi: true},
},
}
|