summaryrefslogtreecommitdiff
path: root/lang/golang/go.go
blob: 0d60e8b1f836124f91537be2cbc5aaf764c189b6 (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
// 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: 8},
		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.
	},
}