%YAML 1.2 --- name: anselme v2 file_extensions: - ans - anselme scope: source.anselme version: 2 variables: identifier_disallowed: '\.\~\`\^\+\-\=\<\>\/\[\]\*\{\}\|\\\_\!\?\,\;\:\(\)\"\@\&\$\#\%' identifier: |- (?x: [^0-9\s\'{{identifier_disallowed}}][^{{identifier_disallowed}}]* |\_( \! | \- | \* | \~ ) |( \! )\_ |\_( \|\> | \+ | \- | \/ | \/\/ | \* | \^ | \% | \& | \| | \=\= | \= | \!\= | \>\= | \<\= | \< | \> | \~ | \~\? | \. | \:\: | \# | \: )\_ ) contexts: prototype: - match: '\/\*' scope: comment.line.anselme punctuation.definition.comment.anselme push: comment - match: '\s+' - match: '$' pop: true main: - match: '' push: primary comment: - meta_scope: comment.line.anselme - match: '\/\*' scope: punctuation.definition.comment.anselme push: comment - match: '\*\/|$' scope: punctuation.definition.comment.anselme pop: true ## Primary elements ## primary: - match: '\d*\.\d+|\d+' scope: constant.numeric.anselme push: secondary - match: '\"' scope: punctuation.definition.string.begin.anselme push: string - match: '\|' scope: keyword.other.anselme push: text - match: '\(' scope: punctuation.section.parens.begin.anselme push: parenthesis - match: '\::?&?@?\$' scope: keyword.declaration.anselme push: function_definition - match: '(\#)({{identifier}})' captures: 1: keyword.declaration.anselme 2: entity.name.label.anselme push: secondary - match: '(\::?&?@?)({{identifier}})' captures: 1: keyword.declaration.anselme 2: variable.other.anselme push: secondary - match: '{{identifier}}(?=\!(?!\s*{{identifier}})|\()' scope: variable.function.anselme set: secondary - match: '{{identifier}}' scope: variable.other.anselme push: secondary - match: '\_' scope: variable.language.anselme push: secondary - match: '\[' scope: punctuation.section.sequence.begin.anselme push: tuple - match: '\{' scope: punctuation.section.sequence.mapping.anselme push: struct - include: prefixes_primary - match: '' pop: true prefixes_primary: - match: '(\$)\s*(\()' captures: 1: meta.function.anselme keyword.declaration.anselme 2: meta.function.parameters.anselme punctuation.section.parameters.begin.anselme push: function_parameters - match: '\$' scope: keyword.declaration.anselme meta.function.anselme set: primary - match: '\~' scope: keyword.control.conditional.anselme set: primary - match: '\@|\;' scope: keyword.control.anselme set: primary - match: '\-' scope: keyword.operator.arithmetic.anselme set: primary - match: '\!' scope: keyword.operator.logical.anselme set: primary - match: '\*|\%|\>' scope: keyword.operator.anselme set: primary ## Function definition ## # The parameter parsing here is a very bad approximation, but properly handling this would require handling operator priority in this syntax file, so no. # Maybe I should look at tree sitter or something. function_parameters: - meta_scope: meta.function.parameters.anselme - match: '{{identifier}}' scope: variable.parameter.anselme embed: secondary escape: '(?=\)|\,)' - match: '\,' scope: punctuation.separator.parameters.anselme - match: '(\))\s*(\=)' captures: 1: punctuation.section.parameters.end.anselme 2: keyword.operator.assignment.anselme push: secondary - match: '\)' scope: punctuation.section.parameters.end.anselme push: secondary - match: '' pop: true function_definition: - match: '({{identifier}})\s*(\()' captures: 1: meta.function.parameters.anselme entity.name.function.anselme 2: meta.function.parameters.anselme punctuation.section.parameters.begin.anselme set: function_parameters - match: '{{identifier}}' scope: meta.function.parameters.anselme entity.name.function.anselme pop: true - match: '' pop: true ## String & text ## expression_interpolation: - match: '\{' scope: punctuation.section.interpolation.begin.anselme embed: primary embed_scope: source.anselme.embedded escape: '\}' escape_captures: 0: punctuation.section.interpolation.end.anselme character_escape: - match: '\\.' scope: constant.character.escape.anselme string: - meta_scope: meta.string.anselme string.quoted.double.anselme - include: expression_interpolation - include: character_escape - match: '\"' scope: punctuation.definition.string.end.anselme set: secondary text: - meta_scope: text.anselme - include: expression_interpolation - include: character_escape - match: '\|' scope: keyword.other.anselme set: secondary ## Other primary elements ## parenthesis: - meta_scope: meta.parens.anselme - match: '\)' scope: punctuation.section.parens.end.anselme set: secondary - include: primary tuple: - meta_scope: meta.sequence.tuple.anselme - include: primary - match: '\,' scope: punctuation.separator.sequence.anselme - match: '\]' scope: punctuation.section.sequence.end.anselme set: secondary struct: - meta_scope: meta.mapping.anselme - include: primary - match: '\,' scope: punctuation.separator.sequence.anselme - match: '\}' scope: punctuation.section.mapping.end.anselme set: secondary ## Secondary operators ## secondary: - match: '\;' scope: keyword.control.anselme push: primary - match: '\,' scope: punctuation.separator.sequence.anselme push: primary - match: '\~|\~\?|\|\>' scope: keyword.control.conditional.anselme push: primary - match: '\#|\:\:|\:|\-\>' scope: keyword.operator.anselme push: primary - match: '\&|\|' scope: keyword.operator.logical.anselme push: primary - match: '\=\=|\!\=|\<\=|\>\=|\<|\>' scope: keyword.operator.comparison.anselme push: primary - match: '\+|\-|\*|\/\/|\/|\%|\^' scope: keyword.operator.arithmetic.anselme push: primary - match: '\.' scope: punctuation.accessor.anselme push: primary - match: '(\!)\s*({{identifier}})' scope: meta.function-call captures: 1: keyword.operaor.anselme 2: variable.function.anselme set: secondary - match: '\!' scope: keyword.operaor.anselme push: primary - match: '\=' scope: keyword.operator.assignment.anselme push: primary - include: suffix_secondary - match: '' pop: true suffix_secondary: - match: '\;' scope: keyword.control.anselme set: secondary - match: '\!' scope: keyword.operator.anselme set: secondary - match: '\(' scope: punctuation.section.arguments.begin.anselme set: - match: '\)' scope: punctuation.section.arguments.end.anselme set: secondary - include: primary