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