Created
January 28, 2025 06:28
-
-
Save hyrious/0eaccc0f316cebb9291c32b3bf09f689 to your computer and use it in GitHub Desktop.
Basic MoonBit syntax highlighting support in Sublime Text
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%YAML 1.2 | |
--- | |
# - https://www.sublimetext.com/docs/syntax.html | |
# - https://docs.moonbitlang.com/en/latest/language/introduction.html | |
# - https://github.com/moonbitlang/moonbit-docs/blob/main/next/_ext/lexer.py | |
file_extensions: | |
- mbt | |
first_line_match: |- | |
(?xi: | |
^ \s* // .*? -\*- .*? \bmoonbit\b .*? -\*- # editorconfig | |
) | |
name: MoonBit | |
scope: source.moonbit | |
version: 2 | |
variables: | |
# https://docs.moonbitlang.com/en/latest/language/introduction.html#naming-conventions | |
ident_lower: '[a-z][\w_]*' | |
ident_upper: '[A-Z][\w_]*' | |
escaped_char: '\\(?:[nrtb\"''\\]|x[0-7]\h|o[0-3][0-7]{2}|u\{(?:\h_*){1,6}\})' | |
int_suffixes: '[uUlL]+' | |
dec_literal: '\d[\d_]*' | |
hex_literal: '\h[\h_]*' | |
float_exponent: '[eE][+-]?{{dec_literal}}' | |
float_power: '[pP][+-]?{{dec_literal}}' | |
contexts: | |
prototype: | |
- include: comments | |
main: | |
- include: statements | |
comments: | |
- include: line-comments | |
line-comments: | |
- match: /// | |
scope: punctuation.definition.comment.moonbit | |
push: doc-comment-body | |
- match: // | |
scope: punctuation.definition.comment.moonbit | |
push: line-comment-body | |
# https://docs.moonbitlang.com/en/latest/language/docs.html | |
doc-comment-body: | |
- meta_include_prototype: false | |
- meta_scope: comment.block.documentation.moonbit | |
- match: $\n? | |
pop: true | |
- match: '@\w+' | |
scope: entity.other.attribute-name.documentation.moonbit | |
line-comment-body: | |
- meta_include_prototype: false | |
- meta_scope: comment.line.double-slash.moonbit | |
- match: $\n? | |
pop: true | |
statements: | |
- include: expressions | |
expressions: | |
- include: function-identifiers | |
- include: strings | |
- include: keywords | |
- include: numbers | |
- include: operators | |
function-identifiers: | |
- match: '{{ident_lower}}(?=!?\s*\()' | |
scope: variable.function.moonbit | |
keywords: | |
- include: bool | |
- match: \b(Eq|Compare|Hash|Show|Default|ToJson|FromJson)\b | |
scope: support.type.builtin.moonbit | |
- match: \b(Array|FixedArray|Int|Int64|UInt|UInt64|Option|Result|Byte|Bool|Unit|String|Float|Double)\b | |
scope: support.type.builtin.moonbit | |
- match: \b(extern|test|init|as)\b | |
scope: keyword.other.moonbit | |
- match: \bself\b | |
scope: keyword.other.moonbit | |
- match: \bSelf\b | |
scope: storage.type.moonbit | |
- match: \blet\b | |
scope: keyword.declaration.variable.moonbit | |
- match: \b(const|mut)\b | |
scope: storage.modifier.moonbit | |
- match: \b(pub\(all\)|pub\(open\)|pub\(readonly\)|pub|priv)\b | |
scope: storage.modifier.moonbit | |
- match: \bfn\b | |
scope: keyword.declaration.function.moonbit | |
- match: '\b(impl|with|derive)\b' | |
scope: keyword.declaration.impl.moonbit | |
- match: \b(type!?|enum|struct|trait|typealias)\b | |
scope: keyword.declaration.type.moonbit | |
- match: \b(guard|else|for|if|loop|match|while|in)\b | |
scope: keyword.control.moonbit | |
- match: \b(try|catch!?|raise)\b | |
scope: keyword.control.moonbit | |
- match: \b(break|continue)\b | |
scope: keyword.control.moonbit | |
- match: \breturn\b | |
scope: keyword.control.moonbit | |
# https://docs.moonbitlang.com/en/latest/language/fundamentals.html#boolean | |
bool: | |
- match: \bfalse\b | |
scope: constant.language.boolean.false.moonbit | |
- match: \btrue\b | |
scope: constant.language.boolean.true.moonbit | |
# https://docs.moonbitlang.com/en/latest/language/fundamentals.html#number | |
numbers: | |
- include: floats | |
- include: integers | |
floats: | |
- match: '\b0x{{hex_literal}}\.(?:{{hex_literal}})?(?:{{float_exponent}})?(?:{{float_power}})?' | |
scope: constant.numeric.float.moonbit | |
- match: '\b{{dec_literal}}\.(?:{{dec_literal}})?(?:{{float_exponent}})?(?:{{float_power}})?' | |
scope: constant.numeric.float.moonbit | |
integers: | |
- match: '\b({{dec_literal}})({{int_suffixes}})?\b' | |
captures: | |
1: constant.numeric.integer.decimal.moonbit | |
2: storage.type.numeric.moonbit | |
- match: '\b(0x{{hex_literal}})({{int_suffixes}})?\b' | |
captures: | |
1: constant.numeric.integer.hexadecimal.moonbit | |
2: storage.type.numeric.moonbit | |
- match: '\b(0o[0-7][0-7_]*)({{int_suffixes}})?\b' | |
captures: | |
1: constant.numeric.integer.octal.moonbit | |
2: storage.type.numeric.moonbit | |
- match: '\b(0b[0-1][0-1_]*)({{int_suffixes}})?\b' | |
captures: | |
1: constant.numeric.integer.binary.moonbit | |
2: storage.type.numeric.moonbit | |
# https://docs.moonbitlang.com/en/latest/language/fundamentals.html#string | |
strings: | |
- match: '"' | |
scope: punctuation.definition.string.begin.moonbit | |
push: string-content | |
- match: '#\|' | |
scope: punctuation.definition.string.begin.moonbit | |
push: raw-string-content | |
- match: '\$\|' | |
scope: punctuation.definition.string.begin.moonbit | |
push: escape-string-content | |
escape-string-content: | |
- meta_include_prototype: false | |
- meta_scope: string.unquoted.moonbit | |
- match: $\n? | |
pop: true | |
- include: string-interpolations | |
- include: escaped-chars | |
raw-string-content: | |
- meta_include_prototype: false | |
- meta_scope: string.unquoted.moonbit | |
- match: $\n? | |
pop: true | |
string-content: | |
- meta_include_prototype: false | |
- meta_scope: string.quoted.double.moonbit | |
- match: '"' | |
scope: punctuation.definition.string.end.moonbit | |
pop: true | |
- include: string-interpolations | |
- include: escaped-chars | |
string-interpolations: | |
- match: '\\{' | |
scope: punctuation.section.interpolation.begin.moonbit | |
push: string-interpolation-content | |
string-interpolation-content: | |
- clear_scopes: true | |
- meta_scope: meta.interpolation.moonbit | |
- meta_content_scope: source.moonbit.embedded | |
- match: '}' | |
scope: punctuation.section.interpolation.end.moonbit | |
pop: true | |
- include: expressions | |
escaped-chars: | |
- match: '{{escaped_char}}' | |
scope: constant.character.escape.moonbit | |
operators: | |
- match: '=>' | |
scope: keyword.control.moonbit | |
- match: '->' | |
scope: storage.type.function.arrow.moonbit | |
- match: ':(?!:)' | |
scope: punctuation.separator.moonbit | |
push: maybe-types | |
- match: '=(?!=)' | |
scope: keyword.operator.assignment.moonbit | |
- match: '\.\.<|\.\.=|\.\.(?!\.)' | |
scope: keyword.operator.range.moonbit | |
- match: ',' | |
scope: punctuation.separator.moonbit | |
- match: '{' | |
scope: punctuation.section.block.begin.moonbit | |
- match: '}' | |
scope: punctuation.section.block.end.moonbit | |
- match: '\+|-|\*|\/|%|\|>|>>|<<|&&|\|\||\&|\||<|>|==' | |
scope: keyword.operator.moonbit | |
- match: \b(not|lsl|lsr|asr|op_add|op_sub|op_div|op_mul|op_mod|\.\.\.)\b | |
scope: keyword.operator.word.moonbit | |
maybe-types: | |
- match: '(?=,|\)|\]|\}|\|)' | |
pop: true | |
- match: '{{ident_upper}}' | |
scope: storage.type.moonbit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment