Skip to content

Commit eb257ed

Browse files
cgayalecthomas
authored andcommitted
Add a Dylan lexer
1 parent a9e4a4e commit eb257ed

File tree

4 files changed

+270
-1
lines changed

4 files changed

+270
-1
lines changed

Diff for: README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ Prefix | Language
3838
A | ABAP, ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, Arduino, Awk
3939
B | Ballerina, Base Makefile, Bash, Batchfile, BibTeX, BlitzBasic, BNF, Brainfuck
4040
C | C, C#, C++, Caddyfile, Caddyfile Directives, Cap'n Proto, Cassandra CQL, Ceylon, CFEngine3, cfstatement, ChaiScript, Cheetah, Clojure, CMake, COBOL, CoffeeScript, Common Lisp, Coq, Crystal, CSS, Cython
41-
D | D, Dart, Diff, Django/Jinja, Docker, DTD
41+
D | D, Dart, Diff, Django/Jinja, Docker, DTD, Dylan
4242
E | EBNF, Elixir, Elm, EmacsLisp, Erlang
4343
F | Factor, Fish, Forth, Fortran, FSharp
4444
G | GAS, GDScript, Genshi, Genshi HTML, Genshi Text, Gherkin, GLSL, Gnuplot, Go, Go HTML Template, Go Text Template, GraphQL, Groovy

Diff for: lexers/d/dylan.go

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package d
2+
3+
import (
4+
. "github.com/alecthomas/chroma" // nolint
5+
"github.com/alecthomas/chroma/lexers/internal"
6+
)
7+
8+
// Dylan lexer.
9+
var Dylan = internal.Register(MustNewLexer(
10+
&Config{
11+
Name: "Dylan",
12+
Aliases: []string{"dylan"},
13+
Filenames: []string{"*.dylan", "*.dyl", "*.intr"},
14+
MimeTypes: []string{"text/x-dylan"},
15+
CaseInsensitive: true,
16+
},
17+
Rules{
18+
"root": {
19+
{`\s+`, Whitespace, nil},
20+
{`//.*?\n`, CommentSingle, nil},
21+
{`([a-z0-9-]+:)([ \t]*)(.*(?:\n[ \t].+)*)`, ByGroups(NameAttribute, Whitespace, LiteralString), nil},
22+
Default(Push("code")),
23+
},
24+
"code": {
25+
{`\s+`, Whitespace, nil},
26+
{`//.*?\n`, CommentSingle, nil},
27+
{`/\*`, CommentMultiline, Push("comment")},
28+
{`"`, LiteralString, Push("string")},
29+
{`'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\\'\n])'`, LiteralStringChar, nil},
30+
{`#b[01]+`, LiteralNumberBin, nil},
31+
{`#o[0-7]+`, LiteralNumberOct, nil},
32+
{`[-+]?(\d*\.\d+([ed][-+]?\d+)?|\d+(\.\d*)?e[-+]?\d+)`, LiteralNumberFloat, nil},
33+
{`[-+]?\d+`, LiteralNumberInteger, nil},
34+
{`#x[0-9a-f]+`, LiteralNumberHex, nil},
35+
36+
{`(\?\\?)([\w!&*<>|^$%@+~?/=-]+)(:)(token|name|variable|expression|body|case-body|\*)`,
37+
ByGroups(Operator, NameVariable, Operator, NameBuiltin), nil},
38+
{`(\?)(:)(token|name|variable|expression|body|case-body|\*)`,
39+
ByGroups(Operator, Operator, NameVariable), nil},
40+
{`(\?\\?)([\w!&*<>|^$%@+~?/=-]+)`, ByGroups(Operator, NameVariable), nil},
41+
42+
{`(=>|::|#\(|#\[|##|\?\?|\?=|\?|[(){}\[\],.;])`, Punctuation, nil},
43+
{`:=`, Operator, nil},
44+
{`#[tf]`, Literal, nil},
45+
{`#"`, LiteralStringSymbol, Push("symbol")},
46+
{`#[a-z0-9-]+`, Keyword, nil},
47+
{`#(all-keys|include|key|next|rest)`, Keyword, nil},
48+
{`[\w!&*<>|^$%@+~?/=-]+:`, KeywordConstant, nil},
49+
{`<[\w!&*<>|^$%@+~?/=-]+>`, NameClass, nil},
50+
{`\*[\w!&*<>|^$%@+~?/=-]+\*`, NameVariableGlobal, nil},
51+
{`\$[\w!&*<>|^$%@+~?/=-]+`, NameConstant, nil},
52+
{`(let|method|function)([ \t]+)([\w!&*<>|^$%@+~?/=-]+)`, ByGroups(NameBuiltin, Whitespace, NameVariable), nil},
53+
{`(error|signal|return|break)`, NameException, nil},
54+
{`(\\?)([\w!&*<>|^$%@+~?/=-]+)`, ByGroups(Operator, Name), nil},
55+
},
56+
"comment": {
57+
{`[^*/]`, CommentMultiline, nil},
58+
{`/\*`, CommentMultiline, Push()},
59+
{`\*/`, CommentMultiline, Pop(1)},
60+
{`[*/]`, CommentMultiline, nil},
61+
},
62+
"symbol": {
63+
{`"`, LiteralStringSymbol, Pop(1)},
64+
{`[^\\"]+`, LiteralStringSymbol, nil},
65+
},
66+
"string": {
67+
{`"`, LiteralString, Pop(1)},
68+
{`\\([\\abfnrtv"\']|x[a-f0-9]{2,4}|[0-7]{1,3})`, LiteralStringEscape, nil},
69+
{`[^\\"\n]+`, LiteralString, nil},
70+
{`\\\n`, LiteralString, nil},
71+
{`\\`, LiteralString, nil},
72+
},
73+
},
74+
))

Diff for: lexers/testdata/dylan.actual

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
Module: mod
2+
3+
define constant $pi = 3.1415927d0;
4+
5+
define macro moo
6+
{ moo(?:name, ?e:expression) } => { let ?name = ?e; }
7+
end;
8+
9+
// abc
10+
define method foo-bar (n :: <integer>, #rest a, #key k, #all-keys) => (m :: <float>, b :: <boolean>)
11+
let x = n + 2.0 + #b10 + #o2 + #x02;
12+
format-out("dog // cat\n");
13+
local method pi () $pi end;
14+
pi()
15+
end method foo-bar;
16+
17+
/*
18+
cow
19+
*/
20+
foo-bar(2, k: k, a-b: c);

Diff for: lexers/testdata/dylan.expected

+175
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
[
2+
{"type":"NameAttribute","value":"Module:"},
3+
{"type":"TextWhitespace","value":" "},
4+
{"type":"LiteralString","value":"mod"},
5+
{"type":"TextWhitespace","value":"\n\n"},
6+
{"type":"Name","value":"define"},
7+
{"type":"TextWhitespace","value":" "},
8+
{"type":"Name","value":"constant"},
9+
{"type":"TextWhitespace","value":" "},
10+
{"type":"NameConstant","value":"$pi"},
11+
{"type":"TextWhitespace","value":" "},
12+
{"type":"Name","value":"="},
13+
{"type":"TextWhitespace","value":" "},
14+
{"type":"LiteralNumberFloat","value":"3.1415927d0"},
15+
{"type":"Punctuation","value":";"},
16+
{"type":"TextWhitespace","value":"\n\n"},
17+
{"type":"Name","value":"define"},
18+
{"type":"TextWhitespace","value":" "},
19+
{"type":"Name","value":"macro"},
20+
{"type":"TextWhitespace","value":" "},
21+
{"type":"Name","value":"moo"},
22+
{"type":"TextWhitespace","value":"\n "},
23+
{"type":"Punctuation","value":"{"},
24+
{"type":"TextWhitespace","value":" "},
25+
{"type":"Name","value":"moo"},
26+
{"type":"Punctuation","value":"("},
27+
{"type":"Operator","value":"?:"},
28+
{"type":"NameVariable","value":"name"},
29+
{"type":"Punctuation","value":","},
30+
{"type":"TextWhitespace","value":" "},
31+
{"type":"Operator","value":"?"},
32+
{"type":"NameVariable","value":"e"},
33+
{"type":"Operator","value":":"},
34+
{"type":"NameBuiltin","value":"expression"},
35+
{"type":"Punctuation","value":")"},
36+
{"type":"TextWhitespace","value":" "},
37+
{"type":"Punctuation","value":"}"},
38+
{"type":"TextWhitespace","value":" "},
39+
{"type":"Punctuation","value":"=\u003e"},
40+
{"type":"TextWhitespace","value":" "},
41+
{"type":"Punctuation","value":"{"},
42+
{"type":"TextWhitespace","value":" "},
43+
{"type":"NameBuiltin","value":"let"},
44+
{"type":"TextWhitespace","value":" "},
45+
{"type":"NameVariable","value":"?name"},
46+
{"type":"TextWhitespace","value":" "},
47+
{"type":"Name","value":"="},
48+
{"type":"TextWhitespace","value":" "},
49+
{"type":"Operator","value":"?"},
50+
{"type":"NameVariable","value":"e"},
51+
{"type":"Punctuation","value":";"},
52+
{"type":"TextWhitespace","value":" "},
53+
{"type":"Punctuation","value":"}"},
54+
{"type":"TextWhitespace","value":"\n"},
55+
{"type":"Name","value":"end"},
56+
{"type":"Punctuation","value":";"},
57+
{"type":"TextWhitespace","value":"\n\n"},
58+
{"type":"CommentSingle","value":"// abc\n"},
59+
{"type":"Name","value":"define"},
60+
{"type":"TextWhitespace","value":" "},
61+
{"type":"NameBuiltin","value":"method"},
62+
{"type":"TextWhitespace","value":" "},
63+
{"type":"NameVariable","value":"foo-bar"},
64+
{"type":"TextWhitespace","value":" "},
65+
{"type":"Punctuation","value":"("},
66+
{"type":"Name","value":"n"},
67+
{"type":"TextWhitespace","value":" "},
68+
{"type":"Punctuation","value":"::"},
69+
{"type":"TextWhitespace","value":" "},
70+
{"type":"NameClass","value":"\u003cinteger\u003e"},
71+
{"type":"Punctuation","value":","},
72+
{"type":"TextWhitespace","value":" "},
73+
{"type":"Keyword","value":"#rest"},
74+
{"type":"TextWhitespace","value":" "},
75+
{"type":"Name","value":"a"},
76+
{"type":"Punctuation","value":","},
77+
{"type":"TextWhitespace","value":" "},
78+
{"type":"Keyword","value":"#key"},
79+
{"type":"TextWhitespace","value":" "},
80+
{"type":"Name","value":"k"},
81+
{"type":"Punctuation","value":","},
82+
{"type":"TextWhitespace","value":" "},
83+
{"type":"Keyword","value":"#all-keys"},
84+
{"type":"Punctuation","value":")"},
85+
{"type":"TextWhitespace","value":" "},
86+
{"type":"Punctuation","value":"=\u003e"},
87+
{"type":"TextWhitespace","value":" "},
88+
{"type":"Punctuation","value":"("},
89+
{"type":"Name","value":"m"},
90+
{"type":"TextWhitespace","value":" "},
91+
{"type":"Punctuation","value":"::"},
92+
{"type":"TextWhitespace","value":" "},
93+
{"type":"NameClass","value":"\u003cfloat\u003e"},
94+
{"type":"Punctuation","value":","},
95+
{"type":"TextWhitespace","value":" "},
96+
{"type":"Name","value":"b"},
97+
{"type":"TextWhitespace","value":" "},
98+
{"type":"Punctuation","value":"::"},
99+
{"type":"TextWhitespace","value":" "},
100+
{"type":"NameClass","value":"\u003cboolean\u003e"},
101+
{"type":"Punctuation","value":")"},
102+
{"type":"TextWhitespace","value":"\n "},
103+
{"type":"NameBuiltin","value":"let"},
104+
{"type":"TextWhitespace","value":" "},
105+
{"type":"NameVariable","value":"x"},
106+
{"type":"TextWhitespace","value":" "},
107+
{"type":"Name","value":"="},
108+
{"type":"TextWhitespace","value":" "},
109+
{"type":"Name","value":"n"},
110+
{"type":"TextWhitespace","value":" "},
111+
{"type":"Name","value":"+"},
112+
{"type":"TextWhitespace","value":" "},
113+
{"type":"LiteralNumberFloat","value":"2.0"},
114+
{"type":"TextWhitespace","value":" "},
115+
{"type":"Name","value":"+"},
116+
{"type":"TextWhitespace","value":" "},
117+
{"type":"LiteralNumberBin","value":"#b10"},
118+
{"type":"TextWhitespace","value":" "},
119+
{"type":"Name","value":"+"},
120+
{"type":"TextWhitespace","value":" "},
121+
{"type":"LiteralNumberOct","value":"#o2"},
122+
{"type":"TextWhitespace","value":" "},
123+
{"type":"Name","value":"+"},
124+
{"type":"TextWhitespace","value":" "},
125+
{"type":"LiteralNumberHex","value":"#x02"},
126+
{"type":"Punctuation","value":";"},
127+
{"type":"TextWhitespace","value":"\n "},
128+
{"type":"Name","value":"format-out"},
129+
{"type":"Punctuation","value":"("},
130+
{"type":"LiteralString","value":"\"dog // cat"},
131+
{"type":"LiteralStringEscape","value":"\\n"},
132+
{"type":"LiteralString","value":"\""},
133+
{"type":"Punctuation","value":");"},
134+
{"type":"TextWhitespace","value":"\n "},
135+
{"type":"Name","value":"local"},
136+
{"type":"TextWhitespace","value":" "},
137+
{"type":"NameBuiltin","value":"method"},
138+
{"type":"TextWhitespace","value":" "},
139+
{"type":"NameVariable","value":"pi"},
140+
{"type":"TextWhitespace","value":" "},
141+
{"type":"Punctuation","value":"()"},
142+
{"type":"TextWhitespace","value":" "},
143+
{"type":"NameConstant","value":"$pi"},
144+
{"type":"TextWhitespace","value":" "},
145+
{"type":"Name","value":"end"},
146+
{"type":"Punctuation","value":";"},
147+
{"type":"TextWhitespace","value":"\n "},
148+
{"type":"Name","value":"pi"},
149+
{"type":"Punctuation","value":"()"},
150+
{"type":"TextWhitespace","value":"\n"},
151+
{"type":"Name","value":"end"},
152+
{"type":"TextWhitespace","value":" "},
153+
{"type":"NameBuiltin","value":"method"},
154+
{"type":"TextWhitespace","value":" "},
155+
{"type":"NameVariable","value":"foo-bar"},
156+
{"type":"Punctuation","value":";"},
157+
{"type":"TextWhitespace","value":"\n\n"},
158+
{"type":"CommentMultiline","value":"/*\n cow\n */"},
159+
{"type":"TextWhitespace","value":"\n"},
160+
{"type":"Name","value":"foo-bar"},
161+
{"type":"Punctuation","value":"("},
162+
{"type":"LiteralNumberInteger","value":"2"},
163+
{"type":"Punctuation","value":","},
164+
{"type":"TextWhitespace","value":" "},
165+
{"type":"KeywordConstant","value":"k:"},
166+
{"type":"TextWhitespace","value":" "},
167+
{"type":"Name","value":"k"},
168+
{"type":"Punctuation","value":","},
169+
{"type":"TextWhitespace","value":" "},
170+
{"type":"KeywordConstant","value":"a-b:"},
171+
{"type":"TextWhitespace","value":" "},
172+
{"type":"Name","value":"c"},
173+
{"type":"Punctuation","value":");"},
174+
{"type":"TextWhitespace","value":"\n"}
175+
]

0 commit comments

Comments
 (0)