syntax highlighting

This commit is contained in:
nub31
2025-05-22 19:45:02 +02:00
parent eba128463d
commit b9debec81f
9 changed files with 332 additions and 6 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
out out
src/tooling/syntax-highlighting/code/nub-lang-*.vsix

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
set -e set -e
mkdir -p out mkdir -p out

View File

@@ -1,2 +1,2 @@
#!/bin/sh #!/bin/bash
rm -rf out rm -rf out

View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
set -e set -e
./clean.sh ./clean.sh
./build.sh ./build.sh

2
run.sh
View File

@@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
./clean.sh ./clean.sh
./build.sh ./build.sh
./out/program ./out/program

View File

@@ -0,0 +1,2 @@
#!/bin/bash
npx vsce package

View File

@@ -0,0 +1,29 @@
{
"comments": {
"lineComment": "//",
"blockComment": ["/*", "*/"]
},
"brackets": [
["{", "}"],
["[", "]"],
["(", ")"]
],
"autoClosingPairs": [
["{", "}"],
["[", "]"],
["(", ")"],
["\"", "\""],
["'", "'"]
],
"surroundingPairs": [
["{", "}"],
["[", "]"],
["(", ")"],
["\"", "\""],
["'", "'"]
],
"indentationRules": {
"increaseIndentPattern": "^((?!\\/\\*).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$",
"decreaseIndentPattern": "^((?!.*?\\/\\*).*\\*/)?\\s*[\\}\\]\\)].*$"
}
}

View File

@@ -0,0 +1,35 @@
{
"name": "nub-lang",
"displayName": "Nub Language Support",
"description": "Syntax highlighting for Nub programming language",
"version": "0.1.0",
"publisher": "nub31",
"engines": {
"vscode": "^1.74.0"
},
"categories": [
"Programming Languages"
],
"contributes": {
"languages": [
{
"id": "nub",
"aliases": [
"Nub",
"nub"
],
"extensions": [
".nub"
],
"configuration": "./language-configuration.json"
}
],
"grammars": [
{
"language": "nub",
"scopeName": "source.nub",
"path": "./syntaxes/nub.tmLanguage.json"
}
]
}
}

View File

@@ -0,0 +1,259 @@
{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"name": "Nub",
"scopeName": "source.nub",
"patterns": [
{
"include": "#comments"
},
{
"include": "#keywords"
},
{
"include": "#modifiers"
},
{
"include": "#types"
},
{
"include": "#strings"
},
{
"include": "#numbers"
},
{
"include": "#operators"
},
{
"include": "#function-definition"
},
{
"include": "#struct-definition"
},
{
"include": "#function-call"
},
{
"include": "#identifiers"
}
],
"repository": {
"comments": {
"patterns": [
{
"name": "comment.line.double-slash.nub",
"begin": "//",
"end": "$"
},
{
"name": "comment.block.nub",
"begin": "/\\*",
"end": "\\*/"
}
]
},
"keywords": {
"patterns": [
{
"name": "keyword.control.nub",
"match": "\\b(if|else|while|for|break|continue|return)\\b"
},
{
"name": "keyword.other.nub",
"match": "\\b(import|func|struct|new)\\b"
}
]
},
"modifiers": {
"patterns": [
{
"name": "storage.modifier.nub",
"match": "\\b(global|extern)\\b"
}
]
},
"types": {
"patterns": [
{
"name": "storage.type.primitive.nub",
"match": "\\b(int|float|double|char|bool|string|void)\\b"
},
{
"name": "storage.type.array.nub",
"match": "\\[\\]"
},
{
"name": "storage.type.pointer.nub",
"match": "\\^"
}
]
},
"strings": {
"patterns": [
{
"name": "string.quoted.double.nub",
"begin": "\"",
"end": "\"",
"patterns": [
{
"name": "constant.character.escape.nub",
"match": "\\\\(n|t|r|\\\\|\"|')"
},
{
"name": "constant.character.escape.nub",
"match": "\\\\[0-7]{1,3}"
},
{
"name": "constant.character.escape.nub",
"match": "\\\\x[0-9A-Fa-f]{1,2}"
}
]
},
{
"name": "string.quoted.single.nub",
"begin": "'",
"end": "'",
"patterns": [
{
"name": "constant.character.escape.nub",
"match": "\\\\(n|t|r|\\\\|\"|')"
}
]
}
]
},
"numbers": {
"patterns": [
{
"name": "constant.numeric.float.nub",
"match": "\\b\\d+\\.\\d*([eE][+-]?\\d+)?[fF]?\\b"
},
{
"name": "constant.numeric.integer.decimal.nub",
"match": "\\b\\d+\\b"
},
{
"name": "constant.numeric.integer.hexadecimal.nub",
"match": "\\b0[xX][0-9A-Fa-f]+\\b"
},
{
"name": "constant.numeric.integer.binary.nub",
"match": "\\b0[bB][01]+\\b"
}
]
},
"operators": {
"patterns": [
{
"name": "keyword.operator.assignment.nub",
"match": "="
},
{
"name": "keyword.operator.comparison.nub",
"match": "(==|!=|<=|>=|<|>)"
},
{
"name": "keyword.operator.arithmetic.nub",
"match": "(\\+|\\-|\\*|/)"
},
{
"name": "keyword.operator.logical.nub",
"match": "(&&|\\|\\||!)"
},
{
"name": "keyword.operator.address.nub",
"match": "&"
},
{
"name": "keyword.operator.dereference.nub",
"match": "\\^"
},
{
"name": "keyword.operator.member-access.nub",
"match": "\\."
}
]
},
"function-definition": {
"patterns": [
{
"begin": "\\b(global\\s+|extern\\s+)?(func)\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(",
"beginCaptures": {
"1": {
"name": "storage.modifier.nub"
},
"2": {
"name": "keyword.other.nub"
},
"3": {
"name": "entity.name.function.nub"
}
},
"end": "\\)",
"patterns": [
{
"include": "#function-parameters"
}
]
}
]
},
"struct-definition": {
"patterns": [
{
"match": "\\b(struct)\\s+([a-zA-Z_][a-zA-Z0-9_]*)\\b",
"captures": {
"1": {
"name": "keyword.other.nub"
},
"2": {
"name": "entity.name.type.struct.nub"
}
}
}
]
},
"function-parameters": {
"patterns": [
{
"match": "\\.\\.\\.",
"name": "keyword.operator.variadic.nub"
},
{
"match": "([a-zA-Z_][a-zA-Z0-9_]*)\\s*:\\s*",
"captures": {
"1": {
"name": "variable.parameter.nub"
}
}
},
{
"include": "#types"
},
{
"include": "#identifiers"
}
]
},
"function-call": {
"patterns": [
{
"match": "([a-zA-Z_][a-zA-Z0-9_]*)\\s*(?=\\()",
"captures": {
"1": {
"name": "entity.name.function.call.nub"
}
}
}
]
},
"identifiers": {
"patterns": [
{
"name": "variable.other.nub",
"match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b"
}
]
}
}
}