1package s
2
3import (
4	. "github.com/alecthomas/chroma" // nolint
5	"github.com/alecthomas/chroma/lexers/internal"
6)
7
8// Snobol lexer.
9var Snobol = internal.Register(MustNewLexer(
10	&Config{
11		Name:      "Snobol",
12		Aliases:   []string{"snobol"},
13		Filenames: []string{"*.snobol"},
14		MimeTypes: []string{"text/x-snobol"},
15	},
16	Rules{
17		"root": {
18			{`\*.*\n`, Comment, nil},
19			{`[+.] `, Punctuation, Push("statement")},
20			{`-.*\n`, Comment, nil},
21			{`END\s*\n`, NameLabel, Push("heredoc")},
22			{`[A-Za-z$][\w$]*`, NameLabel, Push("statement")},
23			{`\s+`, Text, Push("statement")},
24		},
25		"statement": {
26			{`\s*\n`, Text, Pop(1)},
27			{`\s+`, Text, nil},
28			{`(?<=[^\w.])(LT|LE|EQ|NE|GE|GT|INTEGER|IDENT|DIFFER|LGT|SIZE|REPLACE|TRIM|DUPL|REMDR|DATE|TIME|EVAL|APPLY|OPSYN|LOAD|UNLOAD|LEN|SPAN|BREAK|ANY|NOTANY|TAB|RTAB|REM|POS|RPOS|FAIL|FENCE|ABORT|ARB|ARBNO|BAL|SUCCEED|INPUT|OUTPUT|TERMINAL)(?=[^\w.])`, NameBuiltin, nil},
29			{`[A-Za-z][\w.]*`, Name, nil},
30			{`\*\*|[?$.!%*/#+\-@|&\\=]`, Operator, nil},
31			{`"[^"]*"`, LiteralString, nil},
32			{`'[^']*'`, LiteralString, nil},
33			{`[0-9]+(?=[^.EeDd])`, LiteralNumberInteger, nil},
34			{`[0-9]+(\.[0-9]*)?([EDed][-+]?[0-9]+)?`, LiteralNumberFloat, nil},
35			{`:`, Punctuation, Push("goto")},
36			{`[()<>,;]`, Punctuation, nil},
37		},
38		"goto": {
39			{`\s*\n`, Text, Pop(2)},
40			{`\s+`, Text, nil},
41			{`F|S`, Keyword, nil},
42			{`(\()([A-Za-z][\w.]*)(\))`, ByGroups(Punctuation, NameLabel, Punctuation), nil},
43		},
44		"heredoc": {
45			{`.*\n`, LiteralStringHeredoc, nil},
46		},
47	},
48))
49