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