diff --git a/grammars/kickass.cson b/grammars/kickass.cson new file mode 100644 index 0000000..c94829b --- /dev/null +++ b/grammars/kickass.cson @@ -0,0 +1,173 @@ +scopeName: 'source.assembly.6502.kickass' +name: 'Kick Assembler' + +fileTypes: [ + 'a' + 'asm' + 's' + 'S' +] + +patterns: [ + { include: 'source.65c02-opcodes' } + { include: 'source.6502x-opcodes' } + { include: '#comments' } + { include: '#directives' } + { include: '#symbols' } + +] + +repository: + comments: + patterns: [ + { + match: '(\\/\\/[^\\n]+)' + name: 'comment.line' + } + { + begin: '\\/\\*' + end: '\\*\\/' + name: 'comment.block' + } + ] + symbols: + patterns: [ + + # =============================================================== + # Assembler symbols + { # Labels + name: 'entity.name.function.kickass' + match: '^\\s*[!a-zA-Z_][a-zA-Z0-9_]*:' + } + { # Variable functions, like var.getValue() + match: '(\\w+(?=\\())' + name: 'entity.name.function.kickass' + } + + # =============================================================== + # Data types + { # Chars + match: "\\'\\S\\'" + name: 'string.char.kickass' + } + { # Strings + name: 'string.quoted.kickass' + begin: '"' + end: '"' + } + + { # Hex numbers + match: '-?\\$[A-Fa-f0-9]+' + name: 'constant.numeric.hex.kickass' + } + { # Octals + match: '@([0-7]+)\\b' + name: 'constant.numeric.octal.merlin' + } + { # Binary numbers + match: '%[01]+' + name: 'constant.numeric.binary.merlin' + } + { # Decimal numbers + match: '\\b([0-9]+)\\b' + name: 'constant.numeric.decimal.merlin' + } + + { # Operators + match: '[-+/*^><|#\\[\\](),=.!&]' + name: 'keyword.operator.kickass' + } + { # Immediate values + match: '\\#(\'.\'|[^\\s\']+)' + name: 'constant.numeric.hex.kickass' + } + { # Constants + match: '\\b([_A-Z]+)\\b' + name: 'variable.kickass' + } + ] + directives: + patterns: [ + + # =============================================================== + # Preprocessor directives + { + match: '(\\#)((?:define|undef))([\\s\\w]+)' + captures: + 1: name: 'keyword.control.directive.kickass' + 2: name: 'keyword.control.directive.kickass' + 3: name: 'variable.kickass' + } + { + match: '(\\#)((?:endif|el(se|if)|if|importif))([\\s\\w]+)' + captures: + 1: name: 'keyword.control.directive.kickass' + 2: name: 'keyword.control.directive.kickass' + 4: name: 'variable.kickass' + } + { + match: '(\\#)((import(once)?))([\\s\\w]+)' + name: 'keyword.control.directive.kickass' + } + + # =============================================================== + # Assembler directive conditionals + { + match: '(\\.)((?:elif|if))' + captures: + 1: name: 'keyword.control.directive.kickass' + 2: name: 'keyword.control.directive.kickass' + } + { + match: '(\\}?(\\s+)?)(else)' + captures: + 3: name: 'keyword.control.directive.kickass' + } + + # =============================================================== + # Assembler directives misc + { # Assembler directives that have inconsistant syntax + match: '(\\.)((?:return|namespace|print(now)?|by(te)?|align|assert(error)?|break|disk|dw(ord)?|encoding|enum|error(if)?|file(modify|namespace)?|fill(word)?|for|lohifill|memblock|modify|pc|plugin|pseudopc|segment(def|out)?|struct|te(xt)?|while|wo(rd)?|zp|import( binary| c64| source| text|once)))\\b' + name: 'keyword.control.directive.kickass' + } + { + match: '(\\}?(\\s+)?)(else)' + captures: + 2: name: 'keyword.control.directive.kickass' + } + + # =============================================================== + # Variables and Macros + { + match: '(\\.)(var|eval|const|label)(\\s*[a-zA-Z0-9_]*)(\\s*=)' + captures: + 1: name: 'keyword.control.directive.kickass' + 2: name: 'keyword.control.directive.kickass' + 3: name: 'support.function.kickass' + 4: name: 'keyword.operator.kickass' + } + { + match: '(\\.)(var|eval|const|label)(\\s*[a-zA-Z0-9_]*)' + captures: + 1: name: 'keyword.control.directive.kickass' + 2: name: 'keyword.control.directive.kickass' + 3: name: 'support.function.kickass' + } + { + match: '(\\.)(function|macro)([\\s\\w_.]*)(\\()([^)]*)(\\))' + captures: + 1: name: 'keyword.control.directive.kickass' + 2: name: 'keyword.control.directive.kickass' + 3: name: 'entity.name.function.kickass' + 4: name: 'keyword.operator.kickass' + 5: name: 'constant.variable.kickass' + 6: name: 'keyword.operator.kickass' + } + { + match: '(\\.)(pseudocommand)(\\s+)([^\\s\\n]+)' + captures: + 1: name: 'keyword.control.directive.kickass' + 2: name: 'keyword.control.directive.kickass' + 4: name: 'entity.name.function.kickass' + } + ]