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
|
package golang
import "github.com/mvertes/parscan/lang"
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)
"{..}": {TokenId: lang.BraceBlock},
"[..]": {TokenId: lang.BracketBlock},
"(..)": {TokenId: lang.ParenBlock},
// String tokens (not nested)
"//..": {TokenId: lang.Comment},
"/*..": {TokenId: lang.Comment},
`".."`: {TokenId: lang.String},
"`..`": {TokenId: lang.String},
// Separators
",": {TokenId: lang.Comma},
";": {TokenId: lang.Semicolon},
".": {TokenId: lang.Period},
":": {TokenId: lang.Colon},
// Operators
"&": {TokenId: lang.And, Precedence: 1},
"*": {TokenId: lang.Mul, Precedence: 1},
"/": {TokenId: lang.Quo, Precedence: 1},
"%": {TokenId: lang.Rem, Precedence: 1},
"<<": {TokenId: lang.Shl, Precedence: 1},
">>": {TokenId: lang.Shr, Precedence: 1},
"+": {TokenId: lang.Add, Precedence: 2},
"-": {TokenId: lang.Sub, Precedence: 2},
"=": {TokenId: lang.Assign, Precedence: 6},
"+=": {TokenId: lang.AddAssign, Precedence: 6},
"<": {TokenId: lang.Less, Precedence: 3},
">": {TokenId: lang.Greater, Precedence: 3},
"^": {TokenId: lang.Xor, Precedence: 2},
"~": {TokenId: lang.Tilde},
"&&": {TokenId: lang.Land, Precedence: 4},
"||": {TokenId: lang.Lor, Precedence: 5},
":=": {TokenId: lang.Define, Precedence: 6},
"==": {TokenId: lang.Equal, Precedence: 3},
"<=": {TokenId: lang.LessEqual, Precedence: 3},
">=": {TokenId: lang.GreaterEqual, Precedence: 3},
"->": {TokenId: lang.Arrow},
"!": {TokenId: lang.Not},
"++": {TokenId: lang.Inc, SkipSemi: true},
"--": {TokenId: lang.Dec, SkipSemi: true},
// Reserved keywords
"break": {TokenId: lang.Break},
"case": {TokenId: lang.Case, SkipSemi: true},
"chan": {TokenId: lang.Chan, SkipSemi: true},
"const": {TokenId: lang.Const, SkipSemi: true},
"continue": {TokenId: lang.Continue},
"default": {TokenId: lang.Case, SkipSemi: true},
"defer": {TokenId: lang.Defer, SkipSemi: true},
"else": {TokenId: lang.Else, SkipSemi: true},
"fallthrough": {TokenId: lang.Fallthrough},
"for": {TokenId: lang.For, SkipSemi: true},
"func": {TokenId: lang.Func, SkipSemi: true},
"go": {TokenId: lang.Go, SkipSemi: true},
"goto": {TokenId: lang.Goto, SkipSemi: true},
"if": {TokenId: lang.If, SkipSemi: true},
"import": {TokenId: lang.Import, SkipSemi: true},
"interface": {TokenId: lang.Interface, SkipSemi: true},
"map": {TokenId: lang.Map, SkipSemi: true},
"package": {TokenId: lang.Package, SkipSemi: true},
"range": {TokenId: lang.Range, SkipSemi: true},
"return": {TokenId: lang.Return},
"select": {TokenId: lang.Select, SkipSemi: true},
"struct": {TokenId: lang.Struct, SkipSemi: true},
"switch": {TokenId: lang.Switch, SkipSemi: true},
"type": {TokenId: lang.Type, SkipSemi: true},
"var": {TokenId: lang.Var, SkipSemi: true},
},
}
|