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() }
|