1
0
Fork 0
mirror of synced 2025-09-23 04:08:33 +00:00

Merge pull request #773 from Zokrates/textmate-highlighter

Textmate highlighter
This commit is contained in:
Thibaut Schaeffer 2021-03-30 11:09:53 +02:00 committed by GitHub
commit 79101db274
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 675 additions and 0 deletions

View file

@ -0,0 +1,4 @@
.vscode/**
.vscode-test/**
.gitignore
vsc-extension-quickstart.md

View file

@ -0,0 +1,3 @@
## [0.0.1] - 2021-03-01
- Initial release

View file

@ -0,0 +1,13 @@
# ZoKrates Syntax Highlighter
This is a Textmate-based syntax highlighter for the [ZoKrates language](https://zokrates.github.io) in VSCode.
## Development
This project expect the syntax to be provided as a JSON file (see `syntaxes`).
As working with a YAML file instead is easier, it can make sense to convert to that and back.
VSCode offers a command `Convert to {JSON, YAML}-tmLanguage File` that achieves that.
## Release process
This extension is currently released manually to the VSCode extension marketplace.

View file

@ -0,0 +1,28 @@
{
"comments": {
// symbol used for single line comment. Remove this entry if your language does not support line comments
"lineComment": "//",
// symbols used for start and end a block comment. Remove this entry if your language does not support block comments
"blockComment": [ "/*", "*/" ]
},
// symbols used as brackets
"brackets": [
["{", "}"],
["[", "]"],
["(", ")"]
],
// symbols that are auto closed when typing
"autoClosingPairs": [
["{", "}"],
["[", "]"],
["(", ")"],
["\"", "\""],
],
// symbols that can be used to surround a selection
"surroundingPairs": [
["{", "}"],
["[", "]"],
["(", ")"],
["\"", "\""],
]
}

View file

@ -0,0 +1,27 @@
{
"name": "zokrates",
"displayName": "zokrates",
"description": "Syntax highlighting for the ZoKrates language",
"publisher": "zokrates",
"repository": "https://github.com/ZoKrates/ZoKrates",
"version": "0.0.1",
"engines": {
"vscode": "^1.53.0"
},
"categories": [
"Programming Languages"
],
"contributes": {
"languages": [{
"id": "zokrates",
"aliases": ["ZoKrates", "zokrates"],
"extensions": [".zok"],
"configuration": "./language-configuration.json"
}],
"grammars": [{
"language": "zokrates",
"scopeName": "source.zok",
"path": "./syntaxes/zokrates.tmLanguage.json"
}]
}
}

View file

@ -0,0 +1,600 @@
{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "ZoKrates",
"fileTypes": [
"zok"
],
"scopeName": "source.zok",
"patterns": [
{
"comment": "attributes",
"name": "meta.attribute.zokrates",
"begin": "(#)(\\!?)(\\[)",
"beginCaptures": {
"1": {
"name": "punctuation.definition.attribute.zokrates"
},
"2": {
"name": "keyword.operator.attribute.inner.zokrates"
},
"3": {
"name": "punctuation.brackets.attribute.zokrates"
}
},
"end": "\\]",
"endCaptures": {
"0": {
"name": "punctuation.brackets.attribute.zokrates"
}
},
"patterns": [
{
"include": "#block-comments"
},
{
"include": "#comments"
},
{
"include": "#keywords"
},
{
"include": "#lifetimes"
},
{
"include": "#punctuation"
},
{
"include": "#strings"
},
{
"include": "#gtypes"
},
{
"include": "#types"
}
]
},
{
"include": "#block-comments"
},
{
"include": "#comments"
},
{
"include": "#constants"
},
{
"include": "#functions"
},
{
"include": "#types"
},
{
"include": "#keywords"
},
{
"include": "#punctuation"
},
{
"include": "#strings"
},
{
"include": "#variables"
}
],
"repository": {
"comments": {
"patterns": [
{
"comment": "line comments",
"name": "comment.line.double-slash.zokrates",
"match": "\\s*//.*"
}
]
},
"block-comments": {
"patterns": [
{
"comment": "empty block comments",
"name": "comment.block.zokrates",
"match": "/\\*\\*/"
},
{
"comment": "block comments",
"name": "comment.block.zokrates",
"begin": "/\\*(?!\\*)",
"end": "\\*/",
"patterns": [
{
"include": "#block-comments"
}
]
}
]
},
"constants": {
"patterns": [
{
"comment": "ALL CAPS constants",
"name": "constant.other.caps.zokrates",
"match": "\\b[A-Z]{2}[A-Z0-9_]*\\b"
},
{
"comment": "decimal integers and floats",
"name": "constant.numeric.decimal.zokrates",
"match": "\\b\\d[\\d_]*(u128|u16|u32|u64|u8|f)?\\b",
"captures": {
"5": {
"name": "entity.name.type.numeric.zokrates"
}
}
},
{
"comment": "hexadecimal integers",
"name": "constant.numeric.hex.zokrates",
"match": "\\b0x[\\da-fA-F_]+\\b"
},
{
"comment": "booleans",
"name": "constant.language.bool.zokrates",
"match": "\\b(true|false)\\b"
}
]
},
"imports": {
"patterns": [
{
"comment": "explicit import statement",
"name": "meta.import.explicit.zokrates",
"match": "\\b(from)\\s+(\\\".*\\\")(import)\\s+([A-Za-z0-9_]+)\\s+((as)\\s+[A-Za-z0-9_]+)?\\b",
"patterns": [
{
"include": "#block-comments"
},
{
"include": "#comments"
},
{
"include": "#keywords"
},
{
"include": "#punctuation"
},
{
"include": "#types"
},
{
"include": "#strings"
}
]
},
{
"comment": "main import statement",
"name": "meta.import.explicit.zokrates",
"match": "\\b(import)\\s+(\\\".*\\\")\\s+((as)\\s+[A-Za-z0-9_]+)?\\b",
"patterns": [
{
"include": "#block-comments"
},
{
"include": "#comments"
},
{
"include": "#keywords"
},
{
"include": "#punctuation"
},
{
"include": "#types"
},
{
"include": "#strings"
}
]
}
]
},
"functions": {
"patterns": [
{
"comment": "function definition",
"name": "meta.function.definition.zokrates",
"begin": "\\b(def)\\s+([A-Za-z0-9_]+)((\\()|(<))",
"beginCaptures": {
"1": {
"name": "keyword.other.def.zokrates"
},
"2": {
"name": "entity.name.function.zokrates"
},
"4": {
"name": "punctuation.brackets.round.zokrates"
},
"5": {
"name": "punctuation.brackets.angle.zokrates"
}
},
"end": "\\:|;",
"endCaptures": {
"0": {
"name": "keyword.punctuation.colon.zokrates"
}
},
"patterns": [
{
"include": "#block-comments"
},
{
"include": "#comments"
},
{
"include": "#keywords"
},
{
"include": "#constants"
},
{
"include": "#functions"
},
{
"include": "#punctuation"
},
{
"include": "#strings"
},
{
"include": "#types"
},
{
"include": "#variables"
}
]
},
{
"comment": "function/method calls, chaining",
"name": "meta.function.call.zokrates",
"begin": "([A-Za-z0-9_]+)(\\()",
"beginCaptures": {
"1": {
"name": "entity.name.function.zokrates"
},
"2": {
"name": "punctuation.brackets.round.zokrates"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.brackets.round.zokrates"
}
},
"patterns": [
{
"include": "#block-comments"
},
{
"include": "#comments"
},
{
"include": "#keywords"
},
{
"include": "#constants"
},
{
"include": "#functions"
},
{
"include": "#punctuation"
},
{
"include": "#strings"
},
{
"include": "#types"
},
{
"include": "#variables"
}
]
},
{
"comment": "function/method calls with turbofish",
"name": "meta.function.call.zokrates",
"begin": "([A-Za-z0-9_]+)(?=::<.*>\\()",
"beginCaptures": {
"1": {
"name": "entity.name.function.zokrates"
}
},
"end": "\\)",
"endCaptures": {
"0": {
"name": "punctuation.brackets.round.zokrates"
}
},
"patterns": [
{
"include": "#block-comments"
},
{
"include": "#comments"
},
{
"include": "#keywords"
},
{
"include": "#constants"
},
{
"include": "#functions"
},
{
"include": "#punctuation"
},
{
"include": "#strings"
},
{
"include": "#types"
},
{
"include": "#variables"
}
]
}
]
},
"keywords": {
"patterns": [
{
"comment": "argument visibility",
"name": "keyword.visibility.zokrates",
"match": "\\b(public|private)\\b"
},
{
"comment": "control flow keywords",
"name": "keyword.control.zokrates",
"match": "\\b(do|else|for|do|endfor|if|then|fi|return|assert)\\b"
},
{
"comment": "storage keywords",
"name": "storage.type.zokrates",
"match": "\\b(struct)\\b"
},
{
"comment": "def",
"name": "keyword.other.def.zokrates",
"match": "\\bdef\\b"
},
{
"comment": "import keywords",
"name": "keyword.other.import.zokrates",
"match": "\\b(import|from|as)\\b"
},
{
"comment": "logical operators",
"name": "keyword.operator.logical.zokrates",
"match": "(\\^|\\||\\|\\||&|&&|<<|>>|!)(?!=)"
},
{
"comment": "single equal",
"name": "keyword.operator.assignment.equal.zokrates",
"match": "(?<![<>])=(?!=|>)"
},
{
"comment": "comparison operators",
"name": "keyword.operator.comparison.zokrates",
"match": "(=(=)?(?!>)|!=|<=|(?<!=)>=)"
},
{
"comment": "math operators",
"name": "keyword.operator.math.zokrates",
"match": "(([+%]|(\\*(?!\\w)))(?!=))|(-(?!>))|(/(?!/))"
},
{
"comment": "less than, greater than (special case)",
"match": "(?:\\b|(?:(\\))|(\\])|(\\})))[ \\t]+([<>])[ \\t]+(?:\\b|(?:(\\()|(\\[)|(\\{)))",
"captures": {
"1": {
"name": "punctuation.brackets.round.zokrates"
},
"2": {
"name": "punctuation.brackets.square.zokrates"
},
"3": {
"name": "punctuation.brackets.curly.zokrates"
},
"4": {
"name": "keyword.operator.comparison.zokrates"
},
"5": {
"name": "punctuation.brackets.round.zokrates"
},
"6": {
"name": "punctuation.brackets.square.zokrates"
},
"7": {
"name": "punctuation.brackets.curly.zokrates"
}
}
},
{
"comment": "dot access",
"name": "keyword.operator.access.dot.zokrates",
"match": "\\.(?!\\.)"
},
{
"comment": "ranges, range patterns",
"name": "keyword.operator.range.zokrates",
"match": "\\.{2}(=|\\.)?"
},
{
"comment": "colon",
"name": "keyword.operator.colon.zokrates",
"match": ":(?!:)"
},
{
"comment": "dashrocket, skinny arrow",
"name": "keyword.operator.arrow.skinny.zokrates",
"match": "->"
}
]
},
"types": {
"patterns": [
{
"comment": "numeric types",
"match": "(?<![A-Za-z])(u128|u16|u32|u64|u8|field)\\b",
"captures": {
"1": {
"name": "entity.name.type.numeric.zokrates"
}
}
},
{
"comment": "parameterized types",
"begin": "\\b([A-Z][A-Za-z0-9]*)(<)",
"beginCaptures": {
"1": {
"name": "entity.name.type.zokrates"
},
"2": {
"name": "punctuation.brackets.angle.zokrates"
}
},
"end": ">",
"endCaptures": {
"0": {
"name": "punctuation.brackets.angle.zokrates"
}
},
"patterns": [
{
"include": "#block-comments"
},
{
"include": "#comments"
},
{
"include": "#keywords"
},
{
"include": "#punctuation"
},
{
"include": "#types"
},
{
"include": "#variables"
}
]
},
{
"comment": "primitive types",
"name": "entity.name.type.primitive.zokrates",
"match": "\\b(bool)\\b"
},
{
"comment": "struct declarations",
"match": "\\b(struct)\\s+([A-Z][A-Za-z0-9]*)\\b",
"captures": {
"1": {
"name": "storage.type.zokrates"
},
"2": {
"name": "entity.name.type.struct.zokrates"
}
}
},
{
"comment": "types",
"name": "entity.name.type.zokrates",
"match": "\\b[A-Z][A-Za-z0-9]*\\b(?!!)"
}
]
},
"punctuation": {
"patterns": [
{
"comment": "comma",
"name": "punctuation.comma.zokrates",
"match": ","
},
{
"comment": "parentheses, round brackets",
"name": "punctuation.brackets.round.zokrates",
"match": "[()]"
},
{
"comment": "square brackets",
"name": "punctuation.brackets.square.zokrates",
"match": "[\\[\\]]"
},
{
"comment": "angle brackets",
"name": "punctuation.brackets.angle.zokrates",
"match": "(?<!=)[<>]"
}
]
},
"strings": {
"patterns": [
{
"comment": "double-quoted strings and byte strings",
"name": "string.quoted.double.zokrates",
"begin": "(b?)(\")",
"beginCaptures": {
"1": {
"name": "string.quoted.byte.raw.zokrates"
},
"2": {
"name": "punctuation.definition.string.zokrates"
}
},
"end": "\"",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.zokrates"
}
}
},
{
"comment": "double-quoted raw strings and raw byte strings",
"name": "string.quoted.double.zokrates",
"begin": "(b?r)(#*)(\")",
"beginCaptures": {
"1": {
"name": "string.quoted.byte.raw.zokrates"
},
"2": {
"name": "punctuation.definition.string.raw.zokrates"
},
"3": {
"name": "punctuation.definition.string.zokrates"
}
},
"end": "(\")(\\2)",
"endCaptures": {
"1": {
"name": "punctuation.definition.string.zokrates"
},
"2": {
"name": "punctuation.definition.string.raw.zokrates"
}
}
}
]
},
"variables": {
"patterns": [
{
"comment": "variables",
"name": "variable.other.zokrates",
"match": "\\b(?<!(?<!\\.)\\.)[a-z0-9_]+\\b"
}
]
}
}
}