// 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, }, Tokens: map[string]lang.Token{ "{..}": lang.BraceBlock, "[..]": lang.BracketBlock, "(..)": lang.ParenBlock, "//..": lang.Comment, "/*..": lang.Comment, `".."`: lang.String, "`..`": lang.String, ",": lang.Comma, ";": lang.Semicolon, ".": lang.Period, ":": lang.Colon, "&": lang.And, "*": lang.Mul, "/": lang.Quo, "%": lang.Rem, "<<": lang.Shl, ">>": lang.Shr, "+": lang.Add, "-": lang.Sub, "=": lang.Assign, "+=": lang.AddAssign, "<": lang.Less, ">": lang.Greater, "^": lang.Xor, "~": lang.Tilde, "&&": lang.Land, "||": lang.Lor, ":=": lang.Define, "==": lang.Equal, "<=": lang.LessEqual, ">=": lang.GreaterEqual, "->": lang.Arrow, "!": lang.Not, "++": lang.Inc, "--": lang.Dec, "break": lang.Break, "case": lang.Case, "chan": lang.Chan, "const": lang.Const, "continue": lang.Continue, "default": lang.Case, // Consider "default" as an empty "case" clause. "defer": lang.Defer, "else": lang.Else, "fallthrough": lang.Fallthrough, "for": lang.For, "func": lang.Func, "go": lang.Go, "goto": lang.Goto, "if": lang.If, "import": lang.Import, "interface": lang.Interface, "map": lang.Map, "package": lang.Package, "range": lang.Range, "return": lang.Return, "select": lang.Select, "struct": lang.Struct, "switch": lang.Switch, "type": lang.Type, "var": lang.Var, }, TokenProps: []lang.TokenProp{ lang.And: {Precedence: 5}, lang.Mul: {Precedence: 5}, lang.Quo: {Precedence: 5}, lang.Rem: {Precedence: 5}, lang.Shl: {Precedence: 5}, lang.Shr: {Precedence: 5}, lang.Add: {Precedence: 4}, lang.Sub: {Precedence: 4}, lang.Xor: {Precedence: 4}, lang.Or: {Precedence: 4}, lang.Equal: {Precedence: 3}, lang.LessEqual: {Precedence: 3}, lang.GreaterEqual: {Precedence: 3}, lang.Less: {Precedence: 3}, lang.Greater: {Precedence: 3}, lang.Land: {Precedence: 1}, lang.Lor: {Precedence: 0}, lang.Minus: {Precedence: 6}, lang.Not: {Precedence: 6}, lang.Call: {Precedence: 6}, lang.Index: {Precedence: 6}, lang.Period: {Precedence: 7}, lang.Colon: {Precedence: 7}, lang.Inc: {SkipSemi: true}, lang.Dec: {SkipSemi: true}, lang.Case: {SkipSemi: true, HasInit: true}, lang.Chan: {SkipSemi: true}, lang.Const: {SkipSemi: true}, lang.Default: {SkipSemi: true}, lang.Defer: {SkipSemi: true}, lang.Else: {SkipSemi: true}, lang.For: {SkipSemi: true, HasInit: true}, lang.Func: {SkipSemi: true}, lang.Go: {SkipSemi: true}, lang.Goto: {SkipSemi: true}, lang.If: {SkipSemi: true, HasInit: true}, lang.Import: {SkipSemi: true}, lang.Interface: {SkipSemi: true}, lang.Map: {SkipSemi: true}, lang.Package: {SkipSemi: true}, lang.Range: {SkipSemi: true}, lang.Select: {SkipSemi: true, HasInit: true}, lang.Struct: {SkipSemi: true}, lang.Switch: {SkipSemi: true, HasInit: true}, lang.Type: {SkipSemi: true}, lang.Var: {SkipSemi: true}, lang.MaxTok: {}, // To ensure that all Tokens have a TokenProp. }, }