tree-sitter-bsl 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +188 -3
- package/binding.gyp +6 -4
- package/bindings/node/binding.cc +16 -2
- package/bindings/node/binding_test.js +16 -2
- package/bindings/node/index.d.ts +1 -0
- package/bindings/node/index.js +2 -1
- package/{grammar.js → grammars/bsl/grammar.js} +164 -55
- package/grammars/bsl/queries/highlights.scm +93 -0
- package/grammars/bsl/queries/injections.scm +8 -0
- package/{src → grammars/bsl/src}/grammar.json +1442 -846
- package/{src → grammars/bsl/src}/node-types.json +595 -45
- package/grammars/bsl/src/parser.c +32756 -0
- package/{src → grammars/bsl/src}/tree_sitter/parser.h +0 -1
- package/grammars/sdbl/grammar.js +734 -0
- package/grammars/sdbl/queries/highlights.scm +131 -0
- package/grammars/sdbl/src/grammar.json +4697 -0
- package/grammars/sdbl/src/node-types.json +2635 -0
- package/grammars/sdbl/src/parser.c +77171 -0
- package/grammars/sdbl/src/tree_sitter/alloc.h +54 -0
- package/grammars/sdbl/src/tree_sitter/array.h +291 -0
- package/grammars/sdbl/src/tree_sitter/parser.h +286 -0
- package/package.json +35 -12
- package/prebuilds/darwin-arm64/tree-sitter-bsl.node +0 -0
- package/prebuilds/darwin-x64/tree-sitter-bsl.node +0 -0
- package/prebuilds/linux-arm64/tree-sitter-bsl.node +0 -0
- package/prebuilds/linux-x64/tree-sitter-bsl.node +0 -0
- package/prebuilds/win32-arm64/tree-sitter-bsl.node +0 -0
- package/prebuilds/win32-x64/tree-sitter-bsl.node +0 -0
- package/tree-sitter.json +16 -3
- package/src/parser.c +0 -27450
- package/tree-sitter-bsl.wasm +0 -0
- /package/{src → grammars/bsl/src}/tree_sitter/alloc.h +0 -0
- /package/{src → grammars/bsl/src}/tree_sitter/array.h +0 -0
package/README.md
CHANGED
|
@@ -2,17 +2,202 @@
|
|
|
2
2
|
|
|
3
3
|
[![CI][ci]](https://github.com/alkoleft/tree-sitter-bsl/actions/workflows/ci.yml)
|
|
4
4
|
[![npm][npm]](https://www.npmjs.com/package/tree-sitter-bsl)
|
|
5
|
+
[![crates.io][crates]](https://crates.io/crates/tree-sitter-bsl)
|
|
6
|
+
[![PyPI][pypi]](https://pypi.org/project/tree-sitter-bsl/)
|
|
5
7
|
|
|
6
|
-
Грамматика 1C
|
|
8
|
+
Грамматика 1C BSL в формате [tree-sitter](https://github.com/tree-sitter/tree-sitter).
|
|
9
|
+
Пакет также содержит отдельную грамматику `sdbl` для языка запросов 1C.
|
|
7
10
|
|
|
8
11
|
[Попробовать](https://alkoleft.github.io/tree-sitter-bsl/)
|
|
9
12
|
|
|
10
13
|

|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
## Что входит
|
|
16
|
+
|
|
17
|
+
- `bsl`: грамматика исходных файлов BSL (`.bsl`, `.osl`).
|
|
18
|
+
- `sdbl`: грамматика самостоятельных текстов запросов 1C (`.sdbl`).
|
|
19
|
+
- Query-файлы tree-sitter для подсветки BSL/SDBL и внедрения статических
|
|
20
|
+
строковых литералов BSL, начинающихся с `ВЫБРАТЬ`, `SELECT`, `УНИЧТОЖИТЬ`
|
|
21
|
+
или `DROP`, как `sdbl`.
|
|
22
|
+
- Локальное dev-расширение Zed в [`editors/zed-bsl`](editors/zed-bsl) для
|
|
23
|
+
проверки подсветки BSL, самостоятельного SDBL и внедренного SDBL.
|
|
24
|
+
|
|
25
|
+
BSL и SDBL остаются разными контрактами парсера. Грамматика BSL не встраивает
|
|
26
|
+
SDBL в AST строковых литералов; разбор встроенных запросов выполняется через
|
|
27
|
+
tree-sitter injections и композицию на стороне редактора.
|
|
28
|
+
|
|
29
|
+
## Локальная разработка
|
|
30
|
+
|
|
31
|
+
Локальный tree-sitter playground запускается отдельно для каждой грамматики:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
npm start
|
|
35
|
+
npm run start:bsl
|
|
36
|
+
npm run start:sdbl
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
`npm start` является псевдонимом для BSL playground. `npm run start:sdbl`
|
|
40
|
+
запускает playground самостоятельной грамматики SDBL. При необходимости можно
|
|
41
|
+
собрать оба WASM-парсера:
|
|
42
|
+
|
|
43
|
+
```sh
|
|
44
|
+
npm run build:wasm
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Быстрая проверка дерева разбора:
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
npm run parse:bsl -- examples/playground/basic.bsl
|
|
51
|
+
npm run parse:sdbl -- examples/playground/select.sdbl
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Небольшие примеры для playground лежат в
|
|
55
|
+
[`examples/playground`](examples/playground):
|
|
56
|
+
|
|
57
|
+
- [`basic.bsl`](examples/playground/basic.bsl) для синтаксиса исходных файлов
|
|
58
|
+
BSL;
|
|
59
|
+
- [`select.sdbl`](examples/playground/select.sdbl) и
|
|
60
|
+
[`query-package.sdbl`](examples/playground/query-package.sdbl) для синтаксиса
|
|
61
|
+
самостоятельных SDBL-запросов.
|
|
62
|
+
|
|
63
|
+
SDBL-примеры разбираются самостоятельной грамматикой SDBL. BSL-строки с
|
|
64
|
+
текстом запроса остаются узлами строк BSL; разбор встроенного запроса относится
|
|
65
|
+
к отдельному контракту injection/composition.
|
|
66
|
+
|
|
67
|
+
Основные команды проверки:
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
npm run test:corpus
|
|
71
|
+
npm test
|
|
72
|
+
npm run test:all
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`npm run test:corpus` использует локальный для пакета `tree-sitter-cli` и
|
|
76
|
+
проверяет оба набора corpus-тестов. Для системного `tree-sitter` CLI, который
|
|
77
|
+
поддерживает `-p`, эквивалентные команды:
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
tree-sitter test -p grammars/bsl
|
|
81
|
+
tree-sitter test -p grammars/sdbl
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Использование
|
|
85
|
+
|
|
86
|
+
### Rust
|
|
87
|
+
|
|
88
|
+
Добавьте зависимость в [`Cargo.toml`](Cargo.toml):
|
|
89
|
+
|
|
90
|
+
```toml
|
|
91
|
+
[dependencies]
|
|
92
|
+
tree-sitter = "0.25"
|
|
93
|
+
tree-sitter-bsl = "0.1"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
```rust
|
|
97
|
+
use tree_sitter::Parser;
|
|
98
|
+
|
|
99
|
+
fn main() {
|
|
100
|
+
let mut parser = Parser::new();
|
|
101
|
+
parser
|
|
102
|
+
.set_language(&tree_sitter_bsl::LANGUAGE.into())
|
|
103
|
+
.expect("Error loading BSL grammar");
|
|
104
|
+
|
|
105
|
+
let source = r#"
|
|
106
|
+
Процедура Привет()
|
|
107
|
+
Сообщить("Привет, мир!");
|
|
108
|
+
КонецПроцедуры
|
|
109
|
+
"#;
|
|
110
|
+
|
|
111
|
+
let tree = parser.parse(source, None).unwrap();
|
|
112
|
+
println!("{}", tree.root_node().to_sexp());
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Node.js
|
|
117
|
+
|
|
118
|
+
Установите пакет:
|
|
119
|
+
|
|
120
|
+
```sh
|
|
121
|
+
npm install tree-sitter-bsl tree-sitter
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```js
|
|
125
|
+
const Parser = require("tree-sitter");
|
|
126
|
+
const BSL = require("tree-sitter-bsl");
|
|
127
|
+
|
|
128
|
+
const parser = new Parser();
|
|
129
|
+
parser.setLanguage(BSL);
|
|
130
|
+
|
|
131
|
+
const sourceCode = `
|
|
132
|
+
Процедура Привет()
|
|
133
|
+
Сообщить("Привет, мир!");
|
|
134
|
+
КонецПроцедуры
|
|
135
|
+
`;
|
|
136
|
+
|
|
137
|
+
const tree = parser.parse(sourceCode);
|
|
138
|
+
console.log(tree.rootNode.toString());
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Python
|
|
142
|
+
|
|
143
|
+
Установите пакет:
|
|
144
|
+
|
|
145
|
+
```sh
|
|
146
|
+
pip install tree-sitter-bsl tree-sitter
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
```python
|
|
150
|
+
import tree_sitter_bsl as tsbsl
|
|
151
|
+
from tree_sitter import Language, Parser
|
|
152
|
+
|
|
153
|
+
BSL_LANGUAGE = Language(tsbsl.language())
|
|
154
|
+
parser = Parser(BSL_LANGUAGE)
|
|
155
|
+
|
|
156
|
+
source = """
|
|
157
|
+
Процедура Привет()
|
|
158
|
+
Сообщить("Привет, мир!");
|
|
159
|
+
КонецПроцедуры
|
|
160
|
+
""".encode()
|
|
161
|
+
|
|
162
|
+
tree = parser.parse(source)
|
|
163
|
+
print(tree.root_node.sexp())
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Грамматика запросов SDBL
|
|
167
|
+
|
|
168
|
+
Пакет также экспортирует самостоятельную грамматику языка запросов SDBL:
|
|
169
|
+
|
|
170
|
+
- Node.js: `require("tree-sitter-bsl").sdbl`;
|
|
171
|
+
- Rust: `tree_sitter_bsl::SDBL_LANGUAGE`;
|
|
172
|
+
- Python: `tree_sitter_bsl.SDBLLanguage()` или низкоуровневая капсула
|
|
173
|
+
`tree_sitter_bsl.sdbl_language()`;
|
|
174
|
+
- Go: `tree_sitter_bsl.SDBLLanguage()`;
|
|
175
|
+
- C: `tree_sitter_sdbl()` из `tree-sitter-bsl.h` и той же библиотеки.
|
|
176
|
+
|
|
177
|
+
Существующие точки входа BSL остаются языком пакета по умолчанию.
|
|
178
|
+
|
|
179
|
+
Пакет включает query-файлы tree-sitter для интеграций с редакторами:
|
|
180
|
+
|
|
181
|
+
- `grammars/bsl/queries/highlights.scm` для подсветки BSL;
|
|
182
|
+
- `grammars/bsl/queries/injections.scm` для внедрения статических строковых
|
|
183
|
+
литералов BSL, начинающихся с ключевых слов SDBL-выражений, как `sdbl`;
|
|
184
|
+
- `grammars/sdbl/queries/highlights.scm` для подсветки самостоятельного SDBL и
|
|
185
|
+
текста запросов, внедренного из BSL.
|
|
186
|
+
|
|
187
|
+
Для Zed используется локальное dev extension:
|
|
188
|
+
[`editors/zed-bsl`](editors/zed-bsl). Оно регистрирует BSL, SDBL и
|
|
189
|
+
специальную для Zed грамматику-носитель `sdbl_embedded`, чтобы исходный текст
|
|
190
|
+
внедренной BSL-строки подсвечивался без изменения контракта самостоятельной
|
|
191
|
+
грамматики `.sdbl`.
|
|
192
|
+
|
|
193
|
+
## Ссылки
|
|
13
194
|
|
|
14
195
|
- Грамматика основана на правилах [BSL Parser](https://github.com/1c-syntax/bsl-parser)
|
|
196
|
+
- Архитектурные решения: [`docs/decisions`](docs/decisions)
|
|
197
|
+
- Активный список parser-задач: [`spec/IMPLEMENTATION_TODO.md`](spec/IMPLEMENTATION_TODO.md)
|
|
198
|
+
- Контракт грамматики SDBL: [`spec/sdbl-query-language.md`](spec/sdbl-query-language.md)
|
|
15
199
|
|
|
16
200
|
[ci]: https://img.shields.io/github/actions/workflow/status/alkoleft/tree-sitter-bsl/ci.yml?logo=github&label=CI
|
|
17
201
|
[npm]: https://img.shields.io/npm/v/tree-sitter-bsl?logo=npm
|
|
18
|
-
[
|
|
202
|
+
[crates]: https://img.shields.io/crates/v/tree-sitter-bsl?logo=rust
|
|
203
|
+
[pypi]: https://img.shields.io/pypi/v/tree-sitter-bsl?logo=python
|
package/binding.gyp
CHANGED
|
@@ -6,18 +6,20 @@
|
|
|
6
6
|
"<!(node -p \"require('node-addon-api').targets\"):node_addon_api_except",
|
|
7
7
|
],
|
|
8
8
|
"include_dirs": [
|
|
9
|
-
"src",
|
|
9
|
+
"grammars/bsl/src",
|
|
10
|
+
"grammars/sdbl/src",
|
|
10
11
|
],
|
|
11
12
|
"sources": [
|
|
12
13
|
"bindings/node/binding.cc",
|
|
13
|
-
"src/parser.c",
|
|
14
|
+
"grammars/bsl/src/parser.c",
|
|
15
|
+
"grammars/sdbl/src/parser.c",
|
|
14
16
|
],
|
|
15
17
|
"variables": {
|
|
16
|
-
"has_scanner": "<!(node -p \"fs.existsSync('src/scanner.c')\")"
|
|
18
|
+
"has_scanner": "<!(node -p \"fs.existsSync('grammars/bsl/src/scanner.c')\")"
|
|
17
19
|
},
|
|
18
20
|
"conditions": [
|
|
19
21
|
["has_scanner=='true'", {
|
|
20
|
-
"sources+": ["src/scanner.c"],
|
|
22
|
+
"sources+": ["grammars/bsl/src/scanner.c"],
|
|
21
23
|
}],
|
|
22
24
|
["OS!='win'", {
|
|
23
25
|
"cflags_c": [
|
package/bindings/node/binding.cc
CHANGED
|
@@ -3,16 +3,30 @@
|
|
|
3
3
|
typedef struct TSLanguage TSLanguage;
|
|
4
4
|
|
|
5
5
|
extern "C" TSLanguage *tree_sitter_bsl();
|
|
6
|
+
extern "C" TSLanguage *tree_sitter_sdbl();
|
|
6
7
|
|
|
7
8
|
// "tree-sitter", "language" hashed with BLAKE2
|
|
8
9
|
const napi_type_tag LANGUAGE_TYPE_TAG = {
|
|
9
10
|
0x8AF2E5212AD58ABF, 0xD5006CAD83ABBA16
|
|
10
11
|
};
|
|
11
12
|
|
|
12
|
-
Napi::
|
|
13
|
-
auto language = Napi::External<TSLanguage>::New(env,
|
|
13
|
+
Napi::External<TSLanguage> CreateLanguage(Napi::Env env, TSLanguage *language_fn()) {
|
|
14
|
+
auto language = Napi::External<TSLanguage>::New(env, language_fn());
|
|
14
15
|
language.TypeTag(&LANGUAGE_TYPE_TAG);
|
|
16
|
+
return language;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
Napi::Object CreateLanguageObject(Napi::Env env, TSLanguage *language_fn()) {
|
|
20
|
+
auto language = CreateLanguage(env, language_fn);
|
|
21
|
+
auto object = Napi::Object::New(env);
|
|
22
|
+
object["language"] = language;
|
|
23
|
+
return object;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
Napi::Object Init(Napi::Env env, Napi::Object exports) {
|
|
27
|
+
auto language = CreateLanguage(env, tree_sitter_bsl);
|
|
15
28
|
exports["language"] = language;
|
|
29
|
+
exports["sdbl"] = CreateLanguageObject(env, tree_sitter_sdbl);
|
|
16
30
|
return exports;
|
|
17
31
|
}
|
|
18
32
|
|
|
@@ -3,7 +3,21 @@ const { test } = require("node:test");
|
|
|
3
3
|
|
|
4
4
|
const Parser = require("tree-sitter");
|
|
5
5
|
|
|
6
|
-
test("can load grammar", () => {
|
|
6
|
+
test("can load BSL grammar", () => {
|
|
7
7
|
const parser = new Parser();
|
|
8
|
-
|
|
8
|
+
const BSL = require(".");
|
|
9
|
+
assert.doesNotThrow(() => parser.setLanguage(BSL));
|
|
10
|
+
|
|
11
|
+
const tree = parser.parse("Процедура Проверка()\nКонецПроцедуры");
|
|
12
|
+
assert.equal(tree.rootNode.hasError, false);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test("can load SDBL grammar", () => {
|
|
16
|
+
const parser = new Parser();
|
|
17
|
+
const { sdbl } = require(".");
|
|
18
|
+
assert.ok(sdbl);
|
|
19
|
+
assert.doesNotThrow(() => parser.setLanguage(sdbl));
|
|
20
|
+
|
|
21
|
+
const tree = parser.parse("ВЫБРАТЬ\n *");
|
|
22
|
+
assert.equal(tree.rootNode.hasError, false);
|
|
9
23
|
});
|
package/bindings/node/index.d.ts
CHANGED
package/bindings/node/index.js
CHANGED
|
@@ -7,5 +7,6 @@ module.exports =
|
|
|
7
7
|
: require("node-gyp-build")(root);
|
|
8
8
|
|
|
9
9
|
try {
|
|
10
|
-
module.exports.nodeTypeInfo = require("../../src/node-types.json");
|
|
10
|
+
module.exports.nodeTypeInfo = require("../../grammars/bsl/src/node-types.json");
|
|
11
|
+
module.exports.sdbl.nodeTypeInfo = require("../../grammars/sdbl/src/node-types.json");
|
|
11
12
|
} catch (_) {}
|