summaryrefslogtreecommitdiff
path: root/lang/golang/go.go
blob: 7f6659438309b650c43f506bc723ef41eb14c902 (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
package golang

import "github.com/gnolang/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},
		"*":  {TokenId: lang.Mul},
		"+":  {TokenId: lang.Add},
		"-":  {TokenId: lang.Sub},
		"=":  {TokenId: lang.Assign},
		"<":  {TokenId: lang.Less},
		">":  {TokenId: lang.Greater},
		"^":  {TokenId: lang.Xor},
		"~":  {TokenId: lang.Tilde},
		":=": {TokenId: lang.Define},
		"==": {TokenId: lang.Equal},
		"<=": {TokenId: lang.LessEqual},
		">=": {TokenId: lang.GreaterEqual},
		"->": {TokenId: lang.Arrow},
		"++": {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.Default, 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},
	},
}