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
|
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",
},
}
var GoParser = &parser.Parser{
Scanner: GoScanner,
Spec: map[string]parser.NodeSpec{
".": {parser.DotOp, parser.Call, 3},
"*": {parser.MulOp, 0, 4},
"+": {parser.AddOp, 0, 5},
"-": {parser.SubOp, 0, 5},
"<": {parser.InfOp, 0, 6},
":=": {parser.DefOp, 0, 7},
"=": {parser.AssignOp, 0, 7},
"#call": {parser.CallExpr, 0, 0},
"#id": {parser.Ident, 0, 0},
"#num": {parser.NumberLit, 0, 0},
"if": {parser.IfStmt, parser.Stmt | parser.ExprSep, 0},
"func": {parser.FuncDecl, parser.Decl | parser.Call, 0},
"return": {parser.ReturnStmt, parser.Stmt, 0},
"{..}": {parser.StmtBloc, parser.ExprSep, 0},
"{": {parser.StmtBloc, parser.ExprSep, 0}, // FIXME: redundant with above
"(..)": {parser.ParBloc, parser.Call, 0},
"(": {parser.ParBloc, parser.Call, 0}, // FIXME: redundant with above
`".."`: {parser.StringLit, 0, 0},
},
}
|