diff --git a/README.md b/README.md index 25af3e095..6c347a0be 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ translators for Pygments lexers and styles. | E | EBNF, Elixir, Elm, EmacsLisp, Erlang | | F | Factor, Fennel, Fish, Forth, Fortran, FortranFixed, FSharp | | G | GAS, GDScript, Genshi, Genshi HTML, Genshi Text, Gherkin, GLSL, Gnuplot, Go, Go HTML Template, Go Text Template, GraphQL, Groff, Groovy | -| H | Handlebars, Haskell, Haxe, HCL, Hexdump, HLB, HLSL, HolyC, HTML, HTTP, Hy | +| H | Handlebars, Hare, Haskell, Haxe, HCL, Hexdump, HLB, HLSL, HolyC, HTML, HTTP, Hy | | I | Idris, Igor, INI, Io, ISCdhcpd | | J | J, Java, JavaScript, JSON, Julia, Jungle | | K | Kotlin | diff --git a/lexers/embedded/hare.xml b/lexers/embedded/hare.xml new file mode 100644 index 000000000..ea6364228 --- /dev/null +++ b/lexers/embedded/hare.xml @@ -0,0 +1,98 @@ + + + Hare + hare + *.ha + text/x-hare + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lexers/testdata/hare.actual b/lexers/testdata/hare.actual new file mode 100644 index 000000000..775d2f7d4 --- /dev/null +++ b/lexers/testdata/hare.actual @@ -0,0 +1,32 @@ +// test comment +use bufio::*; +use fmt, os::exec = exec; +use time; + +type foo = struct { + bar: str, + baz: time::duration, +}; + +export type e = enum u8 { + a, b, c +}; + +const arr: [_]foo= [ + foo { bar = "This is a \"string\"!", baz = 25 * time::MINUTE }, + foo { bar = `This is also a +string`, baz = 5 * time::SECOND}, +]; + +let c = 'a'; // char +let d = 0b1010u16; +let e: size = 32z; +let g = 0xffa31u32 + 0o3u32; + +export fn main() void = { + fmt::println("{}", size(int))!; + + for (let i = 0z; i < 5; i += 1) { + fmt::println("{}", i); + }; +}; diff --git a/lexers/testdata/hare.expected b/lexers/testdata/hare.expected new file mode 100644 index 000000000..9c5649759 --- /dev/null +++ b/lexers/testdata/hare.expected @@ -0,0 +1,259 @@ +[ + {"type":"CommentSingle","value":"// test comment\n"}, + {"type":"KeywordNamespace","value":"use"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"bufio"}, + {"type":"Operator","value":"::*"}, + {"type":"Punctuation","value":";"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"KeywordNamespace","value":"use"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"fmt"}, + {"type":"Punctuation","value":","}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"os"}, + {"type":"Operator","value":"::"}, + {"type":"Name","value":"exec"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"exec"}, + {"type":"Punctuation","value":";"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"KeywordNamespace","value":"use"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"time"}, + {"type":"Punctuation","value":";"}, + {"type":"TextWhitespace","value":"\n\n"}, + {"type":"Keyword","value":"type"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"foo"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"Keyword","value":"struct"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Punctuation","value":"{"}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"Name","value":"bar"}, + {"type":"Operator","value":":"}, + {"type":"TextWhitespace","value":" "}, + {"type":"KeywordType","value":"str"}, + {"type":"Punctuation","value":","}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"Name","value":"baz"}, + {"type":"Operator","value":":"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"time"}, + {"type":"Operator","value":"::"}, + {"type":"Name","value":"duration"}, + {"type":"Punctuation","value":","}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"Punctuation","value":"};"}, + {"type":"TextWhitespace","value":"\n\n"}, + {"type":"Keyword","value":"export"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Keyword","value":"type"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"e"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"Keyword","value":"enum"}, + {"type":"TextWhitespace","value":" "}, + {"type":"KeywordType","value":"u8"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Punctuation","value":"{"}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"Name","value":"a"}, + {"type":"Punctuation","value":","}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"b"}, + {"type":"Punctuation","value":","}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"c"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"Punctuation","value":"};"}, + {"type":"TextWhitespace","value":"\n\n"}, + {"type":"Keyword","value":"const"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"arr"}, + {"type":"Operator","value":":"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Punctuation","value":"["}, + {"type":"Keyword","value":"_"}, + {"type":"Punctuation","value":"]"}, + {"type":"Name","value":"foo"}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"Punctuation","value":"["}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"Name","value":"foo"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Punctuation","value":"{"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"bar"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralString","value":"\"This is a "}, + {"type":"LiteralStringEscape","value":"\\\""}, + {"type":"LiteralString","value":"string"}, + {"type":"LiteralStringEscape","value":"\\\""}, + {"type":"LiteralString","value":"!\""}, + {"type":"Punctuation","value":","}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"baz"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralNumberInteger","value":"25"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"*"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"time"}, + {"type":"Operator","value":"::"}, + {"type":"Name","value":"MINUTE"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Punctuation","value":"},"}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"Name","value":"foo"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Punctuation","value":"{"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"bar"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralString","value":"`This is also a\nstring`"}, + {"type":"Punctuation","value":","}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"baz"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralNumberInteger","value":"5"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"*"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"time"}, + {"type":"Operator","value":"::"}, + {"type":"Name","value":"SECOND"}, + {"type":"Punctuation","value":"},"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"Punctuation","value":"];"}, + {"type":"TextWhitespace","value":"\n\n"}, + {"type":"Keyword","value":"let"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"c"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralStringChar","value":"'a'"}, + {"type":"Punctuation","value":";"}, + {"type":"TextWhitespace","value":" "}, + {"type":"CommentSingle","value":"// char\n"}, + {"type":"Keyword","value":"let"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"d"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralNumberBin","value":"0b1010u16"}, + {"type":"Punctuation","value":";"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"Keyword","value":"let"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"e"}, + {"type":"Operator","value":":"}, + {"type":"TextWhitespace","value":" "}, + {"type":"KeywordType","value":"size"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralNumberInteger","value":"32z"}, + {"type":"Punctuation","value":";"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"Keyword","value":"let"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"g"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralNumberHex","value":"0xffa31u32"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"+"}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralNumberOct","value":"0o3u32"}, + {"type":"Punctuation","value":";"}, + {"type":"TextWhitespace","value":"\n\n"}, + {"type":"Keyword","value":"export"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Keyword","value":"fn"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"main"}, + {"type":"Punctuation","value":"()"}, + {"type":"TextWhitespace","value":" "}, + {"type":"KeywordType","value":"void"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"Punctuation","value":"{"}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"Name","value":"fmt"}, + {"type":"Operator","value":"::"}, + {"type":"Name","value":"println"}, + {"type":"Punctuation","value":"("}, + {"type":"LiteralString","value":"\"{}\""}, + {"type":"Punctuation","value":","}, + {"type":"TextWhitespace","value":" "}, + {"type":"Keyword","value":"size"}, + {"type":"Punctuation","value":"("}, + {"type":"KeywordType","value":"int"}, + {"type":"Punctuation","value":"))"}, + {"type":"Operator","value":"!"}, + {"type":"Punctuation","value":";"}, + {"type":"TextWhitespace","value":"\n\n\t"}, + {"type":"Keyword","value":"for"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Punctuation","value":"("}, + {"type":"Keyword","value":"let"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"i"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"="}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralNumberInteger","value":"0z"}, + {"type":"Punctuation","value":";"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"i"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"\u003c"}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralNumberInteger","value":"5"}, + {"type":"Punctuation","value":";"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"i"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Operator","value":"+="}, + {"type":"TextWhitespace","value":" "}, + {"type":"LiteralNumberInteger","value":"1"}, + {"type":"Punctuation","value":")"}, + {"type":"TextWhitespace","value":" "}, + {"type":"Punctuation","value":"{"}, + {"type":"TextWhitespace","value":"\n\t\t"}, + {"type":"Name","value":"fmt"}, + {"type":"Operator","value":"::"}, + {"type":"Name","value":"println"}, + {"type":"Punctuation","value":"("}, + {"type":"LiteralString","value":"\"{}\""}, + {"type":"Punctuation","value":","}, + {"type":"TextWhitespace","value":" "}, + {"type":"Name","value":"i"}, + {"type":"Punctuation","value":");"}, + {"type":"TextWhitespace","value":"\n\t"}, + {"type":"Punctuation","value":"};"}, + {"type":"TextWhitespace","value":"\n"}, + {"type":"Punctuation","value":"};"}, + {"type":"TextWhitespace","value":"\n"} +]