diff --git a/syntax/CurlyWASM.sublime-syntax b/syntax/CurlyWASM.sublime-syntax new file mode 100644 index 0000000..7d61646 --- /dev/null +++ b/syntax/CurlyWASM.sublime-syntax @@ -0,0 +1,231 @@ +%YAML 1.2 +--- +# ========================================================== +# http://www.sublimetext.com/docs/syntax.html +# created by: zbyti & various AI +# ========================================================== +# For best results, use with Rust-themed color schemes like: +# - "RustEnhanced" +# - "Atomized" +# - "Solarized Rust" +# ========================================================== +name: CurlyWASM +file_extensions: [cwa] +scope: source.curlywasm + +contexts: + main: + # Comments + - match: /\* + scope: comment.block.curlywasm + push: block_comment + - match: // + scope: comment.line.curlywasm + push: line_comment + + # Module system + - match: \b(import|include|export)\b + scope: keyword.control.import.curlywasm + + # Declarations and definitions + - match: \b(fn)\b + scope: keyword.declaration.function.curlywasm + + - match: \b(const)\b + scope: storage.modifier.const.curlywasm + + - match: \b(global|mut|let|lazy|inline)\b + scope: storage.modifier.curlywasm + + # Control flow + - match: \b(return|if|else|loop|block|branch|branch_if|break)\b + scope: keyword.control.flow.curlywasm + + # Type conversion + - match: \b(as)\b + scope: keyword.operator.type.curlywasm + + # WASM memory access operators + - match: \b(load|load8_s|store)\b + scope: keyword.operator.memory.curlywasm + + # API functions + - match: \b(sin|cos|tan|asin|acos|atan|atan2|pow|log|fmod|random|randomf|randomSeed|cls|setPixel|getPixel|hline|rectangle|circle|line|time|isButtonPressed|isButtonTriggered|printChar|printString|printInt|setTextColor|setBackgroundColor|setCursorPosition|rectangleOutline|circleOutline|exp|playNote|sndGes|blitSprite|grabSprite)\b + scope: support.function.curlywasm + + # Built-in functions + - match: \b(sqrt|min|max|ceil|floor|trunc|nearest|abs|copysign|select|trunc_sat_f32_u)\b + scope: support.function.curlywasm + + # Data blocks - Match 'data {' together and push context + - match: \b(data)\s*(\{) + captures: + 1: storage.type.data.curlywasm + 2: punctuation.section.block.begin.curlywasm + push: data_content + + # Base types + - match: \b(i8|i16|i32|i64|f32|f64)\b + scope: storage.type.primitive.curlywasm + + # Memory access operators + - match: (\?|\$|\!) + scope: keyword.operator.memory.curlywasm + + # Operators + - match: (->) + scope: keyword.operator.arrow.curlywasm + + # Assignment operators + - match: (=|:=|\+=|-=|\*=|/=|%=|&=|\|=|\^=|#/=) + scope: keyword.operator.assignment.curlywasm + + # Arithmetic operators + - match: (\+|-|\*|/|%|#/|#%) + scope: keyword.operator.arithmetic.curlywasm + + # Bitwise operators + - match: (\&|\||\^|<<|>>|#>>) + scope: keyword.operator.bitwise.curlywasm + + # Comparison operators + - match: (<|>|<=|>=|#<|#<=|#>|#>=|==|!=) + scope: keyword.operator.comparison.curlywasm + + # Other operators + - match: (<\|) + scope: keyword.operator.misc.curlywasm + + # Numeric literals + - match: \b(0x[0-9a-fA-F]+)\b + scope: constant.numeric.hex.curlywasm + + - match: '\b\d+(_f)\b' + scope: constant.numeric.float.curlywasm + + - match: \b([0-9]+\.[0-9]+)\b + scope: constant.numeric.float.curlywasm + + - match: \b([0-9]+)\b + scope: constant.numeric.integer.curlywasm + + # String literals + - match: \" + scope: punctuation.definition.string.begin.curlywasm + push: double_quoted_string + - match: \' + scope: punctuation.definition.string.begin.curlywasm + push: single_quoted_string + + # Function calls + - match: \b([a-zA-Z_][a-zA-Z0-9_]*)\s*\( + captures: + 1: entity.name.function.call.curlywasm + + # Function declarations + - match: \bfn\s+([a-zA-Z_][a-zA-Z0-9_]*)\b + captures: + 1: entity.name.function.declaration.curlywasm + + # Constants (Upper case convention) + - match: \b([A-Z_][A-Z0-9_]*)\b + scope: constant.other.curlywasm + + # Variables (Lower case convention) + - match: \b([a-z_][a-zA-Z0-9_]*)\b + scope: variable.other.curlywasm + + # Punctuation + - match: \{ + scope: punctuation.section.block.begin.curlywasm + - match: \} + scope: punctuation.section.block.end.curlywasm + - match: \( + scope: punctuation.section.group.begin.curlywasm + - match: \) + scope: punctuation.section.group.end.curlywasm + - match: \[ + scope: punctuation.section.brackets.begin.curlywasm + - match: \] + scope: punctuation.section.brackets.end.curlywasm + - match: ; + scope: punctuation.terminator.curlywasm + - match: \, + scope: punctuation.separator.curlywasm + - match: ':' + scope: punctuation.separator.type.curlywasm + + # Context for /* ... */ block comments + block_comment: + - meta_scope: comment.block.curlywasm + - match: \*/ + scope: punctuation.definition.comment.end.curlywasm + pop: true + + # Context for // ... line comments + line_comment: + - meta_scope: comment.line.double-slash.curlywasm + - match: $ # Pop at the end of the line + pop: true + + # Context for "..." strings + double_quoted_string: + - meta_scope: string.quoted.double.curlywasm + - match: \" + scope: punctuation.definition.string.end.curlywasm + pop: true + - match: \\. # Escape sequences + scope: constant.character.escape.curlywasm + + # Context for '...' strings + single_quoted_string: + - meta_scope: string.quoted.single.curlywasm + - match: \' + scope: punctuation.definition.string.end.curlywasm + pop: true + - match: \\. # Escape sequences + scope: constant.character.escape.curlywasm + + # Context for the content inside data { ... } + data_content: + - meta_scope: meta.data.content.curlywasm + # Match the closing brace to pop the context + - match: \} + scope: punctuation.section.block.end.curlywasm + pop: true + # Include rules for literals within the data block + - include: literals + # Specific types/keywords allowed inside data blocks + - match: \b(i8|i16|i32|i64|f32|f64)\b + scope: storage.type.primitive.curlywasm + - match: \b(file)\b + scope: keyword.control.curlywasm + # Punctuation inside data blocks + - match: \( + scope: punctuation.section.group.begin.curlywasm + - match: \) + scope: punctuation.section.group.end.curlywasm + - match: \, + scope: punctuation.separator.curlywasm + # Potentially allow comments inside data blocks + - include: block_comment + - include: line_comment + + # Reusable patterns for literals (used via include) + literals: + # Numeric literals + - match: \b(0x[0-9a-fA-F]+)\b + scope: constant.numeric.hex.curlywasm + - match: '\b\d+(_f)\b' + scope: constant.numeric.float.curlywasm + - match: \b([0-9]+\.[0-9]+)\b + scope: constant.numeric.float.curlywasm + - match: \b([0-9]+)\b + scope: constant.numeric.integer.curlywasm + # String literals + - match: \" + scope: punctuation.definition.string.begin.curlywasm + push: double_quoted_string + - match: \' + scope: punctuation.definition.string.begin.curlywasm + push: single_quoted_string