prolog.go

 1package p
 2
 3import (
 4	. "github.com/alecthomas/chroma" // nolint
 5	"github.com/alecthomas/chroma/lexers/internal"
 6)
 7
 8// Prolog lexer.
 9var Prolog = internal.Register(MustNewLexer(
10	&Config{
11		Name:      "Prolog",
12		Aliases:   []string{"prolog"},
13		Filenames: []string{"*.ecl", "*.prolog", "*.pro", "*.pl"},
14		MimeTypes: []string{"text/x-prolog"},
15	},
16	Rules{
17		"root": {
18			{`/\*`, CommentMultiline, Push("nested-comment")},
19			{`%.*`, CommentSingle, nil},
20			{`0\'.`, LiteralStringChar, nil},
21			{`0b[01]+`, LiteralNumberBin, nil},
22			{`0o[0-7]+`, LiteralNumberOct, nil},
23			{`0x[0-9a-fA-F]+`, LiteralNumberHex, nil},
24			{`\d\d?\'[a-zA-Z0-9]+`, LiteralNumberInteger, nil},
25			{`(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?`, LiteralNumberFloat, nil},
26			{`\d+`, LiteralNumberInteger, nil},
27			{`[\[\](){}|.,;!]`, Punctuation, nil},
28			{`:-|-->`, Punctuation, nil},
29			{`"(?:\\x[0-9a-fA-F]+\\|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|\\[0-7]+\\|\\["\nabcefnrstv]|[^\\"])*"`, LiteralStringDouble, nil},
30			{`'(?:''|[^'])*'`, LiteralStringAtom, nil},
31			{`is\b`, Operator, nil},
32			{`(<|>|=<|>=|==|=:=|=|/|//|\*|\+|-)(?=\s|[a-zA-Z0-9\[])`, Operator, nil},
33			{`(mod|div|not)\b`, Operator, nil},
34			{`_`, Keyword, nil},
35			{`([a-z]+)(:)`, ByGroups(NameNamespace, Punctuation), nil},
36			{`([a-zÀ-῿぀-퟿-￯][\w$À-῿぀-퟿-￯]*)(\s*)(:-|-->)`, ByGroups(NameFunction, Text, Operator), nil},
37			{`([a-zÀ-῿぀-퟿-￯][\w$À-῿぀-퟿-￯]*)(\s*)(\()`, ByGroups(NameFunction, Text, Punctuation), nil},
38			{`[a-zÀ-῿぀-퟿-￯][\w$À-῿぀-퟿-￯]*`, LiteralStringAtom, nil},
39			{`[#&*+\-./:<=>?@\\^~¡-¿‐-〿]+`, LiteralStringAtom, nil},
40			{`[A-Z_]\w*`, NameVariable, nil},
41			{`\s+|[ -‏￰-￾￯]`, Text, nil},
42		},
43		"nested-comment": {
44			{`\*/`, CommentMultiline, Pop(1)},
45			{`/\*`, CommentMultiline, Push()},
46			{`[^*/]+`, CommentMultiline, nil},
47			{`[*/]`, CommentMultiline, nil},
48		},
49	},
50))