tree-sitter-beancount 2.2.0 → 2.3.1
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/.gitattributes +6 -0
- package/.github/workflows/cicd.yml +1 -1
- package/.github/workflows/release.yml +3 -3
- package/CHANGELOG.md +19 -0
- package/Cargo.toml +1 -1
- package/Package.swift +20 -0
- package/binding.gyp +1 -1
- package/bindings/rust/build.rs +2 -0
- package/flake.lock +19 -19
- package/package.json +1 -1
- package/src/parser.c +30 -30
- package/src/scanner.c +208 -0
- package/src/tree_sitter/parser.h +11 -5
- package/src/scanner.cc +0 -171
package/.gitattributes
ADDED
|
@@ -9,7 +9,7 @@ jobs:
|
|
|
9
9
|
outputs:
|
|
10
10
|
release_created: ${{ steps.release.outputs.release_created }}
|
|
11
11
|
steps:
|
|
12
|
-
- uses: google-github-actions/release-please-action@
|
|
12
|
+
- uses: google-github-actions/release-please-action@v4
|
|
13
13
|
id: release
|
|
14
14
|
with:
|
|
15
15
|
release-type: node
|
|
@@ -34,7 +34,7 @@ jobs:
|
|
|
34
34
|
- name: Checking out sources
|
|
35
35
|
uses: actions/checkout@v4
|
|
36
36
|
- name: Cache Cargo
|
|
37
|
-
uses: actions/cache@
|
|
37
|
+
uses: actions/cache@v4
|
|
38
38
|
with:
|
|
39
39
|
path: |
|
|
40
40
|
~/.cargo/registry
|
|
@@ -59,7 +59,7 @@ jobs:
|
|
|
59
59
|
- name: Checking out sources
|
|
60
60
|
uses: actions/checkout@v4
|
|
61
61
|
- name: Set up Node
|
|
62
|
-
uses: actions/setup-node@
|
|
62
|
+
uses: actions/setup-node@v4.0.2
|
|
63
63
|
with:
|
|
64
64
|
node-version: '16'
|
|
65
65
|
registry-url: 'https://registry.npmjs.org'
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.1](https://github.com/polarmutex/tree-sitter-beancount/compare/v2.3.0...v2.3.1) (2024-02-29)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* cargo version ([01cc2ca](https://github.com/polarmutex/tree-sitter-beancount/commit/01cc2ca9073b1dab75e6d7996f48331b0c3f9057))
|
|
9
|
+
|
|
10
|
+
## [2.3.0](https://github.com/polarmutex/tree-sitter-beancount/compare/v2.2.0...v2.3.0) (2024-02-29)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* Add swift bindings ([0e08ee4](https://github.com/polarmutex/tree-sitter-beancount/commit/0e08ee4212edef5088bb3dd93ab0ba01f94792b0))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
* remove unneeded excludes ([cd08aef](https://github.com/polarmutex/tree-sitter-beancount/commit/cd08aefa20dc0f3d5984b08b5d468f75bf4fd096))
|
|
21
|
+
|
|
3
22
|
## [2.2.0](https://github.com/polarmutex/tree-sitter-beancount/compare/v2.1.3...v2.2.0) (2023-10-10)
|
|
4
23
|
|
|
5
24
|
|
package/Cargo.toml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "tree-sitter-beancount"
|
|
3
3
|
description = "beancount grammar for the tree-sitter parsing library"
|
|
4
|
-
version = "2.
|
|
4
|
+
version = "2.3.1" # {x-release-please-version}
|
|
5
5
|
keywords = ["incremental", "parsing", "beancount", "tree-sitter"]
|
|
6
6
|
categories = ["parsing", "text-editors"]
|
|
7
7
|
repository = "https://github.com/polarmutex/tree-sitter-beancount"
|
package/Package.swift
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// swift-tools-version:5.3
|
|
2
|
+
import PackageDescription
|
|
3
|
+
|
|
4
|
+
let package = Package(
|
|
5
|
+
name: "TreeSitterBeancount",
|
|
6
|
+
products: [
|
|
7
|
+
.library(name: "TreeSitterBeancount", targets: ["TreeSitterBeancount"]),
|
|
8
|
+
],
|
|
9
|
+
dependencies: [],
|
|
10
|
+
targets: [
|
|
11
|
+
.target(name: "TreeSitterBeancount",
|
|
12
|
+
path: ".",
|
|
13
|
+
sources: [
|
|
14
|
+
"src/parser.c",
|
|
15
|
+
"src/scanner.cc",
|
|
16
|
+
],
|
|
17
|
+
publicHeadersPath: "bindings/swift",
|
|
18
|
+
cSettings: [.headerSearchPath("src")])
|
|
19
|
+
]
|
|
20
|
+
)
|
package/binding.gyp
CHANGED
package/bindings/rust/build.rs
CHANGED
|
@@ -25,6 +25,7 @@ fn main() {
|
|
|
25
25
|
// If your language uses an external scanner written in C++,
|
|
26
26
|
// then include this block of code:
|
|
27
27
|
|
|
28
|
+
/*
|
|
28
29
|
let mut cpp_config = cc::Build::new();
|
|
29
30
|
cpp_config.cpp(true);
|
|
30
31
|
cpp_config.include(&src_dir);
|
|
@@ -35,4 +36,5 @@ fn main() {
|
|
|
35
36
|
cpp_config.file(&scanner_path);
|
|
36
37
|
cpp_config.compile("scanner");
|
|
37
38
|
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
|
|
39
|
+
*/
|
|
38
40
|
}
|
package/flake.lock
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
"flake-compat": {
|
|
4
4
|
"flake": false,
|
|
5
5
|
"locked": {
|
|
6
|
-
"lastModified":
|
|
7
|
-
"narHash": "sha256-
|
|
6
|
+
"lastModified": 1696426674,
|
|
7
|
+
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
|
8
8
|
"owner": "edolstra",
|
|
9
9
|
"repo": "flake-compat",
|
|
10
|
-
"rev": "
|
|
10
|
+
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
|
11
11
|
"type": "github"
|
|
12
12
|
},
|
|
13
13
|
"original": {
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
"systems": "systems"
|
|
22
22
|
},
|
|
23
23
|
"locked": {
|
|
24
|
-
"lastModified":
|
|
25
|
-
"narHash": "sha256-
|
|
24
|
+
"lastModified": 1709126324,
|
|
25
|
+
"narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
|
|
26
26
|
"owner": "numtide",
|
|
27
27
|
"repo": "flake-utils",
|
|
28
|
-
"rev": "
|
|
28
|
+
"rev": "d465f4819400de7c8d874d50b982301f28a84605",
|
|
29
29
|
"type": "github"
|
|
30
30
|
},
|
|
31
31
|
"original": {
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
]
|
|
43
43
|
},
|
|
44
44
|
"locked": {
|
|
45
|
-
"lastModified":
|
|
46
|
-
"narHash": "sha256-
|
|
45
|
+
"lastModified": 1703887061,
|
|
46
|
+
"narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=",
|
|
47
47
|
"owner": "hercules-ci",
|
|
48
48
|
"repo": "gitignore.nix",
|
|
49
|
-
"rev": "
|
|
49
|
+
"rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5",
|
|
50
50
|
"type": "github"
|
|
51
51
|
},
|
|
52
52
|
"original": {
|
|
@@ -57,11 +57,11 @@
|
|
|
57
57
|
},
|
|
58
58
|
"nixpkgs": {
|
|
59
59
|
"locked": {
|
|
60
|
-
"lastModified":
|
|
61
|
-
"narHash": "sha256-
|
|
60
|
+
"lastModified": 1708984720,
|
|
61
|
+
"narHash": "sha256-gJctErLbXx4QZBBbGp78PxtOOzsDaQ+yw1ylNQBuSUY=",
|
|
62
62
|
"owner": "NixOS",
|
|
63
63
|
"repo": "nixpkgs",
|
|
64
|
-
"rev": "
|
|
64
|
+
"rev": "13aff9b34cc32e59d35c62ac9356e4a41198a538",
|
|
65
65
|
"type": "github"
|
|
66
66
|
},
|
|
67
67
|
"original": {
|
|
@@ -73,16 +73,16 @@
|
|
|
73
73
|
},
|
|
74
74
|
"nixpkgs-stable": {
|
|
75
75
|
"locked": {
|
|
76
|
-
"lastModified":
|
|
77
|
-
"narHash": "sha256-
|
|
76
|
+
"lastModified": 1704874635,
|
|
77
|
+
"narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=",
|
|
78
78
|
"owner": "NixOS",
|
|
79
79
|
"repo": "nixpkgs",
|
|
80
|
-
"rev": "
|
|
80
|
+
"rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356",
|
|
81
81
|
"type": "github"
|
|
82
82
|
},
|
|
83
83
|
"original": {
|
|
84
84
|
"owner": "NixOS",
|
|
85
|
-
"ref": "nixos-23.
|
|
85
|
+
"ref": "nixos-23.11",
|
|
86
86
|
"repo": "nixpkgs",
|
|
87
87
|
"type": "github"
|
|
88
88
|
}
|
|
@@ -100,11 +100,11 @@
|
|
|
100
100
|
"nixpkgs-stable": "nixpkgs-stable"
|
|
101
101
|
},
|
|
102
102
|
"locked": {
|
|
103
|
-
"lastModified":
|
|
104
|
-
"narHash": "sha256-
|
|
103
|
+
"lastModified": 1708018599,
|
|
104
|
+
"narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=",
|
|
105
105
|
"owner": "cachix",
|
|
106
106
|
"repo": "pre-commit-hooks.nix",
|
|
107
|
-
"rev": "
|
|
107
|
+
"rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431",
|
|
108
108
|
"type": "github"
|
|
109
109
|
},
|
|
110
110
|
"original": {
|
package/package.json
CHANGED
package/src/parser.c
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#include
|
|
1
|
+
#include "tree_sitter/parser.h"
|
|
2
2
|
|
|
3
3
|
#if defined(__GNUC__) || defined(__clang__)
|
|
4
4
|
#pragma GCC diagnostic push
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
#define MAX_ALIAS_SEQUENCE_LENGTH 9
|
|
17
17
|
#define PRODUCTION_ID_COUNT 88
|
|
18
18
|
|
|
19
|
-
enum {
|
|
19
|
+
enum ts_symbol_identifiers {
|
|
20
20
|
sym_identifier = 1,
|
|
21
21
|
anon_sym_LF = 2,
|
|
22
22
|
anon_sym_CR = 3,
|
|
@@ -974,7 +974,7 @@ static const TSSymbolMetadata ts_symbol_metadata[] = {
|
|
|
974
974
|
},
|
|
975
975
|
};
|
|
976
976
|
|
|
977
|
-
enum {
|
|
977
|
+
enum ts_field_identifiers {
|
|
978
978
|
field_account = 1,
|
|
979
979
|
field_amount = 2,
|
|
980
980
|
field_comment = 3,
|
|
@@ -5715,33 +5715,6 @@ static const TSLexMode ts_lex_modes[STATE_COUNT] = {
|
|
|
5715
5715
|
[615] = {.lex_state = 0},
|
|
5716
5716
|
};
|
|
5717
5717
|
|
|
5718
|
-
enum {
|
|
5719
|
-
ts_external_token__stars = 0,
|
|
5720
|
-
ts_external_token__sectionend = 1,
|
|
5721
|
-
ts_external_token__eof = 2,
|
|
5722
|
-
};
|
|
5723
|
-
|
|
5724
|
-
static const TSSymbol ts_external_scanner_symbol_map[EXTERNAL_TOKEN_COUNT] = {
|
|
5725
|
-
[ts_external_token__stars] = sym__stars,
|
|
5726
|
-
[ts_external_token__sectionend] = sym__sectionend,
|
|
5727
|
-
[ts_external_token__eof] = sym__eof,
|
|
5728
|
-
};
|
|
5729
|
-
|
|
5730
|
-
static const bool ts_external_scanner_states[4][EXTERNAL_TOKEN_COUNT] = {
|
|
5731
|
-
[1] = {
|
|
5732
|
-
[ts_external_token__stars] = true,
|
|
5733
|
-
[ts_external_token__sectionend] = true,
|
|
5734
|
-
[ts_external_token__eof] = true,
|
|
5735
|
-
},
|
|
5736
|
-
[2] = {
|
|
5737
|
-
[ts_external_token__stars] = true,
|
|
5738
|
-
},
|
|
5739
|
-
[3] = {
|
|
5740
|
-
[ts_external_token__stars] = true,
|
|
5741
|
-
[ts_external_token__sectionend] = true,
|
|
5742
|
-
},
|
|
5743
|
-
};
|
|
5744
|
-
|
|
5745
5718
|
static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = {
|
|
5746
5719
|
[0] = {
|
|
5747
5720
|
[ts_builtin_sym_end] = ACTIONS(1),
|
|
@@ -16333,6 +16306,33 @@ static const TSParseActionEntry ts_parse_actions[] = {
|
|
|
16333
16306
|
[1609] = {.entry = {.count = 1, .reusable = true}}, SHIFT(448),
|
|
16334
16307
|
};
|
|
16335
16308
|
|
|
16309
|
+
enum ts_external_scanner_symbol_identifiers {
|
|
16310
|
+
ts_external_token__stars = 0,
|
|
16311
|
+
ts_external_token__sectionend = 1,
|
|
16312
|
+
ts_external_token__eof = 2,
|
|
16313
|
+
};
|
|
16314
|
+
|
|
16315
|
+
static const TSSymbol ts_external_scanner_symbol_map[EXTERNAL_TOKEN_COUNT] = {
|
|
16316
|
+
[ts_external_token__stars] = sym__stars,
|
|
16317
|
+
[ts_external_token__sectionend] = sym__sectionend,
|
|
16318
|
+
[ts_external_token__eof] = sym__eof,
|
|
16319
|
+
};
|
|
16320
|
+
|
|
16321
|
+
static const bool ts_external_scanner_states[4][EXTERNAL_TOKEN_COUNT] = {
|
|
16322
|
+
[1] = {
|
|
16323
|
+
[ts_external_token__stars] = true,
|
|
16324
|
+
[ts_external_token__sectionend] = true,
|
|
16325
|
+
[ts_external_token__eof] = true,
|
|
16326
|
+
},
|
|
16327
|
+
[2] = {
|
|
16328
|
+
[ts_external_token__stars] = true,
|
|
16329
|
+
},
|
|
16330
|
+
[3] = {
|
|
16331
|
+
[ts_external_token__stars] = true,
|
|
16332
|
+
[ts_external_token__sectionend] = true,
|
|
16333
|
+
},
|
|
16334
|
+
};
|
|
16335
|
+
|
|
16336
16336
|
#ifdef __cplusplus
|
|
16337
16337
|
extern "C" {
|
|
16338
16338
|
#endif
|
package/src/scanner.c
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
#include <stdio.h> // test
|
|
2
|
+
#include <tree_sitter/parser.h>
|
|
3
|
+
#include <wctype.h>
|
|
4
|
+
|
|
5
|
+
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
|
6
|
+
|
|
7
|
+
typedef struct {
|
|
8
|
+
uint32_t length;
|
|
9
|
+
uint32_t capacity;
|
|
10
|
+
int16_t *data;
|
|
11
|
+
} vec;
|
|
12
|
+
|
|
13
|
+
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
|
14
|
+
|
|
15
|
+
#define VEC_RESIZE(vec, _cap) \
|
|
16
|
+
void *tmp = realloc((vec).data, (_cap) * sizeof((vec).data[0])); \
|
|
17
|
+
(vec).data = tmp; \
|
|
18
|
+
(vec).capacity = (_cap);
|
|
19
|
+
|
|
20
|
+
#define VEC_GROW(vec, _cap) \
|
|
21
|
+
if ((vec).capacity < (_cap)) { \
|
|
22
|
+
VEC_RESIZE((vec), (_cap)); \
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
#define VEC_PUSH(vec, el) \
|
|
26
|
+
if ((vec).capacity == (vec).length) { \
|
|
27
|
+
VEC_RESIZE((vec), MAX(16, (vec).length * 2)); \
|
|
28
|
+
} \
|
|
29
|
+
(vec).data[(vec).length++] = (el);
|
|
30
|
+
|
|
31
|
+
#define VEC_POP(vec) (vec).length--;
|
|
32
|
+
|
|
33
|
+
#define VEC_NEW \
|
|
34
|
+
{ .len = 0, .capacity = 0, .data = NULL }
|
|
35
|
+
|
|
36
|
+
#define VEC_BACK(vec) ((vec).data[(vec).length - 1])
|
|
37
|
+
|
|
38
|
+
#define VEC_FREE(vec) \
|
|
39
|
+
{ \
|
|
40
|
+
if ((vec).data != NULL) \
|
|
41
|
+
free((vec).data); \
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#define VEC_CLEAR(vec) (vec).length = 0;
|
|
45
|
+
|
|
46
|
+
enum TokenType {
|
|
47
|
+
SECTION,
|
|
48
|
+
SECTIONEND,
|
|
49
|
+
END_OF_FILE,
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
typedef struct {
|
|
53
|
+
vec indent_length_stack;
|
|
54
|
+
vec org_section_stack;
|
|
55
|
+
} Scanner;
|
|
56
|
+
|
|
57
|
+
unsigned serialize(Scanner *scanner, char *buffer) {
|
|
58
|
+
size_t i = 0;
|
|
59
|
+
|
|
60
|
+
size_t indent_count = scanner->indent_length_stack.length - 1;
|
|
61
|
+
if (indent_count > UINT8_MAX)
|
|
62
|
+
indent_count = UINT8_MAX;
|
|
63
|
+
buffer[i++] = (char)indent_count;
|
|
64
|
+
|
|
65
|
+
int iter = 1;
|
|
66
|
+
for (; iter < scanner->indent_length_stack.length
|
|
67
|
+
&& i < TREE_SITTER_SERIALIZATION_BUFFER_SIZE;
|
|
68
|
+
++iter) {
|
|
69
|
+
buffer[i++] = (char)scanner->indent_length_stack.data[iter];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
size_t org_section_count = scanner->org_section_stack.length - 1;
|
|
73
|
+
if (org_section_count > UINT8_MAX)
|
|
74
|
+
org_section_count = UINT8_MAX;
|
|
75
|
+
buffer[i++] = (char)org_section_count;
|
|
76
|
+
|
|
77
|
+
iter = 1;
|
|
78
|
+
for (; iter < scanner->org_section_stack.length
|
|
79
|
+
&& i < TREE_SITTER_SERIALIZATION_BUFFER_SIZE;
|
|
80
|
+
++iter) {
|
|
81
|
+
buffer[i++] = (char)scanner->org_section_stack.data[iter];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return i;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
void deserialize(Scanner *scanner, const char *buffer, unsigned length) {
|
|
88
|
+
VEC_CLEAR(scanner->org_section_stack);
|
|
89
|
+
VEC_PUSH(scanner->org_section_stack, 0);
|
|
90
|
+
VEC_CLEAR(scanner->indent_length_stack);
|
|
91
|
+
VEC_PUSH(scanner->indent_length_stack, 0);
|
|
92
|
+
|
|
93
|
+
if (length == 0)
|
|
94
|
+
return;
|
|
95
|
+
|
|
96
|
+
size_t i = 0;
|
|
97
|
+
|
|
98
|
+
size_t indent_count = (unsigned char)buffer[i++];
|
|
99
|
+
for (; i <= indent_count; i++) {
|
|
100
|
+
VEC_PUSH(scanner->indent_length_stack, (unsigned char)buffer[i]);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
size_t org_section_count = (unsigned char)buffer[i++];
|
|
104
|
+
for (; i < length; i++) {
|
|
105
|
+
VEC_PUSH(scanner->org_section_stack, (unsigned char)buffer[i]);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
void advance(TSLexer *lexer) {
|
|
110
|
+
lexer->advance(lexer, false);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
void skip(TSLexer *lexer) {
|
|
114
|
+
lexer->advance(lexer, true);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
static bool in_error_recovery(const bool *valid_symbols) {
|
|
118
|
+
return (valid_symbols[SECTION] && valid_symbols[SECTIONEND]
|
|
119
|
+
&& valid_symbols[END_OF_FILE]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
bool scan(Scanner *scanner, TSLexer *lexer, const bool *valid_symbols) {
|
|
123
|
+
|
|
124
|
+
if (in_error_recovery(valid_symbols))
|
|
125
|
+
return false;
|
|
126
|
+
|
|
127
|
+
// - Section ends
|
|
128
|
+
int16_t indent_length = 0;
|
|
129
|
+
lexer->mark_end(lexer);
|
|
130
|
+
for (;;) {
|
|
131
|
+
if (lexer->lookahead == ' ') {
|
|
132
|
+
indent_length++;
|
|
133
|
+
} else if (lexer->lookahead == '\t') {
|
|
134
|
+
indent_length += 8;
|
|
135
|
+
} else if (lexer->lookahead == '\0') {
|
|
136
|
+
|
|
137
|
+
if (valid_symbols[SECTIONEND]) {
|
|
138
|
+
lexer->result_symbol = SECTIONEND;
|
|
139
|
+
} else if (valid_symbols[END_OF_FILE]) {
|
|
140
|
+
lexer->result_symbol = END_OF_FILE;
|
|
141
|
+
} else {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return true;
|
|
146
|
+
} else {
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
skip(lexer);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (indent_length == 0 && lexer->lookahead == '*') {
|
|
153
|
+
lexer->mark_end(lexer);
|
|
154
|
+
int16_t stars = 1;
|
|
155
|
+
skip(lexer);
|
|
156
|
+
while (lexer->lookahead == '*') {
|
|
157
|
+
stars++;
|
|
158
|
+
skip(lexer);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (valid_symbols[SECTIONEND] && iswspace(lexer->lookahead) && stars > 0
|
|
162
|
+
&& stars <= VEC_BACK(scanner->org_section_stack)) {
|
|
163
|
+
VEC_POP(scanner->org_section_stack);
|
|
164
|
+
lexer->result_symbol = SECTIONEND;
|
|
165
|
+
return true;
|
|
166
|
+
} else if (valid_symbols[SECTION] && iswspace(lexer->lookahead)) {
|
|
167
|
+
VEC_PUSH(scanner->org_section_stack, stars);
|
|
168
|
+
lexer->result_symbol = SECTION;
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return false; // default
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
void *tree_sitter_beancount_external_scanner_create() {
|
|
178
|
+
Scanner *scanner = (Scanner *)calloc(1, sizeof(Scanner));
|
|
179
|
+
deserialize(scanner, NULL, 0);
|
|
180
|
+
return scanner;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
bool tree_sitter_beancount_external_scanner_scan(void *payload,
|
|
184
|
+
TSLexer *lexer,
|
|
185
|
+
const bool *valid_symbols) {
|
|
186
|
+
Scanner *scanner = (Scanner *)payload;
|
|
187
|
+
return scan(scanner, lexer, valid_symbols);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
unsigned tree_sitter_beancount_external_scanner_serialize(void *payload,
|
|
191
|
+
char *buffer) {
|
|
192
|
+
Scanner *scanner = (Scanner *)payload;
|
|
193
|
+
return serialize(scanner, buffer);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
void tree_sitter_beancount_external_scanner_deserialize(void *payload,
|
|
197
|
+
const char *buffer,
|
|
198
|
+
unsigned length) {
|
|
199
|
+
Scanner *scanner = (Scanner *)payload;
|
|
200
|
+
deserialize(scanner, buffer, length);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
void tree_sitter_beancount_external_scanner_destroy(void *payload) {
|
|
204
|
+
Scanner *scanner = (Scanner *)payload;
|
|
205
|
+
VEC_FREE(scanner->indent_length_stack);
|
|
206
|
+
VEC_FREE(scanner->org_section_stack);
|
|
207
|
+
free(scanner);
|
|
208
|
+
}
|
package/src/tree_sitter/parser.h
CHANGED
|
@@ -13,9 +13,8 @@ extern "C" {
|
|
|
13
13
|
#define ts_builtin_sym_end 0
|
|
14
14
|
#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
|
|
15
15
|
|
|
16
|
-
typedef uint16_t TSStateId;
|
|
17
|
-
|
|
18
16
|
#ifndef TREE_SITTER_API_H_
|
|
17
|
+
typedef uint16_t TSStateId;
|
|
19
18
|
typedef uint16_t TSSymbol;
|
|
20
19
|
typedef uint16_t TSFieldId;
|
|
21
20
|
typedef struct TSLanguage TSLanguage;
|
|
@@ -130,9 +129,16 @@ struct TSLanguage {
|
|
|
130
129
|
* Lexer Macros
|
|
131
130
|
*/
|
|
132
131
|
|
|
132
|
+
#ifdef _MSC_VER
|
|
133
|
+
#define UNUSED __pragma(warning(suppress : 4101))
|
|
134
|
+
#else
|
|
135
|
+
#define UNUSED __attribute__((unused))
|
|
136
|
+
#endif
|
|
137
|
+
|
|
133
138
|
#define START_LEXER() \
|
|
134
139
|
bool result = false; \
|
|
135
140
|
bool skip = false; \
|
|
141
|
+
UNUSED \
|
|
136
142
|
bool eof = false; \
|
|
137
143
|
int32_t lookahead; \
|
|
138
144
|
goto start; \
|
|
@@ -166,7 +172,7 @@ struct TSLanguage {
|
|
|
166
172
|
* Parse Table Macros
|
|
167
173
|
*/
|
|
168
174
|
|
|
169
|
-
#define SMALL_STATE(id) id - LARGE_STATE_COUNT
|
|
175
|
+
#define SMALL_STATE(id) ((id) - LARGE_STATE_COUNT)
|
|
170
176
|
|
|
171
177
|
#define STATE(id) id
|
|
172
178
|
|
|
@@ -176,7 +182,7 @@ struct TSLanguage {
|
|
|
176
182
|
{{ \
|
|
177
183
|
.shift = { \
|
|
178
184
|
.type = TSParseActionTypeShift, \
|
|
179
|
-
.state = state_value
|
|
185
|
+
.state = (state_value) \
|
|
180
186
|
} \
|
|
181
187
|
}}
|
|
182
188
|
|
|
@@ -184,7 +190,7 @@ struct TSLanguage {
|
|
|
184
190
|
{{ \
|
|
185
191
|
.shift = { \
|
|
186
192
|
.type = TSParseActionTypeShift, \
|
|
187
|
-
.state = state_value,
|
|
193
|
+
.state = (state_value), \
|
|
188
194
|
.repetition = true \
|
|
189
195
|
} \
|
|
190
196
|
}}
|
package/src/scanner.cc
DELETED
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
#include <cwctype>
|
|
2
|
-
#include <tree_sitter/parser.h>
|
|
3
|
-
#include <vector>
|
|
4
|
-
|
|
5
|
-
namespace {
|
|
6
|
-
|
|
7
|
-
using std::iswspace;
|
|
8
|
-
using std::vector;
|
|
9
|
-
|
|
10
|
-
enum TokenType {
|
|
11
|
-
SECTION,
|
|
12
|
-
SECTIONEND,
|
|
13
|
-
END_OF_FILE,
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
struct Scanner {
|
|
17
|
-
vector<int16_t> indent_length_stack;
|
|
18
|
-
vector<int16_t> org_section_stack;
|
|
19
|
-
|
|
20
|
-
Scanner() {
|
|
21
|
-
deserialize(NULL, 0);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
unsigned serialize(char *buffer) {
|
|
25
|
-
size_t i = 0;
|
|
26
|
-
|
|
27
|
-
size_t indent_count = indent_length_stack.size() - 1;
|
|
28
|
-
if (indent_count > UINT8_MAX)
|
|
29
|
-
indent_count = UINT8_MAX;
|
|
30
|
-
buffer[i++] = indent_count;
|
|
31
|
-
|
|
32
|
-
vector<int16_t>::iterator iter = indent_length_stack.begin() + 1,
|
|
33
|
-
end = indent_length_stack.end();
|
|
34
|
-
|
|
35
|
-
for (; iter != end && i < TREE_SITTER_SERIALIZATION_BUFFER_SIZE;
|
|
36
|
-
++iter) {
|
|
37
|
-
buffer[i++] = *iter;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
iter = org_section_stack.begin() + 1;
|
|
41
|
-
end = org_section_stack.end();
|
|
42
|
-
|
|
43
|
-
for (; iter != end && i < TREE_SITTER_SERIALIZATION_BUFFER_SIZE;
|
|
44
|
-
++iter) {
|
|
45
|
-
buffer[i++] = *iter;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return i;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
void deserialize(const char *buffer, unsigned length) {
|
|
52
|
-
org_section_stack.clear();
|
|
53
|
-
org_section_stack.push_back(0);
|
|
54
|
-
indent_length_stack.clear();
|
|
55
|
-
indent_length_stack.push_back(-1);
|
|
56
|
-
|
|
57
|
-
if (length == 0)
|
|
58
|
-
return;
|
|
59
|
-
|
|
60
|
-
size_t i = 0;
|
|
61
|
-
|
|
62
|
-
size_t indent_count = (uint8_t)buffer[i++];
|
|
63
|
-
|
|
64
|
-
for (; i <= indent_count; i++)
|
|
65
|
-
indent_length_stack.push_back(buffer[i]);
|
|
66
|
-
for (; i < length; i++)
|
|
67
|
-
org_section_stack.push_back(buffer[i]);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
void advance(TSLexer *lexer) {
|
|
71
|
-
lexer->advance(lexer, false);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
void skip(TSLexer *lexer) {
|
|
75
|
-
lexer->advance(lexer, true);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
static bool in_error_recovery(const bool *valid_symbols) {
|
|
79
|
-
return (valid_symbols[SECTION] && valid_symbols[SECTIONEND]
|
|
80
|
-
&& valid_symbols[END_OF_FILE]);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
bool scan(TSLexer *lexer, const bool *valid_symbols) {
|
|
84
|
-
|
|
85
|
-
if (in_error_recovery(valid_symbols))
|
|
86
|
-
return false;
|
|
87
|
-
|
|
88
|
-
// - Section ends
|
|
89
|
-
int16_t indent_length = 0;
|
|
90
|
-
lexer->mark_end(lexer);
|
|
91
|
-
for (;;) {
|
|
92
|
-
if (lexer->lookahead == ' ') {
|
|
93
|
-
indent_length++;
|
|
94
|
-
} else if (lexer->lookahead == '\t') {
|
|
95
|
-
indent_length += 8;
|
|
96
|
-
} else if (lexer->lookahead == '\0') {
|
|
97
|
-
|
|
98
|
-
if (valid_symbols[SECTIONEND]) {
|
|
99
|
-
lexer->result_symbol = SECTIONEND;
|
|
100
|
-
} else if (valid_symbols[END_OF_FILE]) {
|
|
101
|
-
lexer->result_symbol = END_OF_FILE;
|
|
102
|
-
} else {
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return true;
|
|
107
|
-
} else {
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
skip(lexer);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (indent_length == 0 && lexer->lookahead == '*') {
|
|
114
|
-
lexer->mark_end(lexer);
|
|
115
|
-
int16_t stars = 1;
|
|
116
|
-
skip(lexer);
|
|
117
|
-
while (lexer->lookahead == '*') {
|
|
118
|
-
stars++;
|
|
119
|
-
skip(lexer);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (valid_symbols[SECTIONEND] && iswspace(lexer->lookahead)
|
|
123
|
-
&& stars > 0 && stars <= org_section_stack.back()) {
|
|
124
|
-
org_section_stack.pop_back();
|
|
125
|
-
lexer->result_symbol = SECTIONEND;
|
|
126
|
-
return true;
|
|
127
|
-
} else if (valid_symbols[SECTION] && iswspace(lexer->lookahead)) {
|
|
128
|
-
org_section_stack.push_back(stars);
|
|
129
|
-
lexer->result_symbol = SECTION;
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return false; // default
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
} // namespace
|
|
140
|
-
|
|
141
|
-
extern "C" {
|
|
142
|
-
|
|
143
|
-
void *tree_sitter_beancount_external_scanner_create() {
|
|
144
|
-
return new Scanner();
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
bool tree_sitter_beancount_external_scanner_scan(void *payload,
|
|
148
|
-
TSLexer *lexer,
|
|
149
|
-
const bool *valid_symbols) {
|
|
150
|
-
Scanner *scanner = static_cast<Scanner *>(payload);
|
|
151
|
-
return scanner->scan(lexer, valid_symbols);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
unsigned tree_sitter_beancount_external_scanner_serialize(void *payload,
|
|
155
|
-
char *buffer) {
|
|
156
|
-
Scanner *scanner = static_cast<Scanner *>(payload);
|
|
157
|
-
return scanner->serialize(buffer);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
void tree_sitter_beancount_external_scanner_deserialize(void *payload,
|
|
161
|
-
const char *buffer,
|
|
162
|
-
unsigned length) {
|
|
163
|
-
Scanner *scanner = static_cast<Scanner *>(payload);
|
|
164
|
-
scanner->deserialize(buffer, length);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
void tree_sitter_beancount_external_scanner_destroy(void *payload) {
|
|
168
|
-
Scanner *scanner = static_cast<Scanner *>(payload);
|
|
169
|
-
delete scanner;
|
|
170
|
-
}
|
|
171
|
-
}
|