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

import (
	"github.com/gnolang/parscan/parser"
	"github.com/gnolang/parscan/scanner"
)

var GoScanner = &scanner.Scanner{
	CharProp: [scanner.ASCIILen]uint{
		'\t': scanner.CharSep,
		'\n': scanner.CharLineSep,
		' ':  scanner.CharSep,
		'!':  scanner.CharOp,
		'"':  scanner.CharStr,
		'%':  scanner.CharOp,
		'&':  scanner.CharOp,
		'\'': scanner.CharStr,
		'(':  scanner.CharBlock,
		'*':  scanner.CharOp,
		'+':  scanner.CharOp,
		',':  scanner.CharGroupSep,
		'-':  scanner.CharOp,
		'.':  scanner.CharOp,
		'/':  scanner.CharOp,
		':':  scanner.CharOp,
		';':  scanner.CharGroupSep,
		'<':  scanner.CharOp,
		'=':  scanner.CharOp,
		'>':  scanner.CharOp,
		'[':  scanner.CharBlock,
		'^':  scanner.CharOp,
		'{':  scanner.CharBlock,
		'|':  scanner.CharOp,
		'~':  scanner.CharOp,
	},
	End: map[string]string{
		"(":  ")",
		"{":  "}",
		"[":  "]",
		"/*": "*/",
		`"`:  `"`,
		"'":  "'",
		"`":  "`",
		"//": "\n",
	},
	BlockProp: map[string]uint{
		"(":  scanner.CharBlock,
		"{":  scanner.CharBlock,
		"[":  scanner.CharBlock,
		`"`:  scanner.CharStr | scanner.StrEsc | scanner.StrNonl,
		"`":  scanner.CharStr,
		"'":  scanner.CharStr | scanner.StrEsc,
		"/*": scanner.CharStr,
		"//": scanner.CharStr | scanner.ExcludeEnd | scanner.EosValidEnd,
	},
	SkipSemi: map[string]bool{
		"++":        true,
		"--":        true,
		"case":      true,
		"chan":      true,
		"const":     true,
		"default":   true,
		"defer":     true,
		"else":      true,
		"for":       true,
		"func":      true,
		"go":        true,
		"goto":      true,
		"if":        true,
		"import":    true,
		"interface": true,
		"map":       true,
		"package":   true,
		"range":     true,
		"select":    true,
		"struct":    true,
		"switch":    true,
		"type":      true,
		"var":       true,
	},
}

var GoParser = &parser.Parser{
	Scanner: GoScanner,
	Spec: map[string]parser.NodeSpec{
		".":      {Kind: parser.OpDot, Flags: parser.Call, Order: 3},
		"*":      {Kind: parser.OpMultiply, Order: 4},
		"+":      {Kind: parser.OpAdd, Order: 5},
		"-":      {Kind: parser.OpSubtract, Order: 5},
		"<":      {Kind: parser.OpInferior, Order: 6},
		":=":     {Kind: parser.OpDefine, Order: 7},
		"=":      {Kind: parser.OpAssign, Order: 7},
		"if":     {Kind: parser.StmtIf, Flags: parser.Stmt | parser.ExprSep},
		"func":   {Kind: parser.DeclFunc, Flags: parser.Decl | parser.Call},
		"return": {Kind: parser.StmtReturn, Flags: parser.Stmt},
		"{..}":   {Kind: parser.BlockStmt, Flags: parser.ExprSep},
		"(..)":   {Kind: parser.BlockParen, Flags: parser.Call},
		`".."`:   {Kind: parser.LiteralString},
		"//..":   {Kind: parser.Comment},
		"/*..":   {Kind: parser.Comment},
	},
}

func init() { GoParser.Init() }