// Package golang provides the lexical specification of Go language. package golang import "github.com/mvertes/parscan/lang" // GoSpec contains the lexical specification of Go. 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) "{..}": {Token: lang.BraceBlock}, "[..]": {Token: lang.BracketBlock}, "(..)": {Token: lang.ParenBlock}, // String tokens (not nested) "//..": {Token: lang.Comment}, "/*..": {Token: lang.Comment}, `".."`: {Token: lang.String}, "`..`": {Token: lang.String}, // Separators ",": {Token: lang.Comma}, ";": {Token: lang.Semicolon}, ".": {Token: lang.Period}, ":": {Token: lang.Colon}, // Operators "&": {Token: lang.And, Precedence: 1}, "*": {Token: lang.Mul, Precedence: 1}, "/": {Token: lang.Quo, Precedence: 1}, "%": {Token: lang.Rem, Precedence: 1}, "<<": {Token: lang.Shl, Precedence: 1}, ">>": {Token: lang.Shr, Precedence: 1}, "+": {Token: lang.Add, Precedence: 2}, "-": {Token: lang.Sub, Precedence: 2}, "=": {Token: lang.Assign, Precedence: 6}, "+=": {Token: lang.AddAssign, Precedence: 6}, "<": {Token: lang.Less, Precedence: 3}, ">": {Token: lang.Greater, Precedence: 3}, "^": {Token: lang.Xor, Precedence: 2}, "~": {Token: lang.Tilde}, "&&": {Token: lang.Land, Precedence: 4}, "||": {Token: lang.Lor, Precedence: 5}, ":=": {Token: lang.Define, Precedence: 6}, "==": {Token: lang.Equal, Precedence: 3}, "<=": {Token: lang.LessEqual, Precedence: 3}, ">=": {Token: lang.GreaterEqual, Precedence: 3}, "->": {Token: lang.Arrow}, "!": {Token: lang.Not}, "++": {Token: lang.Inc, SkipSemi: true}, "--": {Token: lang.Dec, SkipSemi: true}, // Reserved keywords "break": {Token: lang.Break}, "case": {Token: lang.Case, SkipSemi: true}, "chan": {Token: lang.Chan, SkipSemi: true}, "const": {Token: lang.Const, SkipSemi: true}, "continue": {Token: lang.Continue}, "default": {Token: lang.Case, SkipSemi: true}, "defer": {Token: lang.Defer, SkipSemi: true}, "else": {Token: lang.Else, SkipSemi: true}, "fallthrough": {Token: lang.Fallthrough}, "for": {Token: lang.For, SkipSemi: true}, "func": {Token: lang.Func, SkipSemi: true}, "go": {Token: lang.Go, SkipSemi: true}, "goto": {Token: lang.Goto, SkipSemi: true}, "if": {Token: lang.If, SkipSemi: true}, "import": {Token: lang.Import, SkipSemi: true}, "interface": {Token: lang.Interface, SkipSemi: true}, "map": {Token: lang.Map, SkipSemi: true}, "package": {Token: lang.Package, SkipSemi: true}, "range": {Token: lang.Range, SkipSemi: true}, "return": {Token: lang.Return}, "select": {Token: lang.Select, SkipSemi: true}, "struct": {Token: lang.Struct, SkipSemi: true}, "switch": {Token: lang.Switch, SkipSemi: true}, "type": {Token: lang.Type, SkipSemi: true}, "var": {Token: lang.Var, SkipSemi: true}, }, }