344 lines
No EOL
9.2 KiB
YAML
344 lines
No EOL
9.2 KiB
YAML
%YAML 1.2
|
|
---
|
|
name: SunScript
|
|
file_extensions:
|
|
- sun
|
|
scope: source.sun
|
|
variables:
|
|
identifier: '[A-Za-z_][A-Za-z0-9_]*'
|
|
|
|
contexts:
|
|
main:
|
|
- include: statement
|
|
|
|
literal-keyword:
|
|
# loop
|
|
- match: \bbreak\b
|
|
scope: keyword.control.loop.sun
|
|
- match: \bcontinue\b
|
|
scope: keyword.control.loop.sun
|
|
- match: \breturn\b
|
|
scope: keyword.control.flow.sun
|
|
|
|
# flow
|
|
- match: \byield\b
|
|
scope: keyword.control.flow.sun
|
|
- match: \bexit\b
|
|
scope: keyword.control.flow.sun
|
|
- match: \block\b
|
|
scope: keyword.control.flow.sun
|
|
- match: \bunlock\b
|
|
scope: keyword.control.flow.sun
|
|
|
|
# storage
|
|
- match: \b(const|var|local)\b
|
|
scope: storage.type.sun
|
|
|
|
statement:
|
|
- include: comment
|
|
- include: statement-import
|
|
- include: statement-block
|
|
- include: conditional
|
|
- include: statement-builtin-declaration
|
|
- include: statement-function-definition
|
|
- include: expression
|
|
|
|
statement-import:
|
|
- match: \bimport\b
|
|
scope: keyword.control.import.sun
|
|
- include: literal-string
|
|
|
|
statement-block:
|
|
- match: '\}'
|
|
scope: meta.block.sun meta.brace.curly.sun
|
|
pop: true
|
|
- match: '\{'
|
|
scope: meta.brace.curly.sun
|
|
push:
|
|
- meta_scope: meta.block.sun
|
|
- include: statement
|
|
|
|
#############################################################################
|
|
## COMMENTS
|
|
#############################################################################
|
|
|
|
comment:
|
|
# block comments
|
|
- match: /\*
|
|
scope: punctuation.definition.comment.sun
|
|
push:
|
|
- meta_scope: comment.block.sun
|
|
- match: \*/
|
|
scope: punctuation.definition.comment.sun
|
|
pop: true
|
|
|
|
# line comments
|
|
- match: //
|
|
scope: punctuation.definition.comment.sun
|
|
push:
|
|
- meta_scope: comment.line.double-slash.sun
|
|
- match: \n
|
|
pop: true
|
|
|
|
#############################################################################
|
|
## CONDITIONALS
|
|
#############################################################################
|
|
|
|
conditional:
|
|
# do while
|
|
- match: \bdo\b
|
|
scope: keyword.control.loop.sun
|
|
push:
|
|
- meta_scope: meta.do-while.sun
|
|
- include: comment
|
|
- match: '\}'
|
|
scope: meta.brace.curly.sun
|
|
- match: '\{'
|
|
scope: meta.brace.curly.sun
|
|
push:
|
|
- meta_scope: meta.block.sun
|
|
- include: statement
|
|
- match: \bwhile\b
|
|
scope: keyword.control.loop.sun
|
|
- match: '\('
|
|
scope: meta.brace.round.sun
|
|
push:
|
|
- meta_scope: meta.group.braces.round.sun
|
|
- include: expression
|
|
- match: '\)'
|
|
scope: meta.group.braces.round.sun meta.brace.round.sun
|
|
pop: true
|
|
|
|
# for
|
|
- match: \bfor\b
|
|
scope: keyword.control.loop.sun
|
|
push:
|
|
- meta_scope: meta.for.sun
|
|
- include: parentheses-expression
|
|
- include: statement
|
|
|
|
# while
|
|
- match: \bwhile\b
|
|
scope: keyword.control.loop.sun
|
|
push:
|
|
- meta_scope: meta.while.sun
|
|
- include: parentheses-expression
|
|
- include: statement
|
|
|
|
# if / else if
|
|
- match: \b(else\s+if|if)\b
|
|
scope: keyword.control.conditional.sun
|
|
push:
|
|
- meta_scope: meta.conditional.sun
|
|
- include: parentheses-expression
|
|
- include: statement
|
|
|
|
# else
|
|
- match: \belse\b
|
|
scope: keyword.control.conditional.sun
|
|
push:
|
|
- meta_scope: meta.conditional.sun
|
|
- include: parentheses-expression
|
|
- include: statement
|
|
|
|
#############################################################################
|
|
## EXPRESSIONS
|
|
#############################################################################
|
|
|
|
expression:
|
|
- match: '(?=\))'
|
|
pop: true
|
|
- include: comment
|
|
|
|
- include: literal-keyword
|
|
- include: literal-operator
|
|
- include: literal-punctuation
|
|
|
|
- include: literal-call
|
|
|
|
- include: literal-constant
|
|
- include: literal-string
|
|
- include: literal-number
|
|
- include: literal-variable
|
|
|
|
- include: parentheses-expression
|
|
- include: brackets-expression
|
|
|
|
parentheses-expression:
|
|
- match: '\('
|
|
scope: meta.brace.round.sun
|
|
push:
|
|
- meta_scope: meta.group.braces.round.sun
|
|
- match: '\)'
|
|
scope: meta.brace.round.sun
|
|
pop: true
|
|
- include: expression
|
|
|
|
brackets-expression:
|
|
- match: '\['
|
|
scope: meta.brace.square.sun
|
|
push:
|
|
- meta_scope: meta.groupbraces.square.sun
|
|
- match: '\]'
|
|
scope: meta.brace.square.sun
|
|
pop: true
|
|
- include: expression
|
|
|
|
literal-operator:
|
|
# assignment
|
|
- match: (?x) =(?!=)
|
|
scope: keyword.operator.assignment.sun
|
|
|
|
# augment
|
|
- match: (?x) \+= | -= | \*= | /= | %= | &= | \|= | <<= | >>=
|
|
scope: keyword.operator.assignment.augmented.sun
|
|
|
|
# arithmetic
|
|
- match: (?x) \+\+ | -- | \+ | - | \* | / | %
|
|
scope: keyword.operator.arithmetic.sun
|
|
|
|
# logical
|
|
- match: (?x) !(?!=) | && | \|\|
|
|
scope: keyword.operator.logical.sun
|
|
|
|
# bitwise
|
|
- match: (?x) ~ | << | >> | & | \|
|
|
scope: keyword.operator.bitwise.sun
|
|
|
|
# relational
|
|
- match: (?x) <= | >= | < | >
|
|
scope: keyword.operator.relational.sun
|
|
|
|
# logical
|
|
- match: (?x) == | !=
|
|
scope: keyword.operator.comparison.sun
|
|
|
|
# ternary
|
|
- match: '\?|:'
|
|
scope: keyword.operator.ternary.sun
|
|
|
|
literal-punctuation:
|
|
- match: \;
|
|
scope: punctuation.terminator.statement.sun
|
|
- match: ","
|
|
scope: meta.delimiter.comma.sun
|
|
|
|
#############################################################################
|
|
## FUNCTIONS / BUILTINS
|
|
#############################################################################
|
|
|
|
statement-builtin-declaration:
|
|
- match: \b(builtin)\b
|
|
scope: meta.function.declaration.sun
|
|
captures:
|
|
1: storage.type.function.sun
|
|
push:
|
|
- match: \blocal\b
|
|
scope: storage.type.sun
|
|
- match: \bconst\b
|
|
scope: storage.type.sun
|
|
- match: '{{identifier}}'
|
|
scope: meta.function.declaration.sun entity.name.function.sun
|
|
- include: parameter-list
|
|
- match: ";"
|
|
pop: true
|
|
|
|
statement-function-definition:
|
|
- match: \b(function)\b
|
|
scope: meta.function.definition.sun
|
|
captures:
|
|
1: storage.type.function.sun
|
|
set:
|
|
- match: \blocal\b
|
|
scope: storage.type.sun
|
|
- match: \bconst\b
|
|
scope: storage.type.sun
|
|
- match: '{{identifier}}'
|
|
scope: meta.function.definition.sun entity.name.function.sun
|
|
- include: parameter-list
|
|
- match: '(?=\{)'
|
|
pop: true
|
|
|
|
parameter-list:
|
|
- match: \(
|
|
scope: punctuation.defintion.parameters.begin.sun
|
|
push:
|
|
- match: \)
|
|
scope: punctuation.definition.parameters.end.sun
|
|
pop: true
|
|
- match: \.{3}
|
|
scope: keyword.operator.spread.sun
|
|
- match: '{{identifier}}'
|
|
scope: variable.parameter.sun
|
|
- match: ','
|
|
scope: punctuation.separator.parameter.sun
|
|
- include: comment
|
|
|
|
argument-list:
|
|
- match: '\)'
|
|
scope: meta.brace.round.sun
|
|
pop: true
|
|
- match: '\('
|
|
scope: meta.brace.round.sun
|
|
push:
|
|
- match: '(?=\))'
|
|
pop: true
|
|
- include: expression
|
|
|
|
literal-call:
|
|
- match: '({{identifier}})(?=\s*\()'
|
|
scope: variable.function.sun
|
|
push:
|
|
- meta_scope: meta.function-call.sun
|
|
- include: argument-list
|
|
|
|
#############################################################################
|
|
## LITERALS
|
|
#############################################################################
|
|
|
|
literal-string:
|
|
- match: "'"
|
|
scope: punctuation.definition.string.begin.sun
|
|
push:
|
|
- meta_scope: string.quoted.single.sun
|
|
- match: (')|(\n)
|
|
captures:
|
|
1: unctuation.definition.string.end.sun
|
|
2: invalid.illegal.newline.sun
|
|
pop: true
|
|
- include: literal-string-escape
|
|
- match: '"'
|
|
scope: punctuation.definition.string.begin.sun
|
|
push:
|
|
- meta_scope: string.quoted.double.sun
|
|
- match: (")|(\n)
|
|
captures:
|
|
1: punctuation.definition.string.end.sun
|
|
2: invalid.illegal.newline.sun
|
|
pop: true
|
|
- include: literal-string-escape
|
|
|
|
literal-string-escape:
|
|
- match: '\\(''|"|\\|0|a|b|f|n|r|t|v|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})'
|
|
scope: constant.character.escape.sun
|
|
|
|
literal-number:
|
|
- match: \$[0-9A-Fa-f]{8} # address
|
|
scope: constant.numeric.sun
|
|
- match: \b[0-9]+\.[0-9]+ # decimal
|
|
scope: constant.numeric.sun
|
|
- match: \b0x[0-9A-Fa-f]+ # hexadecimal
|
|
scope: constant.numeric.sun
|
|
- match: \b[0-9]+ # integer
|
|
scope: constant.numeric.sun
|
|
|
|
literal-constant:
|
|
- match: \btrue\b
|
|
scope: constant.language.boolean.true.sun
|
|
- match: \bfalse\b
|
|
scope: constant.language.boolean.false.sun
|
|
|
|
literal-variable:
|
|
- match: '{{identifier}}'
|
|
scope: variable.other.readwrite.sun
|
|
|