From 70a995247a897601db2790f648eb65335a798eec Mon Sep 17 00:00:00 2001 From: SeeBasTStick <sebastian.stock@hhu.de> Date: Wed, 26 Aug 2020 11:14:32 +0200 Subject: [PATCH] added rmch and icons --- package-lock.json | 67 ++--- package.json | 38 ++- snippets/rmchAddOn_snippets.json | 132 ++++++++++ src/extension.ts | 3 +- syntaxes/classicalb.tmLanguage.json | 2 +- syntaxes/rmchAddOn.tmLanguage.json | 367 ++++++++++++++++++++++++++++ 6 files changed, 556 insertions(+), 53 deletions(-) create mode 100644 snippets/rmchAddOn_snippets.json create mode 100644 syntaxes/rmchAddOn.tmLanguage.json diff --git a/package-lock.json b/package-lock.json index f3c0191..18b08e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -77,9 +77,9 @@ } }, "@types/node": { - "version": "14.0.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz", - "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==" + "version": "14.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", + "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" }, "@types/stream-to-array": { "version": "2.3.0", @@ -98,9 +98,9 @@ } }, "@types/vscode": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.47.0.tgz", - "integrity": "sha512-nJA37ykkz9FYA0ZOQUSc3OZnhuzEW2vUhUEo4MiduUo82jGwwcLfyvmgd/Q7b0WrZAAceojGhZybg319L24bTA==" + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.48.0.tgz", + "integrity": "sha512-sZJKzsJz1gSoFXcOJWw3fnKl2sseUgZmvB4AJZS+Fea+bC/jfGPVhmFL/FfQHld/TKtukVONsmoD3Pkyx9iadg==" }, "@typescript-eslint/experimental-utils": { "version": "2.34.0", @@ -170,9 +170,9 @@ } }, "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -587,9 +587,9 @@ "dev": true }, "eslint": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz", - "integrity": "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.7.0.tgz", + "integrity": "sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -630,25 +630,10 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "semver": { @@ -685,22 +670,14 @@ "dev": true }, "espree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", - "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", "dev": true, "requires": { - "acorn": "^7.3.1", + "acorn": "^7.4.0", "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } } }, "esprima": { @@ -719,9 +696,9 @@ }, "dependencies": { "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } } diff --git a/package.json b/package.json index 850e395..8dccdda 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "ProB" ], "activationEvents": [ - "onLanguage:classicalb" + "onLanguage:classicalb", + "onLanguage:rmchAddOn" ], "main": "./out/extension", "contributes": { @@ -96,12 +97,23 @@ ".mch", ".def", ".imp", - ".ref" + ".ref", + ".rmch" ], "aliases": [ "B", "classical B" ] + }, + { + "id": "rmchAddOn", + "extensions": [ + ".rmch" + ], + "aliases": [ + "B", + "B DSL" + ] } ], "grammars": [ @@ -109,12 +121,28 @@ "language": "classicalb", "scopeName": "source.classicalb", "path": "./syntaxes/classicalb.tmLanguage.json" + }, + { + "language": "rmchAddOn", + "scopeName": "source.rmchAddOn", + "path": "./syntaxes/rmchAddOn.tmLanguage.json" } ], "snippets": [ { "language": "classicalb", "path": "./snippets/classicalb_snippets.json" + }, + { + "language": "rmchAddOn", + "path": "./snippets/rmchAddOn_snippets.json" + } + ], + "iconThemes": [ + { + "id": "b", + "label": "B", + "path": "./themes/b-themes.json" } ] }, @@ -127,16 +155,16 @@ }, "devDependencies": { "@types/mocha": "^7.0.2", - "@types/node": "^14.0.27", + "@types/node": "^14.6.0", "@typescript-eslint/parser": "^2.34.0", - "eslint": "^7.6.0", + "eslint": "^7.7.0", "mocha": "^7.2.0", "typescript": "^3.9.7" }, "dependencies": { "@types/ndjson": "^1.5.0", "@types/stream-to-array": "^2.3.0", - "@types/vscode": "^1.47.0", + "@types/vscode": "^1.48.0", "b-language-server": "https://github.com/SeeBasTStick/b-language-server/archive/v1.3.3.tar.gz", "clean": "^4.0.2", "error": "^10.4.0", diff --git a/snippets/rmchAddOn_snippets.json b/snippets/rmchAddOn_snippets.json new file mode 100644 index 0000000..5968671 --- /dev/null +++ b/snippets/rmchAddOn_snippets.json @@ -0,0 +1,132 @@ +{ + ".source.rmchAddOn": { + "MACHINE": { + "prefix": "RULES_MACHINE ...", + "body": "RULES_MACHINE ${1:MyMachine} OPERATIONS \n RULE ${2:test} \n BODY \n RULE_FORALL ${3:x} \n WHERE ${4:x:1..10} \n EXPECT ${5:x*2 = x+x} \n COUNTEREXAMPLE //\"violation of law\" END\nEND//MACHINE" + }, + "package pragma": { + "prefix": "package", + "body": "/*@package ${1:foo.bar} */" + }, + "import-package pragma": { + "prefix": "import-package", + "body": "/*@import-package ${1:foo.bazz} */" + }, + "OPERATIONS Keyword": { + "prefix": "OPERATIONS", + "body": "OPERATIONS" + }, + "DEFINITIONS Keyword": { + "prefix": "DEFINITIONS", + "body": "DEFINITIONS" + }, + "VARIABLES": { + "prefix": "VARIABLES", + "body": "VARIABLES\n\t${1:x}\nINVARIANT\n\t${2:P}\nINITIALISATION\n\t${4:I}" + }, + "CONSTANTS": { + "prefix": "CONSTANTS", + "body": "CONSTANTS\n\t${1:c}\nPROPERTIES\n\t${2:P}" + }, + "ASSERTIONS": { + "prefix": "ASSERTIONS", + "body": "ASSERTIONS\n\t${1:a}" + }, + "WHILE": { + "prefix": "while", + "body": "WHILE ${1:p}\nDO\n\t${2:G}\nINVARIANT ${3:Q}\nVARIANT ${4:E}\nEND" + }, + "PRE Template": { + "prefix": "PRE", + "body": "PRE ${1:p}\nTHEN\n\t${2:G}\nEND" + }, + "VAR": { + "prefix": "var", + "body": "VAR ${1:z}\nIN\n\t${2:G}\nEND" + }, + "ANY": { + "prefix": "any", + "body": "ANY ${1:z}\nWHERE\n\t${2:P}\nTHEN\n\t${3:G}\nEND" + }, + "LET": { + "prefix": "let", + "body": "LET ${1:x}\nBE ${2:E}\nIN\n\t${3:G}\nEND" + }, + "IF": { + "prefix": "if", + "body": "IF ${1:p}\nTHEN\n\t${2:G}\nEND" + }, + "IF ... ELSE": { + "prefix": "ifelse", + "body": "IF ${1:p}\nTHEN\n\t${2:G}\nELSE\n\t${2:H}\nEND" + }, + "CHOICE": { + "prefix": "choice", + "body": "CHOICE\n\t${1:G}\nOR\n\t${2:H}\nEND" + }, + "SELECT": { + "prefix": "select", + "body": "SELECT\n\t${1:p}\nTHEN\n\t${2:G}\nEND" + }, + "SELECT ... ELSE": { + "prefix": "selectelse", + "body": "SELECT ${1:p}\nTHEN\n\t${2:G}\nWHEN ${3:q}\nTHEN\n\t${4:H}\nELSE\n\t${5:E}\nEND" + }, + "CASE": { + "prefix": "choice", + "body": "CHOICE\n\t${1:G}\nOR\n\t${2:H}\nEND" + }, + "Set Pref MININT": { + "prefix": "set minint", + "body": "SET_PREF_MININT == ${1:n};" + }, + "Set Pref MAXINT": { + "prefix": "set minint", + "body": "SET_PREF_MININT == ${1:n};" + }, + "B:INT": { + "prefix": "INT", + "body": "INT;" + }, + "B:INTEGER": { + "prefix": "INTEGER", + "body": "INTEGER" + }, + "B:NAT": { + "prefix": "NAT", + "body": "NAT" + }, + "B:NATURAL": { + "prefix": "NATURAL", + "body": "NATURAL" + }, + "B: -->": { + "prefix": "funcTotal", + "body": "-->" + }, + "B: >->": { + "prefix": "funcTotalInjection", + "body": ">->" + }, + "B: -->>": { + "prefix": "funcTotalSurjection", + "body": ">->" + }, + "B: >->>": { + "prefix": "funcTotalBijection", + "body": ">->>" + }, + "B: +->": { + "prefix": "funcPartial", + "body": "+->" + }, + "B: >+>": { + "prefix": "funcPartialInjection", + "body": "+->>" + }, + "B: >+>>": { + "prefix": "funcBijection", + "body": ">+>>" + } + } + } \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index 69ccdab..1bff34c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -12,7 +12,6 @@ import { LanguageClientOptions, ServerOptions, } from 'vscode-languageclient'; -import fs from "fs" import * as path from 'path' @@ -37,7 +36,7 @@ export function activate(context: ExtensionContext) { // Options to control the language client let clientOptions: LanguageClientOptions = { // Register the server for B files - documentSelector: [{ scheme: 'file', language: 'classicalb' }], + documentSelector: [{ scheme: 'file', language: 'classicalb' }, { scheme: 'file', language: 'rmchAddOn' }], synchronize: { // Notify the server about file changes to '.clientrc files contained in the workspace fileEvents: workspace.createFileSystemWatcher('**/.clientrc') diff --git a/syntaxes/classicalb.tmLanguage.json b/syntaxes/classicalb.tmLanguage.json index 05faf12..6c6dc78 100644 --- a/syntaxes/classicalb.tmLanguage.json +++ b/syntaxes/classicalb.tmLanguage.json @@ -131,7 +131,7 @@ "machineclauses": { "patterns": [ { - "match": "(?x)\n\\b(INITIALIZATION|INITIALISATION|ASSERTIONS|OPERATIONS|SEES|PROMOTES|USES\n|INCLUDES|IMPORTS|REFINES|EXTENDS|INVARIANT|CONCRETE_VARIABLES\n|ABSTRACT_VARIABLES|VARIABLES|PROPERTIES|CONSTANTS|ABSTRACT_CONSTANTS\n|CONCRETE_CONSTANTS|CONSTRAINTS|SETS|DEFINITIONS|VALUES)\\b", + "match": "(?x)\n\\b(INITIALI(Z|S)ATION|ASSERTIONS|OPERATIONS|SEES|PROMOTES|USES\n|INCLUDES|IMPORTS|REFINES|EXTENDS|INVARIANT|CONCRETE_VARIABLES\n|ABSTRACT_VARIABLES|VARIABLES|PROPERTIES|CONSTANTS|ABSTRACT_CONSTANTS\n|CONCRETE_CONSTANTS|CONSTRAINTS|SETS|DEFINITIONS|VALUES|GOAL)\\b", "name": "storage.type.clause.classicalb" } ] diff --git a/syntaxes/rmchAddOn.tmLanguage.json b/syntaxes/rmchAddOn.tmLanguage.json new file mode 100644 index 0000000..b40d73a --- /dev/null +++ b/syntaxes/rmchAddOn.tmLanguage.json @@ -0,0 +1,367 @@ +{ + "name": "Rules Machine B", + "scopeName": "source.rmchAddOn", + "patterns": [ + { + "include": "source.rmchAddOn.rules" + }, + { + "include": "#pragma" + }, + { + "include": "#comments" + }, + { + "include": "#strings" + }, + { + "include": "#components" + }, + { + "include": "#machineclauses" + }, + { + "include": "#control_blocks" + }, + { + "include": "#scope_blocks" + }, + { + "include": "#keyword_control" + }, + { + "include": "#keyword_operators" + }, + { + "include": "#constant_values" + }, + { + "include": "#preferences" + }, + { + "include": "#identifiers" + }, + { + "include": "#invalid" + }, + { + "include": "#scope_blocks" + } + ], + "repository": { + "identifiers": { + "patterns": [ + { + "match": "\\b[a-zA-Z][a-zA-Z0-9_]*\\b", + "name": "identifier.rmchAddOn" + } + ] + }, + "pragma": { + "patterns": [ + { + "begin": "/\\*@\\b(package|import-package|import_package|symbolic|unit|label|desc|description|conversion|file)\\b", + "captures": { + "0": { + "name": "punctuation.definition.tag.rmchAddOn" + } + }, + "end": "\\*/", + "name": "identifier.rmchAddOn" + } + ] + }, + "comments": { + "patterns": [ + { + "begin": "/\\*", + "captures": { + "0": { + "name": "punctuation.definition.comment.rmchAddOn" + } + }, + "end": "\\*/", + "name": "comment.block.rmchAddOn" + }, + { + "begin": "//", + "captures": { + "0": { + "name": "punctuation.definition.comment.rmchAddOn" + } + }, + "end": "\n", + "name": "comment.line.rmchAddOn" + } + ] + }, + "strings": { + "patterns": [ + { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.rmchAddOn" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.rmchAddOn" + } + }, + "name": "string.quoted.double.rmchAddOn", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.rmchAddOn" + }, + { + "match": "\"\"", + "name": "constant.character.escape.quote.rmchAddOn" + } + ] + }, + { + "begin": "'''", + "captures": { + "0": { + "name": "punctuation.definition.string.begin.rmchAddOn" + } + }, + "end": "'''", + "name": "string.quoted.triple.rmchAddOn" + } + ] + }, + "machineclauses": { + "patterns": [ + { + "match": "(?x)\n\\b(INITIALI(Z|S)ATION|ASSERTIONS|OPERATIONS|SEES|PROMOTES|USES\n|INCLUDES|IMPORTS|REFINES|EXTENDS|INVARIANT|CONCRETE_VARIABLES\n|ABSTRACT_VARIABLES|VARIABLES|PROPERTIES|CONSTANTS|ABSTRACT_CONSTANTS\n|CONCRETE_CONSTANTS|CONSTRAINTS|SETS|DEFINITIONS|VALUES)\\b", + "name": "storage.type.clause.rmchAddOn" + } + ] + }, + "keyword_control": { + "patterns": [ + { + "match": "(?x)\n\\b(skip|BE|DO|VARIANT|ELSIF|THEN|ELSE|EITHER|CASE|SELECT\n|ASSERT|WHERE|OR|OF|IN|BODY|GOAL|RULEID|WHEN|COUNTEREXAMPLE|TYPE|VALUE|EXPECT|STRING_FORMAT|DEPENDS_ON_RULE|ERROR_TYPE|ERROR_TYPES|PRECONDITION|POSTCONDITION|DUMMY_VALUE)\\b", + "name": "keyword.control.rmchAddOn" + } + ] + }, + "keyword_operators": { + "patterns": [ + { + "match": "\\bnot\\b|¬|\\bor\\b|∨", + "name": "keyword.operator.logical.rmchAddOn" + }, + { + "match": "!|#|∀|∃|&|∧|<=>|=>|⇔|⇒", + "name": "keyword.operator.logical.rmchAddOn" + }, + { + "match": "≠|/=|=|==", + "name": "keyword.operator.equality.rmchAddOn" + }, + { + "match": "\\b(first|last|tail|front|rev|seq|seq1|conc)\\b", + "name": "keyword.operator.sequence.rmchAddOn" + }, + { + "match": "\\b(tree|btree|top|const|rank|father|son|sons|subtree|arity|bin|left|right|sizet|prefix|postfix|mirror|infix)\\b", + "name": "keyword.operator.tree.rmchAddOn" + }, + { + "match": "\\b(mod|succ|pred)\\b", + "name": "keyword.operator.numeric.rmchAddOn" + }, + { + "match": "\\b(rec|struct)\\b", + "name": "keyword.operator.record.rmchAddOn" + }, + { + "match": "\\b(ran|dom|id|prj1|prj2|closure1|closure|interate|fnc|rel)\\b|%|λ", + "name": "keyword.operator.relation.rmchAddOn" + }, + { + "match": "bool", + "name": "keyword.operator.boolean.rmchAddOn" + }, + { + "match": "<--|:=|::", + "name": "keyword.operator.assignment.rmchAddOn" + }, + { + "match": "\\b(INTER|UNION|SIGMA|PI|POW|POW1|union|inter)\\b|⋂|⋃|∑|∏", + "name": "keyword.operator.set.rmchAddOn" + }, + { + "match": "\\b(min|max|card|size)\\b", + "name": "keyword.operator.set.rmchAddOn" + }, + { + "match": ":|∈|∉|\\\\/|/\\\\|∪|∩|⊄|⊈|⊂|⊆", + "name": "keyword.operator.set.rmchAddOn" + }, + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.definition.set.begin.rmchAddOn" + } + }, + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.definition.set.end.rmchAddOn" + } + }, + "patterns": [ + { + "include": "$self" + } + ] + }, + { + "match": "-->|-->(>)?|>->(>)?|<->|>+>(>)?", + "name": "keyword.operator.relation.rmchAddOn" + }, + { + "match": "(\\|>(>)?)|((<)?<\\|)|(\\|->)", + "name": "keyword.operator.relation.rmchAddOn" + }, + { + "match": "↠|↦|⤀|⤖|⇸|⤔|◀|←|→|↔|↣|▶|⇾|⋖|⊗|◁|▷|⇽", + "name": "keyword.operator.relation.rmchAddOn" + }, + { + "match": "\\|\\|", + "name": "keyword.operator.parallel.rmchAddOn" + }, + { + "match": ">|<|>=|=<|≤|≥", + "name": "keyword.operator.numeric.rmchAddOn" + } + ] + }, + "constant_values": { + "patterns": [ + { + "match": "\\b\\d+", + "name": "constant.numeric.rmchAddOn" + }, + { + "match": "{}|∅", + "name": "constant.set.rmchAddOn" + }, + { + "match": "\\b(TRUE|FALSE)\\b", + "name": "constant.language.boolean.rmchAddOn" + }, + { + "match": "\\b(BOOL|STRING|INT(EGER)?|NAT(URAL)?(1)?|MININT|MAXINT)\\b", + "name": "constant.other.sets.rmchAddOn" + } + ] + }, + "control_blocks": { + "patterns": [ + { + "begin": "(?x)\n\\b(BEGIN|PRE|SELECT|ANY|LET|VAR|ASSERT|WHILE|IF|CHOICE|CASE|EITHER|IN)\\b", + "beginCaptures": { + "0": { + "name": "keyword.control.rmchAddOn" + } + }, + "end": "\\bEND\\b", + "endCaptures": { + "0": { + "name": "keyword.control.rmchAddOn" + } + }, + "patterns": [ + { + "match": "\\bINVARIANT\\b", + "name": "keyword.control.rmchAddOn" + }, + { + "include": "$self" + } + ] + } + ] + }, + "scope_blocks": { + "patterns": [ + { + "begin": "(?x)\n\\b(RULE|COMPUTATION|FUNCTION|RULE_FORALL|RULE_FAIL)\\b", + "beginCaptures": { + "0": { + "name": "keyword.control.rmchAddOn" + } + }, + "end": "\\bEND\\b", + "endCaptures": { + "0": { + "name": "keyword.control.rmchAddOn" + } + }, + "patterns": [ + { + "match": "\\bINVARIANT\\b", + "name": "keyword.control.rmchAddOn" + }, + { + "include": "$self" + } + ] + } + ] + }, + "components": { + "patterns": [ + { + "begin": "\\b(RULES_MACHINE)\\b", + "beginCaptures": { + "0": { + "name": "storage.type.machine.start.rmchAddOn" + } + }, + "end": "\\bEND\\b", + "endCaptures": { + "0": { + "name": "storage.type.machine.end.rmchAddOn" + } + }, + "name": "meta.machine.rmchAddOn", + "patterns": [ + { + "include": "$self" + } + ] + } + ] + }, + "preferences": { + "patterns": [ + { + "match": "(?x)\n\\b(GOAL|SET_PREF_\\w*|FORCE_SYMMETRY_\\w*|GOAL|ANIMATION_FUNCTION_DEFAULT\n|HEURISTIC_FUNCTION|ANIMATION_FUNCTION[0-9]*|ANIMATION_IMG\\w*\n|ANIMATION_STR\\w*|ASSERT_(LTL|CTL)\\w*)\\b", + "name": "entity.other.attribute-name.rmchAddOn" + } + ] + }, + "invalid": { + "patterns": [ + { + "match": "@|\\?|€", + "name": "invalid.illegal.other.rmchAddOn" + }, + { + "match": ";(\\s)*;", + "name": "invalid.illegal.other.rmchAddOn" + } + ] + } + } + } \ No newline at end of file -- GitLab