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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
// 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,
},
Tokens: map[string]lang.Token{
"{..}": lang.BraceBlock,
"[..]": lang.BracketBlock,
"(..)": lang.ParenBlock,
"//..": lang.Comment,
"/*..": lang.Comment,
`".."`: lang.String,
"`..`": lang.String,
",": lang.Comma,
";": lang.Semicolon,
".": lang.Period,
":": lang.Colon,
"&": lang.And,
"*": lang.Mul,
"/": lang.Quo,
"%": lang.Rem,
"<<": lang.Shl,
">>": lang.Shr,
"+": lang.Add,
"-": lang.Sub,
"=": lang.Assign,
"+=": lang.AddAssign,
"<": lang.Less,
">": lang.Greater,
"^": lang.Xor,
"~": lang.Tilde,
"&&": lang.Land,
"||": lang.Lor,
":=": lang.Define,
"==": lang.Equal,
"<=": lang.LessEqual,
">=": lang.GreaterEqual,
"->": lang.Arrow,
"!": lang.Not,
"++": lang.Inc,
"--": lang.Dec,
"break": lang.Break,
"case": lang.Case,
"chan": lang.Chan,
"const": lang.Const,
"continue": lang.Continue,
"default": lang.Case, // Consider "default" as an empty "case" clause.
"defer": lang.Defer,
"else": lang.Else,
"fallthrough": lang.Fallthrough,
"for": lang.For,
"func": lang.Func,
"go": lang.Go,
"goto": lang.Goto,
"if": lang.If,
"import": lang.Import,
"interface": lang.Interface,
"map": lang.Map,
"package": lang.Package,
"range": lang.Range,
"return": lang.Return,
"select": lang.Select,
"struct": lang.Struct,
"switch": lang.Switch,
"type": lang.Type,
"var": lang.Var,
},
TokenProps: []lang.TokenProp{
lang.And: {Precedence: 5},
lang.Mul: {Precedence: 5},
lang.Quo: {Precedence: 5},
lang.Rem: {Precedence: 5},
lang.Shl: {Precedence: 5},
lang.Shr: {Precedence: 5},
lang.Add: {Precedence: 4},
lang.Sub: {Precedence: 4},
lang.Xor: {Precedence: 4},
lang.Or: {Precedence: 4},
lang.Equal: {Precedence: 3},
lang.LessEqual: {Precedence: 3},
lang.GreaterEqual: {Precedence: 3},
lang.Less: {Precedence: 3},
lang.Greater: {Precedence: 3},
lang.Land: {Precedence: 1},
lang.Lor: {Precedence: 0},
lang.Minus: {Precedence: 6},
lang.Not: {Precedence: 6},
lang.Call: {Precedence: 6},
lang.Index: {Precedence: 6},
lang.Period: {Precedence: 7},
lang.Colon: {Precedence: 7},
lang.Inc: {SkipSemi: true},
lang.Dec: {SkipSemi: true},
lang.Case: {SkipSemi: true, HasInit: true},
lang.Chan: {SkipSemi: true},
lang.Const: {SkipSemi: true},
lang.Default: {SkipSemi: true},
lang.Defer: {SkipSemi: true},
lang.Else: {SkipSemi: true},
lang.For: {SkipSemi: true, HasInit: true},
lang.Func: {SkipSemi: true},
lang.Go: {SkipSemi: true},
lang.Goto: {SkipSemi: true},
lang.If: {SkipSemi: true, HasInit: true},
lang.Import: {SkipSemi: true},
lang.Interface: {SkipSemi: true},
lang.Map: {SkipSemi: true},
lang.Package: {SkipSemi: true},
lang.Range: {SkipSemi: true},
lang.Select: {SkipSemi: true, HasInit: true},
lang.Struct: {SkipSemi: true},
lang.Switch: {SkipSemi: true, HasInit: true},
lang.Type: {SkipSemi: true},
lang.Var: {SkipSemi: true},
lang.MaxTok: {}, // To ensure that all Tokens have a TokenProp.
},
}
|