summaryrefslogtreecommitdiff
path: root/lang/golang/go.go
blob: b1213e5162d4db9735e666ef3a0f005f3c8e9253 (plain)
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
// 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.Default,
		"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.LessEqual:    {Precedence: 3},
		lang.GreaterEqual: {Precedence: 3},
		lang.Less:         {Precedence: 3},
		lang.Greater:      {Precedence: 3},
		lang.Land:         {Precedence: 2},
		lang.Lor:          {Precedence: 1},
		lang.Inc:          {SkipSemi: true},
		lang.Dec:          {SkipSemi: true},
		lang.Case:         {SkipSemi: 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},
		lang.Func:         {SkipSemi: true},
		lang.Go:           {SkipSemi: true},
		lang.Goto:         {SkipSemi: true},
		lang.If:           {SkipSemi: 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},
		lang.Struct:       {SkipSemi: true},
		lang.Switch:       {SkipSemi: true},
		lang.Type:         {SkipSemi: true},
		lang.Var:          {SkipSemi: true},
	},
	/*
		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: 3},
			"/":  {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: 1},
			"+=": {Token: lang.AddAssign, Precedence: 1},
			"<":  {Token: lang.Less, Precedence: 1},
			">":  {Token: lang.Greater, Precedence: 1},
			"^":  {Token: lang.Xor, Precedence: 2},
			"~":  {Token: lang.Tilde},
			"&&": {Token: lang.Land, Precedence: 4},
			"||": {Token: lang.Lor, Precedence: 5},
			":=": {Token: lang.Define, Precedence: 1},
			"==": {Token: lang.Equal, Precedence: 1},
			"<=": {Token: lang.LessEqual, Precedence: 1},
			">=": {Token: lang.GreaterEqual, Precedence: 1},
			"->": {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},
		},
	*/
}