%YAML 1.2 --- # NotesCraft's own Elixir grammar. Original work written for this project; not copied # from any other grammar. Regexes stay linear: no nested quantifiers, so nothing backtracks far. # Strings end at their line unless the language allows multi-line ones. name: Elixir file_extensions: [ex, exs] scope: source.elixir contexts: main: - match: '#.*' scope: comment.line - match: '@\w+' scope: entity.other.attribute-name - match: '"""' scope: punctuation.definition.string.begin push: str-tdq - match: '"' scope: punctuation.definition.string.begin push: str-dq - match: '''' scope: punctuation.definition.string.begin push: str-sq - match: '\b(?:after|alias|and|case|catch|cond|def|defdelegate|defexception|defguard|defimpl|defmacro|defmodule|defp|defprotocol|defstruct|do|else|end|fn|for|if|import|in|not|or|quote|raise|receive|require|rescue|reraise|super|throw|try|unless|unquote|use|when|with)\b' scope: keyword.control - match: '\b(?:true|false|nil)\b' scope: constant.language - match: '\b(?:0[xX][0-9a-fA-F_]+|0[bB][01_]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[eE][+-]?\d+)?)\b' scope: constant.numeric - match: '\b[A-Za-z_]\w*(?=\s*\()' scope: entity.name.function - match: '\b[A-Z][A-Za-z0-9_]*\b' scope: entity.name.type - match: '[-+*/%=<>!&|^~?:]+' scope: keyword.operator str-tdq: - meta_scope: string.quoted.triple - match: '\\.' scope: constant.character.escape - match: '"""' scope: punctuation.definition.string.end pop: true str-dq: - meta_scope: string.quoted.double - match: '\\.' scope: constant.character.escape - match: '"' scope: punctuation.definition.string.end pop: true - match: '(?=\n)' pop: true str-sq: - meta_scope: string.quoted.single - match: '\\.' scope: constant.character.escape - match: '''' scope: punctuation.definition.string.end pop: true - match: '(?=\n)' pop: true