Use tree-sitter-yaml from crates.io

pull/795/head
Wilfred Hughes 2024-12-21 14:19:40 +07:00
parent dda64336e6
commit dfcb26c7af
45 changed files with 19 additions and 60908 deletions

@ -2,7 +2,7 @@
### Parsing
Updated to the latest tree-sitter parser for Make.
Updated to the latest tree-sitter parser for Make and YAML.
## 0.62 (released 20th December 2024)

11
Cargo.lock generated

@ -272,6 +272,7 @@ dependencies = [
"tree-sitter-toml-ng",
"tree-sitter-typescript",
"tree-sitter-xml",
"tree-sitter-yaml",
"tree_magic_mini",
"typed-arena",
"unicode-width",
@ -1259,6 +1260,16 @@ dependencies = [
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-yaml"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0c99f2b92b677f1a18b6b232fa9329afb5758118238a7d0b29cae324ef50d5e"
dependencies = [
"cc",
"tree-sitter-language",
]
[[package]]
name = "tree_magic_mini"
version = "3.1.5"

@ -97,6 +97,7 @@ tree-sitter-toml-ng = "0.7.0"
tree-sitter-lua = "0.2.0"
tree-sitter-xml = "0.7.0"
tree-sitter-make = "1.1.1"
tree-sitter-yaml = "0.7.0"
[dev-dependencies]
# assert_cmd 2.0.10 requires predicates 3.

@ -242,11 +242,6 @@ fn main() {
src_dir: "vendored_parsers/tree-sitter-vhdl-src",
extra_files: vec![],
},
TreeSitterParser {
name: "tree-sitter-yaml",
src_dir: "vendored_parsers/tree-sitter-yaml-src",
extra_files: vec!["scanner.cc"],
},
TreeSitterParser {
name: "tree-sitter-zig",
src_dir: "vendored_parsers/tree-sitter-zig-src",

@ -71,5 +71,5 @@ with `difft --list-languages`.
| SCSS | [serenadeai/tree-sitter-scss](https://github.com/serenadeai/tree-sitter-scss) |
| TOML | [tree-sitter-grammars/tree-sitter-toml](https://github.com/tree-sitter-grammars/tree-sitter-toml) |
| XML | [tree-sitter-grammars/tree-sitter-xml](https://github.com/tree-sitter-grammars/tree-sitter-xml) |
| YAML | [ikatyang/tree-sitter-yaml](https://github.com/ikatyang/tree-sitter-yaml) |
| YAML | [tree-sitter-grammars/tree-sitter-yaml](https://github.com/tree-sitter-grammars/tree-sitter-yaml) |

@ -96,7 +96,6 @@ extern "C" {
fn tree_sitter_sql() -> ts::Language;
fn tree_sitter_swift() -> ts::Language;
fn tree_sitter_vhdl() -> ts::Language;
fn tree_sitter_yaml() -> ts::Language;
fn tree_sitter_zig() -> ts::Language;
}
@ -1093,7 +1092,9 @@ pub(crate) fn from_language(language: guess::Language) -> TreeSitterConfig {
}
}
Yaml => {
let language = unsafe { tree_sitter_yaml() };
let language_fn = tree_sitter_yaml::LANGUAGE;
let language = tree_sitter::Language::new(language_fn);
TreeSitterConfig {
language: language.clone(),
atom_nodes: vec![
@ -1105,11 +1106,8 @@ pub(crate) fn from_language(language: guess::Language) -> TreeSitterConfig {
.into_iter()
.collect(),
delimiter_tokens: (vec![("{", "}"), ("(", ")"), ("[", "]")]),
highlight_query: ts::Query::new(
&language,
include_str!("../../vendored_parsers/highlights/yaml.scm"),
)
.unwrap(),
highlight_query: ts::Query::new(&language, tree_sitter_yaml::HIGHLIGHTS_QUERY)
.unwrap(),
sub_languages: vec![],
}
}

@ -1,51 +0,0 @@
;; Taken from nvim-treesitter, under Apache license.
;; Upstream URL:https://github.com/nvim-treesitter/nvim-treesitter/blob/master/queries/yaml/highlights.scm
(boolean_scalar) @boolean
(null_scalar) @constant.builtin
(double_quote_scalar) @string
(single_quote_scalar) @string
(block_scalar) @string
(string_scalar) @string
(escape_sequence) @string.escape
(integer_scalar) @number
(float_scalar) @number
(comment) @comment
(anchor_name) @type
(alias_name) @type
(tag) @type
(yaml_directive) @keyword
(ERROR) @error
(block_mapping_pair
key: (flow_node [(double_quote_scalar) (single_quote_scalar)] @field))
(block_mapping_pair
key: (flow_node (plain_scalar (string_scalar) @field)))
(flow_mapping
(_ key: (flow_node [(double_quote_scalar) (single_quote_scalar)] @field)))
(flow_mapping
(_ key: (flow_node (plain_scalar (string_scalar) @field))))
[
","
"-"
":"
">"
"?"
"|"
] @punctuation.delimiter
[
"["
"]"
"{"
"}"
] @punctuation.bracket
[
"*"
"&"
"---"
"..."
] @punctuation.special

@ -1 +0,0 @@
tree-sitter-yaml/src

@ -1,12 +0,0 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[corpus/*]
trim_trailing_whitespace = false

@ -1,7 +0,0 @@
* text eol=lf
*.wasm binary
/src/** linguist-generated
/src/scanner.cc linguist-generated=false
/index.js linguist-generated
/binding.gyp linguist-detectable=false

@ -1,5 +0,0 @@
/build
/node_modules
/bindings/rust
/Cargo.toml

@ -1,8 +0,0 @@
[submodule "tree-sitter"]
path = tree-sitter
url = https://github.com/ikatyang/tree-sitter
branch = v0.19.3-custom
[submodule "yaml-test-suite"]
path = yaml-test-suite
url = https://github.com/yaml/yaml-test-suite
branch = data

@ -1,13 +0,0 @@
language: rust
rust:
- stable
script:
- if [ ! -d "./tree-sitter/target/release" ]; then bash ./scripts/setup-tree-sitter.sh; fi
- ./tree-sitter/target/release/tree-sitter test
cache:
cargo: true
directories:
- ./tree-sitter

@ -1,69 +0,0 @@
# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
# [0.5.0](https://github.com/ikatyang/tree-sitter-yaml/compare/v0.4.1...v0.5.0) (2021-04-18)
### Features
* expose `anchor_name`, `alias_name`, `&`, and `*` ([#24](https://github.com/ikatyang/tree-sitter-yaml/issues/24)) ([b77b438](https://github.com/ikatyang/tree-sitter-yaml/commit/b77b438))
## [0.4.1](https://github.com/ikatyang/tree-sitter-yaml/compare/v0.4.0...v0.4.1) (2021-03-21)
### Bug Fixes
* add missing binding.gyp ([#21](https://github.com/ikatyang/tree-sitter-yaml/issues/21)) ([5976a87](https://github.com/ikatyang/tree-sitter-yaml/commit/5976a87))
# [0.4.0](https://github.com/ikatyang/tree-sitter-yaml/compare/v0.3.1...v0.4.0) (2021-03-14)
### ⚠ BREAKING CHANGES
* require tree-sitter 0.19+
### Features
* upgrade to tree-sitter@0.19.3 ([#19](https://github.com/ikatyang/tree-sitter-yaml/issues/19)) ([32689b6](https://github.com/ikatyang/tree-sitter-yaml/commit/32689b6))
## [0.3.1](https://github.com/ikatyang/tree-sitter-yaml/compare/v0.3.0...v0.3.1) (2021-01-01)
### Bug Fixes
* avoid accessing unowned memory ([#17](https://github.com/ikatyang/tree-sitter-yaml/issues/17)) ([45ecb42](https://github.com/ikatyang/tree-sitter-yaml/commit/45ecb42))
# [0.3.0](https://github.com/ikatyang/tree-sitter-yaml/compare/v0.2.0...v0.3.0) (2020-10-04)
### Features
* support core schema ([#13](https://github.com/ikatyang/tree-sitter-yaml/issues/13)) ([6d74a6b](https://github.com/ikatyang/tree-sitter-yaml/commit/6d74a6b))
# [0.2.0](https://github.com/ikatyang/tree-sitter-yaml/compare/v0.1.0...v0.2.0) (2020-09-28)
### Features
* expose literal tokens as anonymous nodes ([#11](https://github.com/ikatyang/tree-sitter-yaml/issues/11)) ([f75b1f9](https://github.com/ikatyang/tree-sitter-yaml/commit/f75b1f9))
## 0.1.0 (2019-08-31)
### Features
* initial implementation ([f45f18f](https://github.com/ikatyang/tree-sitter-yaml/commit/f45f18f))

@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) Ika <ikatyang@gmail.com> (https://github.com/ikatyang)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -1,53 +0,0 @@
# tree-sitter-yaml
[![npm](https://img.shields.io/npm/v/tree-sitter-yaml.svg)](https://www.npmjs.com/package/tree-sitter-yaml)
[![build](https://img.shields.io/travis/com/ikatyang/tree-sitter-yaml/master.svg)](https://travis-ci.com/ikatyang/tree-sitter-yaml/builds)
YAML ([YAML Spec v1.2](https://yaml.org/spec/1.2/spec.html)) grammar for [tree-sitter](https://github.com/tree-sitter/tree-sitter)
[Changelog](https://github.com/ikatyang/tree-sitter-yaml/blob/master/CHANGELOG.md)
## Install
```sh
npm install tree-sitter-yaml tree-sitter
```
## Usage
```js
const Parser = require("tree-sitter");
const YAML = require("tree-sitter-yaml");
const parser = new Parser();
parser.setLanguage(YAML);
const sourceCode = `
!!map
hello: &anchor
- world
`;
const tree = parser.parse(sourceCode);
console.log(tree.rootNode.toString());
// (stream
// (document
// (block_node
// (tag)
// (block_mapping
// (block_mapping_pair
// key: (flow_node
// (plain_scalar
// (string_scalar)))
// value: (block_node
// (anchor)
// (block_sequence
// (block_sequence_item
// (flow_node
// (plain_scalar
// (string_scalar)))))))))))
```
## License
MIT © [Ika](https://github.com/ikatyang)

@ -1,19 +0,0 @@
{
"targets": [
{
"target_name": "tree_sitter_yaml_binding",
"include_dirs": [
"<!(node -e \"require('nan')\")",
"src"
],
"sources": [
"bindings/node/binding.cc",
"src/parser.c",
"src/scanner.cc",
],
"cflags_c": [
"-std=c99",
]
}
]
}

@ -1,28 +0,0 @@
#include "tree_sitter/parser.h"
#include <node.h>
#include "nan.h"
using namespace v8;
extern "C" TSLanguage * tree_sitter_yaml();
namespace {
NAN_METHOD(New) {}
void Init(Local<Object> exports, Local<Object> module) {
Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
tpl->SetClassName(Nan::New("Language").ToLocalChecked());
tpl->InstanceTemplate()->SetInternalFieldCount(1);
Local<Function> constructor = Nan::GetFunction(tpl).ToLocalChecked();
Local<Object> instance = constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked();
Nan::SetInternalFieldPointer(instance, 0, tree_sitter_yaml());
Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("yaml").ToLocalChecked());
Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance);
}
NODE_MODULE(tree_sitter_yaml_binding, Init)
} // namespace

@ -1,19 +0,0 @@
try {
module.exports = require("../../build/Release/tree_sitter_yaml_binding");
} catch (error1) {
if (error1.code !== 'MODULE_NOT_FOUND') {
throw error1;
}
try {
module.exports = require("../../build/Debug/tree_sitter_yaml_binding");
} catch (error2) {
if (error2.code !== 'MODULE_NOT_FOUND') {
throw error2;
}
throw error1
}
}
try {
module.exports.nodeTypeInfo = require("../../src/node-types.json");
} catch (_) {}

@ -1,354 +0,0 @@
================================================================================
Example 10.4. !!null Examples
================================================================================
!!null null: value for null key
key with null value: !!null null
--------------------------------------------------------------------------------
(stream
(document
(block_node
(block_mapping
(block_mapping_pair
key: (flow_node
(tag)
(plain_scalar
(null_scalar)))
value: (flow_node
(plain_scalar
(string_scalar))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(null_scalar))))))))
================================================================================
Example 10.5. !!bool Examples
================================================================================
YAML is a superset of JSON: !!bool true
Pluto is a planet: !!bool false
--------------------------------------------------------------------------------
(stream
(document
(block_node
(block_mapping
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(boolean_scalar))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(boolean_scalar))))))))
================================================================================
Example 10.6. !!int Examples
================================================================================
negative: !!int -12
zero: !!int 0
positive: !!int 34
--------------------------------------------------------------------------------
(stream
(document
(block_node
(block_mapping
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(integer_scalar))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(integer_scalar))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(integer_scalar))))))))
================================================================================
Example 10.7. !!float Examples
================================================================================
negative: !!float -1
zero: !!float 0
positive: !!float 2.3e4
infinity: !!float .inf
not a number: !!float .nan
--------------------------------------------------------------------------------
(stream
(document
(block_node
(block_mapping
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(integer_scalar))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(integer_scalar))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(float_scalar))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(float_scalar))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(tag)
(plain_scalar
(float_scalar))))))))
================================================================================
Example 10.8. JSON Tag Resolution
================================================================================
A null: null
Booleans: [ true, false ]
Integers: [ 0, -0, 3, -19 ]
Floats: [ 0., -0.0, 12e03, -2E+05 ]
Invalid: [ True, Null, 0o7, 0x3A, +12.3 ]
--------------------------------------------------------------------------------
(stream
(document
(block_node
(block_mapping
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(plain_scalar
(null_scalar))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(flow_sequence
(flow_node
(plain_scalar
(boolean_scalar)))
(flow_node
(plain_scalar
(boolean_scalar))))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(flow_sequence
(flow_node
(plain_scalar
(integer_scalar)))
(flow_node
(plain_scalar
(integer_scalar)))
(flow_node
(plain_scalar
(integer_scalar)))
(flow_node
(plain_scalar
(integer_scalar))))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(flow_sequence
(flow_node
(plain_scalar
(float_scalar)))
(flow_node
(plain_scalar
(float_scalar)))
(flow_node
(plain_scalar
(float_scalar)))
(flow_node
(plain_scalar
(float_scalar))))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(flow_sequence
(flow_node
(plain_scalar
(boolean_scalar)))
(flow_node
(plain_scalar
(null_scalar)))
(flow_node
(plain_scalar
(integer_scalar)))
(flow_node
(plain_scalar
(integer_scalar)))
(flow_node
(plain_scalar
(float_scalar))))))))))
================================================================================
Example 10.9. Core Tag Resolution
================================================================================
A null: null
Also a null: # Empty
Not a null: ""
Booleans: [ true, True, false, FALSE ]
Integers: [ 0, 0o7, 0x3A, -19 ]
Floats: [ 0., -0.0, .5, +12e03, -2E+05 ]
Also floats: [ .inf, -.Inf, +.INF, .NAN ]
--------------------------------------------------------------------------------
(stream
(document
(block_node
(block_mapping
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(plain_scalar
(null_scalar))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar))))
(comment)
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(double_quote_scalar)))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(flow_sequence
(flow_node
(plain_scalar
(boolean_scalar)))
(flow_node
(plain_scalar
(boolean_scalar)))
(flow_node
(plain_scalar
(boolean_scalar)))
(flow_node
(plain_scalar
(boolean_scalar))))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(flow_sequence
(flow_node
(plain_scalar
(integer_scalar)))
(flow_node
(plain_scalar
(integer_scalar)))
(flow_node
(plain_scalar
(integer_scalar)))
(flow_node
(plain_scalar
(integer_scalar))))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(flow_sequence
(flow_node
(plain_scalar
(float_scalar)))
(flow_node
(plain_scalar
(float_scalar)))
(flow_node
(plain_scalar
(float_scalar)))
(flow_node
(plain_scalar
(float_scalar)))
(flow_node
(plain_scalar
(float_scalar))))))
(block_mapping_pair
key: (flow_node
(plain_scalar
(string_scalar)))
value: (flow_node
(flow_sequence
(flow_node
(plain_scalar
(float_scalar)))
(flow_node
(plain_scalar
(float_scalar)))
(flow_node
(plain_scalar
(float_scalar)))
(flow_node
(plain_scalar
(float_scalar))))))))))

File diff suppressed because it is too large Load Diff

@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2018 Max Brunsfeld
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -1,469 +0,0 @@
let tree;
(async () => {
const CAPTURE_REGEX = /@\s*([\w\._-]+)/g;
const COLORS_BY_INDEX = [
'blue',
'chocolate',
'darkblue',
'darkcyan',
'darkgreen',
'darkred',
'darkslategray',
'dimgray',
'green',
'indigo',
'navy',
'red',
'sienna',
];
const scriptURL = document.currentScript.getAttribute('src');
const codeInput = document.getElementById('code-input');
const languageSelect = document.getElementById('language-select');
const loggingCheckbox = document.getElementById('logging-checkbox');
const outputContainer = document.getElementById('output-container');
const outputContainerScroll = document.getElementById('output-container-scroll');
const playgroundContainer = document.getElementById('playground-container');
const queryCheckbox = document.getElementById('query-checkbox');
const queryContainer = document.getElementById('query-container');
const queryInput = document.getElementById('query-input');
const updateTimeSpan = document.getElementById('update-time');
const languagesByName = {};
loadState();
await TreeSitter.init();
const parser = new TreeSitter();
const codeEditor = CodeMirror.fromTextArea(codeInput, {
lineNumbers: true,
showCursorWhenSelecting: true
});
const queryEditor = CodeMirror.fromTextArea(queryInput, {
lineNumbers: true,
showCursorWhenSelecting: true
});
const cluster = new Clusterize({
rows: [],
noDataText: null,
contentElem: outputContainer,
scrollElem: outputContainerScroll
});
const renderTreeOnCodeChange = debounce(renderTree, 50);
const saveStateOnChange = debounce(saveState, 2000);
const runTreeQueryOnChange = debounce(runTreeQuery, 50);
let languageName = languageSelect.value;
let treeRows = null;
let treeRowHighlightedIndex = -1;
let parseCount = 0;
let isRendering = 0;
let query;
codeEditor.on('changes', handleCodeChange);
codeEditor.on('viewportChange', runTreeQueryOnChange);
codeEditor.on('cursorActivity', debounce(handleCursorMovement, 150));
queryEditor.on('changes', debounce(handleQueryChange, 150));
loggingCheckbox.addEventListener('change', handleLoggingChange);
queryCheckbox.addEventListener('change', handleQueryEnableChange);
languageSelect.addEventListener('change', handleLanguageChange);
outputContainer.addEventListener('click', handleTreeClick);
handleQueryEnableChange();
await handleLanguageChange()
playgroundContainer.style.visibility = 'visible';
async function handleLanguageChange() {
const newLanguageName = languageSelect.value;
if (!languagesByName[newLanguageName]) {
const url = `${LANGUAGE_BASE_URL}/tree-sitter-${newLanguageName}.wasm`
languageSelect.disabled = true;
try {
languagesByName[newLanguageName] = await TreeSitter.Language.load(url);
} catch (e) {
console.error(e);
languageSelect.value = languageName;
return
} finally {
languageSelect.disabled = false;
}
}
tree = null;
languageName = newLanguageName;
parser.setLanguage(languagesByName[newLanguageName]);
handleCodeChange();
handleQueryChange();
}
async function handleCodeChange(editor, changes) {
const newText = codeEditor.getValue();
const edits = tree && changes && changes.map(treeEditForEditorChange);
const start = performance.now();
if (edits) {
for (const edit of edits) {
tree.edit(edit);
}
}
const newTree = parser.parse(newText, tree);
const duration = (performance.now() - start).toFixed(1);
updateTimeSpan.innerText = `${duration} ms`;
if (tree) tree.delete();
tree = newTree;
parseCount++;
renderTreeOnCodeChange();
runTreeQueryOnChange();
saveStateOnChange();
}
async function renderTree() {
isRendering++;
const cursor = tree.walk();
let currentRenderCount = parseCount;
let row = '';
let rows = [];
let finishedRow = false;
let visitedChildren = false;
let indentLevel = 0;
for (let i = 0;; i++) {
if (i > 0 && i % 10000 === 0) {
await new Promise(r => setTimeout(r, 0));
if (parseCount !== currentRenderCount) {
cursor.delete();
isRendering--;
return;
}
}
let displayName;
if (cursor.nodeIsMissing) {
displayName = `MISSING ${cursor.nodeType}`
} else if (cursor.nodeIsNamed) {
displayName = cursor.nodeType;
}
if (visitedChildren) {
if (displayName) {
finishedRow = true;
}
if (cursor.gotoNextSibling()) {
visitedChildren = false;
} else if (cursor.gotoParent()) {
visitedChildren = true;
indentLevel--;
} else {
break;
}
} else {
if (displayName) {
if (finishedRow) {
row += '</div>';
rows.push(row);
finishedRow = false;
}
const start = cursor.startPosition;
const end = cursor.endPosition;
const id = cursor.nodeId;
let fieldName = cursor.currentFieldName();
if (fieldName) {
fieldName += ': ';
} else {
fieldName = '';
}
row = `<div>${' '.repeat(indentLevel)}${fieldName}<a class='plain' href="#" data-id=${id} data-range="${start.row},${start.column},${end.row},${end.column}">${displayName}</a> [${start.row}, ${start.column}] - [${end.row}, ${end.column}])`;
finishedRow = true;
}
if (cursor.gotoFirstChild()) {
visitedChildren = false;
indentLevel++;
} else {
visitedChildren = true;
}
}
}
if (finishedRow) {
row += '</div>';
rows.push(row);
}
cursor.delete();
cluster.update(rows);
treeRows = rows;
isRendering--;
handleCursorMovement();
}
function runTreeQuery(_, startRow, endRow) {
if (endRow == null) {
const viewport = codeEditor.getViewport();
startRow = viewport.from;
endRow = viewport.to;
}
codeEditor.operation(() => {
const marks = codeEditor.getAllMarks();
marks.forEach(m => m.clear());
if (tree && query) {
const captures = query.captures(
tree.rootNode,
{row: startRow, column: 0},
{row: endRow, column: 0},
);
let lastNodeId;
for (const {name, node} of captures) {
if (node.id === lastNodeId) continue;
lastNodeId = node.id;
const {startPosition, endPosition} = node;
codeEditor.markText(
{line: startPosition.row, ch: startPosition.column},
{line: endPosition.row, ch: endPosition.column},
{
inclusiveLeft: true,
inclusiveRight: true,
css: `color: ${colorForCaptureName(name)}`
}
);
}
}
});
}
function handleQueryChange() {
if (query) {
query.delete();
query.deleted = true;
query = null;
}
queryEditor.operation(() => {
queryEditor.getAllMarks().forEach(m => m.clear());
if (!queryCheckbox.checked) return;
const queryText = queryEditor.getValue();
try {
query = parser.getLanguage().query(queryText);
let match;
let row = 0;
queryEditor.eachLine((line) => {
while (match = CAPTURE_REGEX.exec(line.text)) {
queryEditor.markText(
{line: row, ch: match.index},
{line: row, ch: match.index + match[0].length},
{
inclusiveLeft: true,
inclusiveRight: true,
css: `color: ${colorForCaptureName(match[1])}`
}
);
}
row++;
});
} catch (error) {
const startPosition = queryEditor.posFromIndex(error.index);
const endPosition = {
line: startPosition.line,
ch: startPosition.ch + (error.length || Infinity)
};
if (error.index === queryText.length) {
if (startPosition.ch > 0) {
startPosition.ch--;
} else if (startPosition.row > 0) {
startPosition.row--;
startPosition.column = Infinity;
}
}
queryEditor.markText(
startPosition,
endPosition,
{
className: 'query-error',
inclusiveLeft: true,
inclusiveRight: true,
attributes: {title: error.message}
}
);
}
});
runTreeQuery();
saveQueryState();
}
function handleCursorMovement() {
if (isRendering) return;
const selection = codeEditor.getDoc().listSelections()[0];
let start = {row: selection.anchor.line, column: selection.anchor.ch};
let end = {row: selection.head.line, column: selection.head.ch};
if (
start.row > end.row ||
(
start.row === end.row &&
start.column > end.column
)
) {
let swap = end;
end = start;
start = swap;
}
const node = tree.rootNode.namedDescendantForPosition(start, end);
if (treeRows) {
if (treeRowHighlightedIndex !== -1) {
const row = treeRows[treeRowHighlightedIndex];
if (row) treeRows[treeRowHighlightedIndex] = row.replace('highlighted', 'plain');
}
treeRowHighlightedIndex = treeRows.findIndex(row => row.includes(`data-id=${node.id}`));
if (treeRowHighlightedIndex !== -1) {
const row = treeRows[treeRowHighlightedIndex];
if (row) treeRows[treeRowHighlightedIndex] = row.replace('plain', 'highlighted');
}
cluster.update(treeRows);
const lineHeight = cluster.options.item_height;
const scrollTop = outputContainerScroll.scrollTop;
const containerHeight = outputContainerScroll.clientHeight;
const offset = treeRowHighlightedIndex * lineHeight;
if (scrollTop > offset - 20) {
$(outputContainerScroll).animate({scrollTop: offset - 20}, 150);
} else if (scrollTop < offset + lineHeight + 40 - containerHeight) {
$(outputContainerScroll).animate({scrollTop: offset - containerHeight + 40}, 150);
}
}
}
function handleTreeClick(event) {
if (event.target.tagName === 'A') {
event.preventDefault();
const [startRow, startColumn, endRow, endColumn] = event
.target
.dataset
.range
.split(',')
.map(n => parseInt(n));
codeEditor.focus();
codeEditor.setSelection(
{line: startRow, ch: startColumn},
{line: endRow, ch: endColumn}
);
}
}
function handleLoggingChange() {
if (loggingCheckbox.checked) {
parser.setLogger((message, lexing) => {
if (lexing) {
console.log(" ", message)
} else {
console.log(message)
}
});
} else {
parser.setLogger(null);
}
}
function handleQueryEnableChange() {
if (queryCheckbox.checked) {
queryContainer.style.visibility = '';
queryContainer.style.position = '';
} else {
queryContainer.style.visibility = 'hidden';
queryContainer.style.position = 'absolute';
}
handleQueryChange();
}
function treeEditForEditorChange(change) {
const oldLineCount = change.removed.length;
const newLineCount = change.text.length;
const lastLineLength = change.text[newLineCount - 1].length;
const startPosition = {row: change.from.line, column: change.from.ch};
const oldEndPosition = {row: change.to.line, column: change.to.ch};
const newEndPosition = {
row: startPosition.row + newLineCount - 1,
column: newLineCount === 1
? startPosition.column + lastLineLength
: lastLineLength
};
const startIndex = codeEditor.indexFromPos(change.from);
let newEndIndex = startIndex + newLineCount - 1;
let oldEndIndex = startIndex + oldLineCount - 1;
for (let i = 0; i < newLineCount; i++) newEndIndex += change.text[i].length;
for (let i = 0; i < oldLineCount; i++) oldEndIndex += change.removed[i].length;
return {
startIndex, oldEndIndex, newEndIndex,
startPosition, oldEndPosition, newEndPosition
};
}
function colorForCaptureName(capture) {
const id = query.captureNames.indexOf(capture);
return COLORS_BY_INDEX[id % COLORS_BY_INDEX.length];
}
function getLocalStorageItem(key) {
return localStorage.getItem(`${document.title}:${key}`);
}
function setLocalStorageItem(key, value) {
localStorage.setItem(`${document.title}:${key}`, value);
}
function loadState() {
const language = getLocalStorageItem("language");
const sourceCode = getLocalStorageItem("sourceCode");
const query = getLocalStorageItem("query");
const queryEnabled = getLocalStorageItem("queryEnabled");
if (language != null && sourceCode != null && query != null) {
queryInput.value = query;
codeInput.value = sourceCode;
languageSelect.value = language;
queryCheckbox.checked = (queryEnabled === 'true');
}
}
function saveState() {
setLocalStorageItem("language", languageSelect.value);
setLocalStorageItem("sourceCode", codeEditor.getValue());
saveQueryState();
}
function saveQueryState() {
setLocalStorageItem("queryEnabled", queryCheckbox.checked);
setLocalStorageItem("query", queryEditor.getValue());
}
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
})();

File diff suppressed because one or more lines are too long

@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2018 Max Brunsfeld
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

File diff suppressed because one or more lines are too long

@ -1,124 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="assets/tree-sitter-playground-0.19.3/style.css" media="screen" type="text/css">
<title>Tree-sitter YAML Playground</title>
</head>
<body>
<div id="container">
<main id="main-content">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.45.0/codemirror.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/clusterize.js/0.18.0/clusterize.min.css">
<style>
.version {
font-size: 0.5em;
}
.credit {
font-style: italic;
margin-top: 20px;
text-align: center;
}
</style>
<h1><a href="https://github.com/ikatyang/tree-sitter-yaml">Tree-sitter YAML</a> <span class="version">v0.5.0</span></h1>
<div id="playground-container" style="visibility: hidden;">
<h4>Code</h4>
<select id="language-select">
<option value="yaml" selected="selected">YAML</option>
</select>
<input id="logging-checkbox" type="checkbox"></input>
<label for="logging-checkbox">Log</label>
<input id="query-checkbox" type="checkbox"></input>
<label for="query-checkbox">Query</label>
<textarea id="code-input">
</textarea>
<div id="query-container" style="visibility: hidden; position: absolute;">
<h4>Query</h4>
<textarea id="query-input"></textarea>
</div>
<h4>Tree</h4>
<span id="update-time"></span>
<div id="output-container-scroll">
<pre id="output-container" class="highlight"></pre>
</div>
</div>
<div class="credit">
This playground was modified from <a href="https://tree-sitter.github.io/tree-sitter/playground">the official Tree-sitter Playground</a>.
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.45.0/codemirror.min.js"></script>
<script>LANGUAGE_BASE_URL = "assets/tree-sitter-yaml-0.5.0";</script>
<script src="assets/web-tree-sitter-0.19.3/tree-sitter.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/clusterize.js/0.18.0/clusterize.min.js"></script>
<script src="assets/tree-sitter-playground-0.19.3/playground.js"></script>
<script>
((codeExample, queryExample) => {
const handle = setInterval(() => {
const $codeEditor = document.querySelector('.CodeMirror');
const $queryEditor = document.querySelector('#query-container .CodeMirror');
const $queryCheckbox = document.querySelector('#query-checkbox');
if ($codeEditor && $queryEditor) {
$codeEditor.CodeMirror.setValue(codeExample);
if (queryExample) {
$queryEditor.CodeMirror.setValue(queryExample);
if (!$queryCheckbox.checked) $queryCheckbox.click();
}
clearInterval(handle);
}
}, 500);
})(`---
invoice: 34843
date : 2001-01-23
bill-to: &id001
given : Chris
family : Dumars
address:
lines: |
458 Walkman Dr.
Suite #292
city : Royal Oak
state : MI
postal : 48046
ship-to: *id001
product:
- sku : BL394D
quantity : 4
description : Basketball
price : 450.00
- sku : BL4438H
quantity : 1
description : Super Hoop
price : 2392.00
tax : 251.42
total: 4443.52
comments: >
Late afternoon is best.
Backup contact is Nancy
Billsmer @ 338-4338.`, ``);
</script>
</main>
</div>
</body>
</html>
<script
src="https://code.jquery.com/jquery-3.3.1.min.js"
crossorigin="anonymous">
</script>

@ -1,25 +0,0 @@
// Ref: https://yaml.org/spec/1.2/spec.html#schema/core/
module.exports = grammar({
name: "schema",
extras: $ => [],
rules: {
pln: $ => choice($.nul, $.bol, $.int, $.flt),
nul: $ => /~|null|Null|NULL/,
bol: $ => /true|True|TRUE|false|False|FALSE/,
int: $ => or([
/[-+]?[0-9]+/, // base 10
/0o[0-7]+/, // base 8
/0x[0-9a-fA-F]+/, // base 16
]),
flt: $ => or([
/[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?/, // number
/[-+]?(\.inf|\.Inf|\.INF)/, // infinity
/(\.nan|\.NaN|\.NAN)/, // not a number
]),
},
});
function or(regexList) {
return new RegExp(regexList.map(regex => `(${regex.source})`).join('|'));
}

@ -1,604 +0,0 @@
module.exports = grammar({
name: "yaml",
externals: $ => [
$._eof,
// s = starts at column 0 in the current or following row
// r = starts with 0 or more s_white in the current row
// br = starts with more than `current_indent` s_white in the following row
// b = starts with `current_indent` s_white in the following row
// bl = starts with `parent_indent` or less s_white in the following row
$._s_dir_yml_bgn, $._r_dir_yml_ver, // %YAML 1.2
$._s_dir_tag_bgn, $._r_dir_tag_hdl, $._r_dir_tag_pfx, // %TAG !yaml! tag:yaml.org,2002:
$._s_dir_rsv_bgn, $._r_dir_rsv_prm, // %FOO bar baz
$._s_drs_end, // ---
$._s_doc_end, // ...
$._r_blk_seq_bgn, $._br_blk_seq_bgn, $._b_blk_seq_bgn, // -
$._r_blk_key_bgn, $._br_blk_key_bgn, $._b_blk_key_bgn, // ?
$._r_blk_val_bgn, $._br_blk_val_bgn, $._b_blk_val_bgn, // :
$._r_blk_imp_bgn, // : (implicit)
$._r_blk_lit_bgn, $._br_blk_lit_bgn, // |
$._r_blk_fld_bgn, $._br_blk_fld_bgn, // >
$._br_blk_str_ctn, // block scalar content
$._r_flw_seq_bgn, $._br_flw_seq_bgn, $._b_flw_seq_bgn, // [
$._r_flw_seq_end, $._br_flw_seq_end, // ]
$._r_flw_map_bgn, $._br_flw_map_bgn, $._b_flw_map_bgn, // {
$._r_flw_map_end, $._br_flw_map_end, // }
$._r_flw_sep_bgn, $._br_flw_sep_bgn, // ,
$._r_flw_key_bgn, $._br_flw_key_bgn, // ?
$._r_flw_jsv_bgn, $._br_flw_jsv_bgn, // : (json key)
$._r_flw_njv_bgn, $._br_flw_njv_bgn, // : (non-json key)
$._r_dqt_str_bgn, $._br_dqt_str_bgn, $._b_dqt_str_bgn, // " (start)
$._r_dqt_str_ctn, $._br_dqt_str_ctn, // double quote scalar content
$._r_dqt_esc_nwl, $._br_dqt_esc_nwl, // escape newline
$._r_dqt_esc_seq, $._br_dqt_esc_seq, // escape sequence
$._r_dqt_str_end, $._br_dqt_str_end, // " (end)
$._r_sqt_str_bgn, $._br_sqt_str_bgn, $._b_sqt_str_bgn, // ' (start)
$._r_sqt_str_ctn, $._br_sqt_str_ctn, // single quote scalar content
$._r_sqt_esc_sqt, $._br_sqt_esc_sqt, // ''
$._r_sqt_str_end, $._br_sqt_str_end, // ' (end)
// plain scalar (singleline in block/flow)
$._r_sgl_pln_nul_blk, $._br_sgl_pln_nul_blk, $._b_sgl_pln_nul_blk, $._r_sgl_pln_nul_flw, $._br_sgl_pln_nul_flw,
$._r_sgl_pln_bol_blk, $._br_sgl_pln_bol_blk, $._b_sgl_pln_bol_blk, $._r_sgl_pln_bol_flw, $._br_sgl_pln_bol_flw,
$._r_sgl_pln_int_blk, $._br_sgl_pln_int_blk, $._b_sgl_pln_int_blk, $._r_sgl_pln_int_flw, $._br_sgl_pln_int_flw,
$._r_sgl_pln_flt_blk, $._br_sgl_pln_flt_blk, $._b_sgl_pln_flt_blk, $._r_sgl_pln_flt_flw, $._br_sgl_pln_flt_flw,
$._r_sgl_pln_str_blk, $._br_sgl_pln_str_blk, $._b_sgl_pln_str_blk, $._r_sgl_pln_str_flw, $._br_sgl_pln_str_flw,
// plain scalar (multiline in block/flow)
$._r_mtl_pln_str_blk, $._br_mtl_pln_str_blk,
$._r_mtl_pln_str_flw, $._br_mtl_pln_str_flw,
$._r_tag, $._br_tag, $._b_tag, // !tag
$._r_acr_bgn, $._br_acr_bgn, $._b_acr_bgn, $._r_acr_ctn, // &id
$._r_als_bgn, $._br_als_bgn, $._b_als_bgn, $._r_als_ctn, // *id
$._bl,
$.comment,
],
extras: $ => [$.comment],
conflicts: $ => [
[$._r_prp, $._r_sgl_prp],
[$._br_prp, $._br_sgl_prp],
[$._flw_seq_tal, $._sgl_flw_seq_tal],
[$._flw_map_tal, $._sgl_flw_map_tal],
[$._flw_ann_par_tal, $._sgl_flw_ann_par_tal],
[$._r_flw_seq_itm, $._r_sgl_flw_col_itm],
[$._r_flw_map_itm, $._r_sgl_flw_col_itm],
[$._r_flw_njl_ann_par, $._r_sgl_flw_njl_ann_par],
[$._r_flw_exp_par, $._r_sgl_flw_exp_par],
[$._r_dqt_str, $._r_sgl_dqt_str],
[$._r_sqt_str, $._r_sgl_sqt_str],
[$._r_pln_flw_val, $._r_sgl_pln_flw_val],
/**
* (_r_prp _r_acr _br_tag)
*
* &str
* !!str a
*
* (_r_prp _r_acr) _br_tag
*
* &map
* !!str a: 1
*/
[$._r_prp],
[$._br_prp],
],
inline: $ => [
$._r_pln_blk,
$._br_pln_blk,
$._r_pln_flw,
$._br_pln_flw,
$._r_blk_seq_val,
$._r_blk_map_val,
$._r_flw_val_blk,
$._br_flw_val_blk,
$._r_sgl_flw_val_blk,
$._br_sgl_flw_val_blk,
$._b_sgl_flw_val_blk,
$._r_flw_val_flw,
$._br_flw_val_flw,
$._r_sgl_flw_val_flw,
$._r_flw_jsl_val,
$._br_flw_jsl_val,
$._r_sgl_flw_jsl_val,
$._br_sgl_flw_jsl_val,
$._b_sgl_flw_jsl_val,
$._r_flw_njl_val_blk,
$._br_flw_njl_val_blk,
$._r_sgl_flw_njl_val_blk,
$._br_sgl_flw_njl_val_blk,
$._b_sgl_flw_njl_val_blk,
$._r_flw_njl_val_flw,
$._br_flw_njl_val_flw,
$._r_sgl_flw_njl_val_flw,
],
rules: {
stream: $ => seq(optional(choice(
seq(
choice($._bgn_imp_doc, $._drs_doc, $._exp_doc),
optional(choice($._doc_w_bgn_w_end_seq, $._doc_w_bgn_wo_end_seq))),
seq(
choice($._bgn_imp_doc_end, $._drs_doc_end, $._exp_doc_end, $._doc_end),
optional(choice($._doc_w_bgn_w_end_seq, $._doc_w_bgn_wo_end_seq, $._doc_wo_bgn_w_end_seq, $._doc_wo_bgn_wo_end_seq))),
)), $._eof),
_doc_w_bgn_w_end_seq: $ => seq($._doc_w_bgn_w_end, optional(choice($._doc_w_bgn_w_end_seq, $._doc_w_bgn_wo_end_seq, $._doc_wo_bgn_w_end_seq, $._doc_wo_bgn_wo_end_seq))),
_doc_w_bgn_wo_end_seq: $ => seq($._doc_w_bgn_wo_end, optional(choice($._doc_w_bgn_w_end_seq, $._doc_w_bgn_wo_end_seq))),
_doc_wo_bgn_w_end_seq: $ => seq($._doc_wo_bgn_w_end, optional(choice($._doc_w_bgn_w_end_seq, $._doc_w_bgn_wo_end_seq, $._doc_wo_bgn_w_end_seq, $._doc_wo_bgn_wo_end_seq))),
_doc_wo_bgn_wo_end_seq: $ => seq($._doc_wo_bgn_wo_end, optional(choice($._doc_w_bgn_w_end_seq, $._doc_w_bgn_wo_end_seq))),
_doc_w_bgn_w_end: $ => choice($._exp_doc_end, $._doc_end),
_doc_w_bgn_wo_end: $ => $._exp_doc,
_doc_wo_bgn_w_end: $ => choice($._drs_doc_end, $._imp_doc_end),
_doc_wo_bgn_wo_end: $ => choice($._drs_doc, $._imp_doc),
// document
_bgn_imp_doc: $ => choice($._exp_doc_tal, $._r_blk_seq_r_val, $._r_blk_map_r_val),
_drs_doc: $ => seq(repeat1($._s_dir), $._exp_doc),
_exp_doc: $ => seq($._s_drs_end, optional($._exp_doc_tal)),
_imp_doc: $ => choice($._br_blk_seq_val, $._br_blk_map_val, $._br_blk_str_val, $._br_flw_val_blk),
_drs_doc_end: $ => prec(1, seq($._drs_doc, $._s_doc_end)),
_exp_doc_end: $ => prec(1, seq($._exp_doc, $._s_doc_end)),
_imp_doc_end: $ => prec(1, seq($._imp_doc, $._s_doc_end)),
_bgn_imp_doc_end: $ => prec(1, seq($._bgn_imp_doc, $._s_doc_end)),
_doc_end: $ => $._s_doc_end,
_exp_doc_tal: $ => choice($._r_blk_seq_br_val, $._br_blk_seq_val, $._r_blk_map_br_val, $._br_blk_map_val, $._r_blk_str_val, $._br_blk_str_val, $._r_flw_val_blk, $._br_flw_val_blk),
// directive
_s_dir: $ => choice($._s_dir_yml, $._s_dir_tag, $._s_dir_rsv),
_s_dir_yml: $ => seq($._s_dir_yml_bgn, $._r_dir_yml_ver),
_s_dir_tag: $ => seq($._s_dir_tag_bgn, $._r_dir_tag_hdl, $._r_dir_tag_pfx),
_s_dir_rsv: $ => seq($._s_dir_rsv_bgn, repeat($._r_dir_rsv_prm)),
// property
_r_prp_val: $ => $._r_prp,
_br_prp_val: $ => $._br_prp,
_r_sgl_prp_val: $ => $._r_sgl_prp,
_br_sgl_prp_val: $ => $._br_sgl_prp,
_b_sgl_prp_val: $ => $._b_sgl_prp,
_r_prp: $ => choice(seq($._r_acr, optional(choice($._r_tag, $._br_tag))), seq($._r_tag, optional(choice($._r_acr, $._br_acr)))),
_br_prp: $ => choice(seq($._br_acr, optional(choice($._r_tag, $._br_tag))), seq($._br_tag, optional(choice($._r_acr, $._br_acr)))),
_r_sgl_prp: $ => choice(seq($._r_acr, optional($._r_tag)), seq($._r_tag, optional($._r_acr))),
_br_sgl_prp: $ => choice(seq($._br_acr, optional($._r_tag)), seq($._br_tag, optional($._r_acr))),
_b_sgl_prp: $ => choice(seq($._b_acr, optional($._r_tag)), seq($._b_tag, optional($._r_acr))),
// block sequence
_r_blk_seq_val: $ => choice($._r_blk_seq_r_val, $._r_blk_seq_br_val),
_r_blk_seq_r_val: $ => $._r_blk_seq,
_r_blk_seq_br_val: $ => seq($._r_prp, $._br_blk_seq),
_br_blk_seq_val: $ => choice($._br_blk_seq, seq($._br_prp, $._br_blk_seq)),
_r_blk_seq_spc_val: $ => seq($._r_prp, $._b_blk_seq_spc),
_br_blk_seq_spc_val: $ => seq($._br_prp, $._b_blk_seq_spc),
_b_blk_seq_spc_val: $ => $._b_blk_seq_spc,
_r_blk_seq: $ => seq($._r_blk_seq_itm, repeat($._b_blk_seq_itm), $._bl),
_br_blk_seq: $ => seq($._br_blk_seq_itm, repeat($._b_blk_seq_itm), $._bl),
_b_blk_seq_spc: $ => seq(repeat1($._b_blk_seq_itm), $._bl),
_r_blk_seq_itm: $ => seq($._r_blk_seq_bgn, optional($._blk_seq_itm_tal)),
_br_blk_seq_itm: $ => seq($._br_blk_seq_bgn, optional($._blk_seq_itm_tal)),
_b_blk_seq_itm: $ => seq($._b_blk_seq_bgn, optional($._blk_seq_itm_tal)),
_blk_seq_itm_tal: $ => choice($._r_blk_seq_val, $._br_blk_seq_val, $._r_blk_map_val, $._br_blk_map_val, $._r_blk_str_val, $._br_blk_str_val, $._r_flw_val_blk, $._br_flw_val_blk),
// block mapping
_r_blk_map_val: $ => choice($._r_blk_map_r_val, $._r_blk_map_br_val),
_r_blk_map_r_val: $ => $._r_blk_map,
_r_blk_map_br_val: $ => seq($._r_prp, $._br_blk_map),
_br_blk_map_val: $ => choice($._br_blk_map, seq($._br_prp, $._br_blk_map)),
_r_blk_map: $ => seq($._r_blk_map_itm, repeat($._b_blk_map_itm), $._bl),
_br_blk_map: $ => seq($._br_blk_map_itm, repeat($._b_blk_map_itm), $._bl),
_r_blk_map_itm: $ => choice($._r_blk_exp_itm, $._r_blk_imp_itm),
_br_blk_map_itm: $ => choice($._br_blk_exp_itm, $._br_blk_imp_itm),
_b_blk_map_itm: $ => choice($._b_blk_exp_itm, $._b_blk_imp_itm),
_r_blk_exp_itm: $ => prec.right(choice(seq($._r_blk_key_itm, optional($._b_blk_val_itm)), $._r_blk_val_itm)),
_br_blk_exp_itm: $ => prec.right(choice(seq($._br_blk_key_itm, optional($._b_blk_val_itm)), $._br_blk_val_itm)),
_b_blk_exp_itm: $ => prec.right(choice(seq($._b_blk_key_itm, optional($._b_blk_val_itm)), $._b_blk_val_itm)),
_r_blk_key_itm: $ => seq($._r_blk_key_bgn, optional(field("key", $._blk_exp_itm_tal))),
_br_blk_key_itm: $ => seq($._br_blk_key_bgn, optional(field("key", $._blk_exp_itm_tal))),
_b_blk_key_itm: $ => seq($._b_blk_key_bgn, optional(field("key", $._blk_exp_itm_tal))),
_r_blk_val_itm: $ => seq($._r_blk_val_bgn, optional(field("value", $._blk_exp_itm_tal))),
_br_blk_val_itm: $ => seq($._br_blk_val_bgn, optional(field("value", $._blk_exp_itm_tal))),
_b_blk_val_itm: $ => seq($._b_blk_val_bgn, optional(field("value", $._blk_exp_itm_tal))),
_r_blk_imp_itm: $ => seq(field("key", $._r_sgl_flw_val_blk), $._blk_imp_itm_tal),
_br_blk_imp_itm: $ => seq(field("key", $._br_sgl_flw_val_blk), $._blk_imp_itm_tal),
_b_blk_imp_itm: $ => seq(field("key", $._b_sgl_flw_val_blk), $._blk_imp_itm_tal),
_blk_exp_itm_tal: $ => choice($._blk_seq_itm_tal, $._r_blk_seq_spc_val, $._br_blk_seq_spc_val, $._b_blk_seq_spc_val),
_blk_imp_itm_tal: $ => seq($._r_blk_imp_bgn, optional(field("value", choice($._r_blk_seq_br_val, $._br_blk_seq_val, $._r_blk_seq_spc_val, $._br_blk_seq_spc_val, $._b_blk_seq_spc_val, $._r_blk_map_br_val, $._br_blk_map_val, $._r_blk_str_val, $._br_blk_str_val, $._r_flw_val_blk, $._br_flw_val_blk)))),
// block scalar
_r_blk_str_val: $ => choice($._r_blk_str, seq($._r_prp, choice($._r_blk_str, $._br_blk_str))),
_br_blk_str_val: $ => choice($._br_blk_str, seq($._br_prp, choice($._r_blk_str, $._br_blk_str))),
_r_blk_str: $ => seq(choice($._r_blk_lit_bgn, $._r_blk_fld_bgn), repeat($._br_blk_str_ctn), $._bl),
_br_blk_str: $ => seq(choice($._br_blk_lit_bgn, $._br_blk_fld_bgn), repeat($._br_blk_str_ctn), $._bl),
// flow value in block
_r_flw_val_blk: $ => choice($._r_flw_jsl_val, $._r_flw_njl_val_blk),
_br_flw_val_blk: $ => choice($._br_flw_jsl_val, $._br_flw_njl_val_blk),
_r_sgl_flw_val_blk: $ => choice($._r_sgl_flw_jsl_val, $._r_sgl_flw_njl_val_blk),
_br_sgl_flw_val_blk: $ => choice($._br_sgl_flw_jsl_val, $._br_sgl_flw_njl_val_blk),
_b_sgl_flw_val_blk: $ => choice($._b_sgl_flw_jsl_val, $._b_sgl_flw_njl_val_blk),
// flow value in flow
_r_flw_val_flw: $ => choice($._r_flw_jsl_val, $._r_flw_njl_val_flw),
_br_flw_val_flw: $ => choice($._br_flw_jsl_val, $._br_flw_njl_val_flw),
_r_sgl_flw_val_flw: $ => choice($._r_sgl_flw_jsl_val, $._r_sgl_flw_njl_val_flw),
// json-like flow value
_r_flw_jsl_val: $ => choice($._r_flw_seq_val, $._r_flw_map_val, $._r_dqt_str_val, $._r_sqt_str_val),
_br_flw_jsl_val: $ => choice($._br_flw_seq_val, $._br_flw_map_val, $._br_dqt_str_val, $._br_sqt_str_val),
_r_sgl_flw_jsl_val: $ => choice($._r_sgl_flw_seq_val, $._r_sgl_flw_map_val, $._r_sgl_dqt_str_val, $._r_sgl_sqt_str_val),
_br_sgl_flw_jsl_val: $ => choice($._br_sgl_flw_seq_val, $._br_sgl_flw_map_val, $._br_sgl_dqt_str_val, $._br_sgl_sqt_str_val),
_b_sgl_flw_jsl_val: $ => choice($._b_sgl_flw_seq_val, $._b_sgl_flw_map_val, $._b_sgl_dqt_str_val, $._b_sgl_sqt_str_val),
// non-json-like flow value in block
_r_flw_njl_val_blk: $ => choice($._r_als_val, $._r_prp_val, $._r_pln_blk_val),
_br_flw_njl_val_blk: $ => choice($._br_als_val, $._br_prp_val, $._br_pln_blk_val),
_r_sgl_flw_njl_val_blk: $ => choice($._r_als_val, $._r_sgl_prp_val, $._r_sgl_pln_blk_val),
_br_sgl_flw_njl_val_blk: $ => choice($._br_als_val, $._br_sgl_prp_val, $._br_sgl_pln_blk_val),
_b_sgl_flw_njl_val_blk: $ => choice($._b_als_val, $._b_sgl_prp_val, $._b_sgl_pln_blk_val),
// non-json-like flow value in flow
_r_flw_njl_val_flw: $ => choice($._r_als_val, $._r_prp_val, $._r_pln_flw_val),
_br_flw_njl_val_flw: $ => choice($._br_als_val, $._br_prp_val, $._br_pln_flw_val),
_r_sgl_flw_njl_val_flw: $ => choice($._r_als_val, $._r_sgl_prp_val, $._r_sgl_pln_flw_val),
// flow sequence
_r_flw_seq_val: $ => choice($._r_flw_seq, seq($._r_prp, choice($._r_flw_seq, $._br_flw_seq))),
_br_flw_seq_val: $ => choice($._br_flw_seq, seq($._br_prp, choice($._r_flw_seq, $._br_flw_seq))),
_r_sgl_flw_seq_val: $ => choice($._r_sgl_flw_seq, seq($._r_sgl_prp, $._r_sgl_flw_seq)),
_br_sgl_flw_seq_val: $ => choice($._br_sgl_flw_seq, seq($._br_sgl_prp, $._r_sgl_flw_seq)),
_b_sgl_flw_seq_val: $ => choice($._b_sgl_flw_seq, seq($._b_sgl_prp, $._r_sgl_flw_seq)),
_r_flw_seq: $ => seq($._r_flw_seq_bgn, $._flw_seq_tal),
_br_flw_seq: $ => seq($._br_flw_seq_bgn, $._flw_seq_tal),
_r_sgl_flw_seq: $ => seq($._r_flw_seq_bgn, $._sgl_flw_seq_tal),
_br_sgl_flw_seq: $ => seq($._br_flw_seq_bgn, $._sgl_flw_seq_tal),
_b_sgl_flw_seq: $ => seq($._b_flw_seq_bgn, $._sgl_flw_seq_tal),
_flw_seq_tal: $ => seq(optional(choice($._r_flw_seq_dat, $._br_flw_seq_dat)), choice($._r_flw_seq_end, $._br_flw_seq_end)),
_sgl_flw_seq_tal: $ => seq(optional($._r_sgl_flw_col_dat), $._r_flw_seq_end),
// flow mapping
_r_flw_map_val: $ => choice($._r_flw_map, seq($._r_prp, choice($._r_flw_map, $._br_flw_map))),
_br_flw_map_val: $ => choice($._br_flw_map, seq($._br_prp, choice($._r_flw_map, $._br_flw_map))),
_r_sgl_flw_map_val: $ => choice($._r_sgl_flw_map, seq($._r_sgl_prp, $._r_sgl_flw_map)),
_br_sgl_flw_map_val: $ => choice($._br_sgl_flw_map, seq($._br_sgl_prp, $._r_sgl_flw_map)),
_b_sgl_flw_map_val: $ => choice($._b_sgl_flw_map, seq($._b_sgl_prp, $._r_sgl_flw_map)),
_r_flw_map: $ => seq($._r_flw_map_bgn, $._flw_map_tal),
_br_flw_map: $ => seq($._br_flw_map_bgn, $._flw_map_tal),
_r_sgl_flw_map: $ => seq($._r_flw_map_bgn, $._sgl_flw_map_tal),
_br_sgl_flw_map: $ => seq($._br_flw_map_bgn, $._sgl_flw_map_tal),
_b_sgl_flw_map: $ => seq($._b_flw_map_bgn, $._sgl_flw_map_tal),
_flw_map_tal: $ => seq(optional(choice($._r_flw_map_dat, $._br_flw_map_dat)), choice($._r_flw_map_end, $._br_flw_map_end)),
_sgl_flw_map_tal: $ => seq(optional($._r_sgl_flw_col_dat), $._r_flw_map_end),
// flow collection data
_r_flw_seq_dat: $ => seq($._r_flw_seq_itm, repeat($._flw_seq_dat_rpt), optional(choice($._r_flw_sep_bgn, $._br_flw_sep_bgn))),
_br_flw_seq_dat: $ => seq($._br_flw_seq_itm, repeat($._flw_seq_dat_rpt), optional(choice($._r_flw_sep_bgn, $._br_flw_sep_bgn))),
_r_flw_map_dat: $ => seq($._r_flw_map_itm, repeat($._flw_map_dat_rpt), optional(choice($._r_flw_sep_bgn, $._br_flw_sep_bgn))),
_br_flw_map_dat: $ => seq($._br_flw_map_itm, repeat($._flw_map_dat_rpt), optional(choice($._r_flw_sep_bgn, $._br_flw_sep_bgn))),
_r_sgl_flw_col_dat: $ => seq($._r_sgl_flw_col_itm, repeat($._sgl_flw_col_dat_rpt), optional($._r_flw_sep_bgn)),
_flw_seq_dat_rpt: $ => seq(choice($._r_flw_sep_bgn, $._br_flw_sep_bgn), choice($._r_flw_seq_itm, $._br_flw_seq_itm)),
_flw_map_dat_rpt: $ => seq(choice($._r_flw_sep_bgn, $._br_flw_sep_bgn), choice($._r_flw_map_itm, $._br_flw_map_itm)),
_sgl_flw_col_dat_rpt: $ => seq($._r_flw_sep_bgn, $._r_sgl_flw_col_itm),
// flow collection item
_r_flw_seq_itm: $ => choice($._r_flw_val_flw, $._r_flw_exp_par, $._r_flw_imp_r_par, $._r_flw_njl_ann_par),
_br_flw_seq_itm: $ => choice($._br_flw_val_flw, $._br_flw_exp_par, $._br_flw_imp_r_par, $._br_flw_njl_ann_par),
_r_flw_map_itm: $ => choice($._r_flw_val_flw, $._r_flw_exp_par, $._r_flw_imp_r_par, $._r_flw_imp_br_par, $._r_flw_njl_ann_par),
_br_flw_map_itm: $ => choice($._br_flw_val_flw, $._br_flw_exp_par, $._br_flw_imp_r_par, $._br_flw_imp_br_par, $._br_flw_njl_ann_par),
_r_sgl_flw_col_itm: $ => choice($._r_sgl_flw_val_flw, $._r_sgl_flw_exp_par, $._r_sgl_flw_imp_par, $._r_sgl_flw_njl_ann_par),
// explicit flow pair
_r_flw_exp_par: $ => seq($._r_flw_key_bgn, optional(choice($._r_flw_imp_r_par, $._r_flw_imp_br_par, $._br_flw_imp_r_par, $._br_flw_imp_br_par))),
_br_flw_exp_par: $ => seq($._br_flw_key_bgn, optional(choice($._r_flw_imp_r_par, $._r_flw_imp_br_par, $._br_flw_imp_r_par, $._br_flw_imp_br_par))),
_r_sgl_flw_exp_par: $ => seq($._r_flw_key_bgn, optional($._r_sgl_flw_imp_par)),
// implicit flow pair
_r_flw_imp_r_par: $ => choice(seq(field("key", $._r_flw_jsl_val), $._r_flw_jsl_ann_par), seq(field("key", $._r_flw_njl_val_flw), $._r_flw_njl_ann_par)),
_r_flw_imp_br_par: $ => choice(seq(field("key", $._r_flw_jsl_val), $._br_flw_jsl_ann_par), seq(field("key", $._r_flw_njl_val_flw), $._br_flw_njl_ann_par)),
_br_flw_imp_r_par: $ => choice(seq(field("key", $._br_flw_jsl_val), $._r_flw_jsl_ann_par), seq(field("key", $._br_flw_njl_val_flw), $._r_flw_njl_ann_par)),
_br_flw_imp_br_par: $ => choice(seq(field("key", $._br_flw_jsl_val), $._br_flw_jsl_ann_par), seq(field("key", $._br_flw_njl_val_flw), $._br_flw_njl_ann_par)),
_r_sgl_flw_imp_par: $ => choice(seq(field("key", $._r_sgl_flw_jsl_val), $._r_sgl_flw_jsl_ann_par), seq(field("key", $._r_sgl_flw_njl_val_flw), $._r_sgl_flw_njl_ann_par)),
// anonymous flow pair
_r_flw_jsl_ann_par: $ => seq($._r_flw_jsv_bgn, optional(field("value", $._flw_ann_par_tal))),
_br_flw_jsl_ann_par: $ => seq($._br_flw_jsv_bgn, optional(field("value", $._flw_ann_par_tal))),
_r_sgl_flw_jsl_ann_par: $ => seq($._r_flw_jsv_bgn, optional(field("value", $._sgl_flw_ann_par_tal))),
_r_flw_njl_ann_par: $ => seq($._r_flw_njv_bgn, optional(field("value", $._flw_ann_par_tal))),
_br_flw_njl_ann_par: $ => seq($._br_flw_njv_bgn, optional(field("value", $._flw_ann_par_tal))),
_r_sgl_flw_njl_ann_par: $ => seq($._r_flw_njv_bgn, optional(field("value", $._sgl_flw_ann_par_tal))),
_flw_ann_par_tal: $ => choice($._r_flw_val_flw, $._br_flw_val_flw),
_sgl_flw_ann_par_tal: $ => $._r_sgl_flw_val_flw,
// double quote scalar
_r_dqt_str_val: $ => choice($._r_dqt_str, seq($._r_prp, choice($._r_dqt_str, $._br_dqt_str))),
_br_dqt_str_val: $ => choice($._br_dqt_str, seq($._br_prp, choice($._r_dqt_str, $._br_dqt_str))),
_r_sgl_dqt_str_val: $ => choice($._r_sgl_dqt_str, seq($._r_sgl_prp, $._r_sgl_dqt_str)),
_br_sgl_dqt_str_val: $ => choice($._br_sgl_dqt_str, seq($._br_sgl_prp, $._r_sgl_dqt_str)),
_b_sgl_dqt_str_val: $ => choice($._b_sgl_dqt_str, seq($._b_sgl_prp, $._r_sgl_dqt_str)),
_r_dqt_str: $ => seq($._r_dqt_str_bgn, optional($._r_sgl_dqt_ctn), optional($._r_dqt_esc_nwl), repeat($._br_mtl_dqt_ctn), choice($._r_dqt_str_end, $._br_dqt_str_end)),
_br_dqt_str: $ => seq($._br_dqt_str_bgn, optional($._r_sgl_dqt_ctn), optional($._r_dqt_esc_nwl), repeat($._br_mtl_dqt_ctn), choice($._r_dqt_str_end, $._br_dqt_str_end)),
_r_sgl_dqt_str: $ => seq($._r_dqt_str_bgn, optional($._r_sgl_dqt_ctn), $._r_dqt_str_end),
_br_sgl_dqt_str: $ => seq($._br_dqt_str_bgn, optional($._r_sgl_dqt_ctn), $._r_dqt_str_end),
_b_sgl_dqt_str: $ => seq($._b_dqt_str_bgn, optional($._r_sgl_dqt_ctn), $._r_dqt_str_end),
_r_sgl_dqt_ctn: $ => repeat1(choice($._r_dqt_str_ctn, $._r_dqt_esc_seq)),
_br_mtl_dqt_ctn: $ => choice($._br_dqt_esc_nwl, seq(choice($._br_dqt_str_ctn, $._br_dqt_esc_seq), repeat(choice($._r_dqt_str_ctn, $._r_dqt_esc_seq)), optional($._r_dqt_esc_nwl))),
// single quote scalar
_r_sqt_str_val: $ => choice($._r_sqt_str, seq($._r_prp, choice($._r_sqt_str, $._br_sqt_str))),
_br_sqt_str_val: $ => choice($._br_sqt_str, seq($._br_prp, choice($._r_sqt_str, $._br_sqt_str))),
_r_sgl_sqt_str_val: $ => choice($._r_sgl_sqt_str, seq($._r_sgl_prp, $._r_sgl_sqt_str)),
_br_sgl_sqt_str_val: $ => choice($._br_sgl_sqt_str, seq($._br_sgl_prp, $._r_sgl_sqt_str)),
_b_sgl_sqt_str_val: $ => choice($._b_sgl_sqt_str, seq($._b_sgl_prp, $._r_sgl_sqt_str)),
_r_sqt_str: $ => seq($._r_sqt_str_bgn, optional($._r_sgl_sqt_ctn), repeat($._br_mtl_sqt_ctn), choice($._r_sqt_str_end, $._br_sqt_str_end)),
_br_sqt_str: $ => seq($._br_sqt_str_bgn, optional($._r_sgl_sqt_ctn), repeat($._br_mtl_sqt_ctn), choice($._r_sqt_str_end, $._br_sqt_str_end)),
_r_sgl_sqt_str: $ => seq($._r_sqt_str_bgn, optional($._r_sgl_sqt_ctn), $._r_sqt_str_end),
_br_sgl_sqt_str: $ => seq($._br_sqt_str_bgn, optional($._r_sgl_sqt_ctn), $._r_sqt_str_end),
_b_sgl_sqt_str: $ => seq($._b_sqt_str_bgn, optional($._r_sgl_sqt_ctn), $._r_sqt_str_end),
_r_sgl_sqt_ctn: $ => repeat1(choice($._r_sqt_str_ctn, $._r_sqt_esc_sqt)),
_br_mtl_sqt_ctn: $ => seq(choice($._br_sqt_str_ctn, $._br_sqt_esc_sqt), repeat(choice($._r_sqt_str_ctn, $._r_sqt_esc_sqt))),
// plain scalar in block
_r_pln_blk_val: $ => choice($._r_pln_blk, seq($._r_prp, choice($._r_pln_blk, $._br_pln_blk))),
_br_pln_blk_val: $ => choice($._br_pln_blk, seq($._br_prp, choice($._r_pln_blk, $._br_pln_blk))),
_r_sgl_pln_blk_val: $ => choice($._r_sgl_pln_blk, seq($._r_sgl_prp, $._r_sgl_pln_blk)),
_br_sgl_pln_blk_val: $ => choice($._br_sgl_pln_blk, seq($._br_sgl_prp, $._r_sgl_pln_blk)),
_b_sgl_pln_blk_val: $ => choice($._b_sgl_pln_blk, seq($._b_sgl_prp, $._r_sgl_pln_blk)),
_r_pln_blk: $ => choice($._r_sgl_pln_blk, $._r_mtl_pln_blk),
_br_pln_blk: $ => choice($._br_sgl_pln_blk, $._br_mtl_pln_blk),
// plain scalar in flow
_r_pln_flw_val: $ => choice($._r_pln_flw, seq($._r_prp, choice($._r_pln_flw, $._br_pln_flw))),
_br_pln_flw_val: $ => choice($._br_pln_flw, seq($._br_prp, choice($._r_pln_flw, $._br_pln_flw))),
_r_sgl_pln_flw_val: $ => choice($._r_sgl_pln_flw, seq($._r_sgl_prp, $._r_sgl_pln_flw)),
_r_pln_flw: $ => choice($._r_sgl_pln_flw, $._r_mtl_pln_flw),
_br_pln_flw: $ => choice($._br_sgl_pln_flw, $._br_mtl_pln_flw),
// plain scalar schema
_r_sgl_pln_blk: $ => choice($._r_sgl_pln_nul_blk, $._r_sgl_pln_bol_blk, $._r_sgl_pln_int_blk, $._r_sgl_pln_flt_blk, $._r_sgl_pln_str_blk),
_br_sgl_pln_blk: $ => choice($._br_sgl_pln_nul_blk, $._br_sgl_pln_bol_blk, $._br_sgl_pln_int_blk, $._br_sgl_pln_flt_blk, $._br_sgl_pln_str_blk),
_b_sgl_pln_blk: $ => choice($._b_sgl_pln_nul_blk, $._b_sgl_pln_bol_blk, $._b_sgl_pln_int_blk, $._b_sgl_pln_flt_blk, $._b_sgl_pln_str_blk),
_r_sgl_pln_flw: $ => choice($._r_sgl_pln_nul_flw, $._r_sgl_pln_bol_flw, $._r_sgl_pln_int_flw, $._r_sgl_pln_flt_flw, $._r_sgl_pln_str_flw),
_br_sgl_pln_flw: $ => choice($._br_sgl_pln_nul_flw, $._br_sgl_pln_bol_flw, $._br_sgl_pln_int_flw, $._br_sgl_pln_flt_flw, $._br_sgl_pln_str_flw),
_r_mtl_pln_blk: $ => $._r_mtl_pln_str_blk,
_br_mtl_pln_blk: $ => $._br_mtl_pln_str_blk,
_r_mtl_pln_flw: $ => $._r_mtl_pln_str_flw,
_br_mtl_pln_flw: $ => $._br_mtl_pln_str_flw,
// alias
_r_als_val: $ => $._r_als,
_br_als_val: $ => $._br_als,
_b_als_val: $ => $._b_als,
_r_als: $ => seq($._r_als_bgn, $._r_als_ctn),
_br_als: $ => seq($._br_als_bgn, $._r_als_ctn),
_b_als: $ => seq($._b_als_bgn, $._r_als_ctn),
// anchor
_r_acr: $ => seq($._r_acr_bgn, $._r_acr_ctn),
_br_acr: $ => seq($._br_acr_bgn, $._r_acr_ctn),
_b_acr: $ => seq($._b_acr_bgn, $._r_acr_ctn),
},
});
module.exports = global_alias(global_alias(module.exports, {
..._("yaml_directive", "_s_dir_yml"),
..._("yaml_version", "_r_dir_yml_ver"),
..._("tag_directive", "_s_dir_tag"),
..._("tag_handle", "_r_dir_tag_hdl"),
..._("tag_prefix", "_r_dir_tag_pfx"),
..._("reserved_directive", "_s_dir_rsv"),
..._("directive_name", "_s_dir_rsv_bgn"),
..._("directive_parameter", "_r_dir_rsv_prm"),
..._("flow_node", "_r_prp_val", "_br_prp_val", "_r_sgl_prp_val", "_br_sgl_prp_val", "_b_sgl_prp_val"),
..._("tag", "_r_tag", "_br_tag", "_b_tag"),
..._("anchor", "_r_acr", "_br_acr", "_b_acr"),
..._("anchor_name", "_r_acr_ctn"),
..._("flow_node", "_r_als_val", "_br_als_val", "_b_als_val"),
..._("alias", "_r_als", "_br_als", "_b_als"),
..._("alias_name", "_r_als_ctn"),
..._("document", "_bgn_imp_doc", "_imp_doc"),
..._(["document"], "_drs_doc", "_exp_doc", "_doc_end",
"_bgn_imp_doc_end", "_drs_doc_end", "_exp_doc_end", "_imp_doc_end"),
..._("block_node", "_r_blk_seq_r_val", "_r_blk_seq_br_val", "_br_blk_seq_val", "_r_blk_seq_spc_val", "_br_blk_seq_spc_val", "_b_blk_seq_spc_val"),
..._("block_node", "_r_blk_map_r_val", "_r_blk_map_br_val", "_br_blk_map_val"),
..._("block_node", "_r_blk_str_val", "_br_blk_str_val"),
..._("block_sequence", "_r_blk_seq", "_br_blk_seq", "_b_blk_seq_spc"),
..._("block_mapping", "_r_blk_map", "_br_blk_map"),
..._("block_scalar", "_r_blk_str", "_br_blk_str"),
..._("block_sequence_item", "_r_blk_seq_itm", "_br_blk_seq_itm", "_b_blk_seq_itm"),
..._("block_mapping_pair", "_r_blk_exp_itm", "_br_blk_exp_itm", "_b_blk_exp_itm"),
..._("block_mapping_pair", "_r_blk_imp_itm", "_br_blk_imp_itm", "_b_blk_imp_itm"),
..._("flow_node", "_r_flw_seq_val", "_br_flw_seq_val", "_r_sgl_flw_seq_val", "_br_sgl_flw_seq_val", "_b_sgl_flw_seq_val"),
..._("flow_node", "_r_flw_map_val", "_br_flw_map_val", "_r_sgl_flw_map_val", "_br_sgl_flw_map_val", "_b_sgl_flw_map_val"),
..._("flow_sequence", "_r_flw_seq", "_br_flw_seq", "_r_sgl_flw_seq", "_br_sgl_flw_seq", "_b_sgl_flw_seq"),
..._("flow_mapping", "_r_flw_map", "_br_flw_map", "_r_sgl_flw_map", "_br_sgl_flw_map", "_b_sgl_flw_map"),
..._(["flow_pair"], "_r_flw_exp_par", "_br_flw_exp_par", "_r_sgl_flw_exp_par",
"_r_flw_imp_r_par", "_r_flw_imp_br_par", "_br_flw_imp_r_par", "_br_flw_imp_br_par", "_r_sgl_flw_imp_par",
"_r_flw_njl_ann_par", "_br_flw_njl_ann_par", "_r_sgl_flw_njl_ann_par"),
..._("flow_node", "_r_dqt_str_val", "_br_dqt_str_val", "_r_sgl_dqt_str_val", "_br_sgl_dqt_str_val", "_b_sgl_dqt_str_val"),
..._("flow_node", "_r_sqt_str_val", "_br_sqt_str_val", "_r_sgl_sqt_str_val", "_br_sgl_sqt_str_val", "_b_sgl_sqt_str_val"),
..._("flow_node", "_r_pln_blk_val", "_br_pln_blk_val", "_r_sgl_pln_blk_val", "_br_sgl_pln_blk_val", "_b_sgl_pln_blk_val",
"_r_pln_flw_val", "_br_pln_flw_val", "_r_sgl_pln_flw_val"),
..._("double_quote_scalar", "_r_dqt_str", "_br_dqt_str", "_r_sgl_dqt_str", "_br_sgl_dqt_str", "_b_sgl_dqt_str"),
..._("single_quote_scalar", "_r_sqt_str", "_br_sqt_str", "_r_sgl_sqt_str", "_br_sgl_sqt_str", "_b_sgl_sqt_str"),
..._("plain_scalar", "_r_mtl_pln_blk", "_br_mtl_pln_blk", "_r_sgl_pln_blk", "_br_sgl_pln_blk", "_b_sgl_pln_blk",
"_r_mtl_pln_flw", "_br_mtl_pln_flw", "_r_sgl_pln_flw", "_br_sgl_pln_flw"),
..._("escape_sequence", "_r_dqt_esc_nwl", "_br_dqt_esc_nwl",
"_r_dqt_esc_seq", "_br_dqt_esc_seq",
"_r_sqt_esc_sqt", "_br_sqt_esc_sqt"),
..._("null_scalar", "_r_sgl_pln_nul_blk", "_br_sgl_pln_nul_blk", "_b_sgl_pln_nul_blk", "_r_sgl_pln_nul_flw", "_br_sgl_pln_nul_flw"),
..._("boolean_scalar", "_r_sgl_pln_bol_blk", "_br_sgl_pln_bol_blk", "_b_sgl_pln_bol_blk", "_r_sgl_pln_bol_flw", "_br_sgl_pln_bol_flw"),
..._("integer_scalar", "_r_sgl_pln_int_blk", "_br_sgl_pln_int_blk", "_b_sgl_pln_int_blk", "_r_sgl_pln_int_flw", "_br_sgl_pln_int_flw"),
..._("float_scalar", "_r_sgl_pln_flt_blk", "_br_sgl_pln_flt_blk", "_b_sgl_pln_flt_blk", "_r_sgl_pln_flt_flw", "_br_sgl_pln_flt_flw"),
..._("string_scalar", "_r_sgl_pln_str_blk", "_br_sgl_pln_str_blk", "_b_sgl_pln_str_blk", "_r_sgl_pln_str_flw", "_br_sgl_pln_str_flw",
"_r_mtl_pln_str_blk", "_br_mtl_pln_str_blk", "_r_mtl_pln_str_flw", "_br_mtl_pln_str_flw"),
}), {
..._("---", "_s_drs_end"),
..._("...", "_s_doc_end"),
..._("-", "_r_blk_seq_bgn", "_br_blk_seq_bgn", "_b_blk_seq_bgn"),
..._("?", "_r_blk_key_bgn", "_br_blk_key_bgn", "_b_blk_key_bgn"),
..._(":", "_r_blk_val_bgn", "_br_blk_val_bgn", "_b_blk_val_bgn"),
..._(":", "_r_blk_imp_bgn"),
..._("|", "_r_blk_lit_bgn", "_br_blk_lit_bgn"),
..._(">", "_r_blk_fld_bgn", "_br_blk_fld_bgn"),
..._("[", "_r_flw_seq_bgn", "_br_flw_seq_bgn", "_b_flw_seq_bgn"),
..._("]", "_r_flw_seq_end", "_br_flw_seq_end"),
..._("{", "_r_flw_map_bgn", "_br_flw_map_bgn", "_b_flw_map_bgn"),
..._("}", "_r_flw_map_end", "_br_flw_map_end"),
..._(",", "_r_flw_sep_bgn", "_br_flw_sep_bgn"),
..._("?", "_r_flw_key_bgn", "_br_flw_key_bgn"),
..._(":", "_r_flw_jsv_bgn", "_br_flw_jsv_bgn"),
..._(":", "_r_flw_njv_bgn", "_br_flw_njv_bgn"),
..._("\"", "_r_dqt_str_bgn", "_br_dqt_str_bgn", "_b_dqt_str_bgn"),
..._("\"", "_r_dqt_str_end", "_br_dqt_str_end"),
..._("'", "_r_sqt_str_bgn", "_br_sqt_str_bgn", "_b_sqt_str_bgn"),
..._("'", "_r_sqt_str_end", "_br_sqt_str_end"),
..._("*", "_r_als_bgn", "_br_als_bgn", "_b_als_bgn"),
..._("&", "_r_acr_bgn", "_br_acr_bgn", "_b_acr_bgn"),
});
function _(alias_value, ...rule_names) {
const alias_content = {};
if (typeof alias_value === "string") {
alias_content.name = alias_value;
} else if (Array.isArray(alias_value)) {
alias_content.name = alias_value[0];
alias_content.shallow = true;
} else {
throw new Error(`Unexpected value ${JSON.stringify(alias_value)}`);
}
const alias_map = {};
for (const rule_name of rule_names) {
alias_map[rule_name] = alias_content;
}
return alias_map;
}
function global_alias(grammar_json, alias_map) {
const new_rules = {};
const new_grammar = { ...grammar_json, rules: new_rules };
const checklist = Object.fromEntries(Object.entries(alias_map).map(([k, v]) => [k, 0]));
for (const [rule_name, rule] of Object.entries(grammar_json.rules)) {
new_rules[rule_name] = rule_name in alias_map && alias_map[rule_name].shallow
? rule
: recursive_alias(rule, alias_map, checklist);
}
for (const [rule_name, counter] of Object.entries(checklist)) {
if (counter === 0) {
console.warn(`warning: global_alias for ${JSON.stringify(rule_name)} is not used.`);
}
}
return new_grammar;
}
function recursive_alias(rule, alias_map, checklist) {
switch (rule.type) {
case "CHOICE":
case "SEQ":
return { ...rule, members: rule.members.map(member => recursive_alias(member, alias_map, checklist)) };
case "REPEAT":
case "REPEAT1":
case "FIELD":
case "PREC":
case "PREC_RIGHT":
return { ...rule, content: recursive_alias(rule.content, alias_map, checklist) };
case "SYMBOL":
if (rule.name in alias_map) {
checklist[rule.name]++;
const alias = alias_map[rule.name].name;
return { type: "ALIAS", content: rule, named: /[a-z]/i.test(alias), value: alias };
}
case "BLANK":
case "ALIAS":
return rule;
default:
throw new Error(`Unexpected rule type ${JSON.stringify(rule.type)}`);
}
}

@ -1,44 +0,0 @@
{
"name": "tree-sitter-yaml",
"version": "0.5.0",
"description": "YAML grammar for tree-sitter",
"keywords": [
"parser",
"lexer"
],
"main": "bindings/node",
"repository": "https://github.com/ikatyang/tree-sitter-yaml",
"homepage": "https://github.com/ikatyang/tree-sitter-yaml#readme",
"author": {
"name": "Ika",
"email": "ikatyang@gmail.com",
"url": "https://github.com/ikatyang"
},
"license": "MIT",
"scripts": {
"test": "yarn tree-sitter test",
"prepack": "bash ./scripts/update-schema.sh && yarn tree-sitter generate",
"release": "standard-version --commit-all",
"tree-sitter": "./tree-sitter/target/release/tree-sitter"
},
"standard-version": {
"preset": "angular",
"scripts": {
"postbump": "rm -r docs && node scripts/generate-playground.js && git add docs"
}
},
"dependencies": {
"nan": "^2.14.0"
},
"devDependencies": {
"get-stdin": "^8.0.0",
"natural-orderby": "2.0.3",
"standard-version": "7.0.0"
},
"files": [
"/src/",
"/bindings/node/",
"/binding.gyp",
"/grammar.js"
]
}

@ -1,36 +0,0 @@
const generatePlayground = require("../tree-sitter/script/generate-playground");
generatePlayground("docs", {
name: "YAML",
example: `
---
invoice: 34843
date : 2001-01-23
bill-to: &id001
given : Chris
family : Dumars
address:
lines: |
458 Walkman Dr.
Suite #292
city : Royal Oak
state : MI
postal : 48046
ship-to: *id001
product:
- sku : BL394D
quantity : 4
description : Basketball
price : 450.00
- sku : BL4438H
quantity : 1
description : Super Hoop
price : 2392.00
tax : 251.42
total: 4443.52
comments: >
Late afternoon is best.
Backup contact is Nancy
Billsmer @ 338-4338.
`.trim()
});

@ -1,4 +0,0 @@
git submodule update --init
cd tree-sitter
./script/build-wasm
cargo build --release

@ -1,85 +0,0 @@
const fs = require("fs");
const path = require("path");
const getStdin = require("get-stdin");
const STATE_FREEZE = -1;
getStdin().then(stdin => {
const cases = extractCases(stdin);
const enums = ["RS_STR"];
const content = "switch (sch_stt) " + block([
`case ${STATE_FREEZE}:\n break;`,
cases
.map(([key, { content }]) => `${(key === "default" ? "default:" : `case ${key}:`)}\n${indent(content)}`)
.join("\n END_STATE();\n")
.replace(/ADVANCE\((\d+)\);/g, (_, state) => {
const stateCase = cases.find(([key]) => key === state);
if (stateCase) {
const [, { acceptToken }] = stateCase;
if (acceptToken) {
return `{${acceptToken} return ${state};}`;
}
}
return `{*rlt_sch = RS_STR; return ${state};}`;
})
.replace("ACCEPT_TOKEN(ts_builtin_sym_end);", "assert(false);")
.replace(/ACCEPT_TOKEN\((\w+)\);/g, (_, name) => {
const newName = "RS_" + name.replace("sym_", "").toUpperCase();
if (!enums.includes(newName)) {
enums.push(newName);
}
return `*rlt_sch = ${newName};`;
})
.replace(/END_STATE\(\);/g, `break;`)
.replace("return false;", `*rlt_sch = RS_STR;\n return ${STATE_FREEZE};`)
.replace(/lookahead/g, "cur_chr"),
]);
fs.writeFileSync(
path.resolve(__dirname, "../src/schema.generated.cc"),
[
`#include <cassert>`,
`namespace tree_sitter_yaml {`,
`const int8_t SCH_STT_FRZ = ${STATE_FREEZE};`,
`enum ResultSchema ${block(enums.map((k) => `${k},`))};`,
`int8_t adv_sch_stt(int8_t sch_stt, int32_t cur_chr, ResultSchema *rlt_sch) ${block([
content,
`if (cur_chr != '\\r' && cur_chr != '\\n' && cur_chr != ' ' && cur_chr != 0) *rlt_sch = RS_STR;`,
`return ${STATE_FREEZE};`,
])}`,
`}`,
].join("\n\n"),
);
});
function extractCases(stdin) {
const MAIN_SIGNATURE = "static bool ts_lex(TSLexer *lexer, TSStateId state) {";
const SWITCH_CASE = "switch (state) {\n";
const startIndex = stdin.indexOf(SWITCH_CASE, stdin.indexOf(MAIN_SIGNATURE)) + SWITCH_CASE.length;
const endIndex = stdin.indexOf("}\n}", startIndex);
const content = stdin.slice(startIndex, endIndex).replace(/^\s*if \(eof\).+\n/mg, "").trimEnd();
return dedent(dedent(content)).split("END_STATE();").map(text => {
const index = text.indexOf(":\n");
const key = text.slice(0, index).trim().replace(/^case /, "");
const content = dedent(text.slice(index + 2)).trim();
const matchAcceptToken = content.match(/^ACCEPT_TOKEN\(\w+\);/);
const acceptToken = matchAcceptToken && matchAcceptToken[0];
const hasAcceptTokenOnly = acceptToken && acceptToken.length === content.length;
return [key, { content, acceptToken, hasAcceptTokenOnly }];
});
}
function block(contents) {
return `{\n${indent(contents)}\n}`;
}
function lines(contents) {
return [].concat(contents).join("\n").split("\n");
}
function indent(contents) {
return lines(contents).map(x => " ".repeat(2) + x).join("\n");
}
function dedent(contents) {
return lines(contents).map(x => x.replace(/^ /mg, "")).join("\n");
}

@ -1,11 +0,0 @@
cd $(dirname "$0")/..
ROOT_DIR=$PWD
TREE_SITTER_CLI="$ROOT_DIR/tree-sitter/target/release/tree-sitter"
SCHEMA_GRAMMAR="$ROOT_DIR/grammar-schema.js"
TEMP_DIR=$(mktemp -d)
cd $TEMP_DIR
cp $SCHEMA_GRAMMAR grammar.js
$TREE_SITTER_CLI generate
cat $TEMP_DIR/src/parser.c | node $ROOT_DIR/scripts/update-schema.js

@ -1,51 +0,0 @@
const fs = require("fs");
const { orderBy } = require("natural-orderby");
const path = require("path");
const testSuiteDirname = "./yaml-test-suite";
const whitelistForValidTest = [
"Duplicate YAML directive", // semantic error
"Missing space in YAML directive", // https://github.com/yaml/yaml-test-suite/issues/38
"Tag shorthand used in documents but only defined in the first", // semantic error
];
const testCases = {};
const testTagsDirname = path.join(testSuiteDirname, "tags");
for (const tagName of fs.readdirSync(testTagsDirname)) {
const testTagDirname = path.join(testTagsDirname, tagName);
for (const testCaseId of fs.readdirSync(testTagDirname)) {
const dirname = path.join(testSuiteDirname, testCaseId);
const title = fs.readFileSync(path.join(dirname, "==="), "utf8").trim();
const content = fs.readFileSync(path.join(dirname, "in.yaml"), "utf8");
const isInvalid =
fs.existsSync(path.join(dirname, "error")) &&
whitelistForValidTest.indexOf(title) === -1;
testCases[isInvalid ? `${title} [INVALID]` : title] = {
input: content,
output: "()",
};
}
}
const finalTestCases = {};
for (const title of orderBy(Object.keys(testCases))) {
finalTestCases[title] = testCases[title];
}
fs.writeFileSync(
"./corpus/spec.txt",
Object.entries(finalTestCases)
.map(([title, { input, output }]) =>
[
"=".repeat(80),
title,
"=".repeat(80),
input,
"-".repeat(80),
"",
output.trim(),
""
].join("\n")
)
.join("\n")
);

File diff suppressed because it is too large Load Diff

@ -1,542 +0,0 @@
[
{
"type": "alias",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "alias_name",
"named": true
}
]
}
},
{
"type": "anchor",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "anchor_name",
"named": true
}
]
}
},
{
"type": "block_mapping",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "block_mapping_pair",
"named": true
}
]
}
},
{
"type": "block_mapping_pair",
"named": true,
"fields": {
"key": {
"multiple": false,
"required": false,
"types": [
{
"type": "block_node",
"named": true
},
{
"type": "flow_node",
"named": true
}
]
},
"value": {
"multiple": false,
"required": false,
"types": [
{
"type": "block_node",
"named": true
},
{
"type": "flow_node",
"named": true
}
]
}
}
},
{
"type": "block_node",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "anchor",
"named": true
},
{
"type": "block_mapping",
"named": true
},
{
"type": "block_scalar",
"named": true
},
{
"type": "block_sequence",
"named": true
},
{
"type": "tag",
"named": true
}
]
}
},
{
"type": "block_scalar",
"named": true,
"fields": {}
},
{
"type": "block_sequence",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "block_sequence_item",
"named": true
}
]
}
},
{
"type": "block_sequence_item",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": false,
"types": [
{
"type": "block_node",
"named": true
},
{
"type": "flow_node",
"named": true
}
]
}
},
{
"type": "document",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "block_node",
"named": true
},
{
"type": "flow_node",
"named": true
},
{
"type": "reserved_directive",
"named": true
},
{
"type": "tag_directive",
"named": true
},
{
"type": "yaml_directive",
"named": true
}
]
}
},
{
"type": "double_quote_scalar",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "escape_sequence",
"named": true
}
]
}
},
{
"type": "flow_mapping",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "flow_node",
"named": true
},
{
"type": "flow_pair",
"named": true
}
]
}
},
{
"type": "flow_node",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "alias",
"named": true
},
{
"type": "anchor",
"named": true
},
{
"type": "double_quote_scalar",
"named": true
},
{
"type": "flow_mapping",
"named": true
},
{
"type": "flow_sequence",
"named": true
},
{
"type": "plain_scalar",
"named": true
},
{
"type": "single_quote_scalar",
"named": true
},
{
"type": "tag",
"named": true
}
]
}
},
{
"type": "flow_pair",
"named": true,
"fields": {
"key": {
"multiple": false,
"required": false,
"types": [
{
"type": "flow_node",
"named": true
}
]
},
"value": {
"multiple": false,
"required": false,
"types": [
{
"type": "flow_node",
"named": true
}
]
}
}
},
{
"type": "flow_sequence",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "flow_node",
"named": true
},
{
"type": "flow_pair",
"named": true
}
]
}
},
{
"type": "plain_scalar",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "boolean_scalar",
"named": true
},
{
"type": "float_scalar",
"named": true
},
{
"type": "integer_scalar",
"named": true
},
{
"type": "null_scalar",
"named": true
},
{
"type": "string_scalar",
"named": true
}
]
}
},
{
"type": "reserved_directive",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "directive_name",
"named": true
},
{
"type": "directive_parameter",
"named": true
}
]
}
},
{
"type": "single_quote_scalar",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "escape_sequence",
"named": true
}
]
}
},
{
"type": "stream",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "document",
"named": true
}
]
}
},
{
"type": "tag_directive",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "tag_handle",
"named": true
},
{
"type": "tag_prefix",
"named": true
}
]
}
},
{
"type": "yaml_directive",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "yaml_version",
"named": true
}
]
}
},
{
"type": "\"",
"named": false
},
{
"type": "&",
"named": false
},
{
"type": "'",
"named": false
},
{
"type": "*",
"named": false
},
{
"type": ",",
"named": false
},
{
"type": "-",
"named": false
},
{
"type": "---",
"named": false
},
{
"type": "...",
"named": false
},
{
"type": ":",
"named": false
},
{
"type": ">",
"named": false
},
{
"type": "?",
"named": false
},
{
"type": "[",
"named": false
},
{
"type": "]",
"named": false
},
{
"type": "alias_name",
"named": true
},
{
"type": "anchor_name",
"named": true
},
{
"type": "boolean_scalar",
"named": true
},
{
"type": "comment",
"named": true
},
{
"type": "directive_name",
"named": true
},
{
"type": "directive_parameter",
"named": true
},
{
"type": "escape_sequence",
"named": true
},
{
"type": "float_scalar",
"named": true
},
{
"type": "integer_scalar",
"named": true
},
{
"type": "null_scalar",
"named": true
},
{
"type": "string_scalar",
"named": true
},
{
"type": "tag",
"named": true
},
{
"type": "tag_handle",
"named": true
},
{
"type": "tag_prefix",
"named": true
},
{
"type": "yaml_version",
"named": true
},
{
"type": "{",
"named": false
},
{
"type": "|",
"named": false
},
{
"type": "}",
"named": false
}
]

File diff suppressed because it is too large Load Diff

@ -1,979 +0,0 @@
#include <tree_sitter/parser.h>
#include <vector>
// tree-sitter does not support multiple files for external scanner
#include "./schema.generated.cc"
namespace {
using std::vector;
using namespace tree_sitter_yaml;
enum TokenType {
END_OF_FILE,
S_DIR_YML_BGN, R_DIR_YML_VER,
S_DIR_TAG_BGN, R_DIR_TAG_HDL, R_DIR_TAG_PFX,
S_DIR_RSV_BGN, R_DIR_RSV_PRM,
S_DRS_END,
S_DOC_END,
R_BLK_SEQ_BGN, BR_BLK_SEQ_BGN, B_BLK_SEQ_BGN,
R_BLK_KEY_BGN, BR_BLK_KEY_BGN, B_BLK_KEY_BGN,
R_BLK_VAL_BGN, BR_BLK_VAL_BGN, B_BLK_VAL_BGN,
R_BLK_IMP_BGN,
R_BLK_LIT_BGN, BR_BLK_LIT_BGN,
R_BLK_FLD_BGN, BR_BLK_FLD_BGN,
BR_BLK_STR_CTN,
R_FLW_SEQ_BGN, BR_FLW_SEQ_BGN, B_FLW_SEQ_BGN,
R_FLW_SEQ_END, BR_FLW_SEQ_END,
R_FLW_MAP_BGN, BR_FLW_MAP_BGN, B_FLW_MAP_BGN,
R_FLW_MAP_END, BR_FLW_MAP_END,
R_FLW_SEP_BGN, BR_FLW_SEP_BGN,
R_FLW_KEY_BGN, BR_FLW_KEY_BGN,
R_FLW_JSV_BGN, BR_FLW_JSV_BGN,
R_FLW_NJV_BGN, BR_FLW_NJV_BGN,
R_DQT_STR_BGN, BR_DQT_STR_BGN, B_DQT_STR_BGN,
R_DQT_STR_CTN, BR_DQT_STR_CTN,
R_DQT_ESC_NWL, BR_DQT_ESC_NWL,
R_DQT_ESC_SEQ, BR_DQT_ESC_SEQ,
R_DQT_STR_END, BR_DQT_STR_END,
R_SQT_STR_BGN, BR_SQT_STR_BGN, B_SQT_STR_BGN,
R_SQT_STR_CTN, BR_SQT_STR_CTN,
R_SQT_ESC_SQT, BR_SQT_ESC_SQT,
R_SQT_STR_END, BR_SQT_STR_END,
R_SGL_PLN_NUL_BLK, BR_SGL_PLN_NUL_BLK, B_SGL_PLN_NUL_BLK, R_SGL_PLN_NUL_FLW, BR_SGL_PLN_NUL_FLW,
R_SGL_PLN_BOL_BLK, BR_SGL_PLN_BOL_BLK, B_SGL_PLN_BOL_BLK, R_SGL_PLN_BOL_FLW, BR_SGL_PLN_BOL_FLW,
R_SGL_PLN_INT_BLK, BR_SGL_PLN_INT_BLK, B_SGL_PLN_INT_BLK, R_SGL_PLN_INT_FLW, BR_SGL_PLN_INT_FLW,
R_SGL_PLN_FLT_BLK, BR_SGL_PLN_FLT_BLK, B_SGL_PLN_FLT_BLK, R_SGL_PLN_FLT_FLW, BR_SGL_PLN_FLT_FLW,
R_SGL_PLN_STR_BLK, BR_SGL_PLN_STR_BLK, B_SGL_PLN_STR_BLK, R_SGL_PLN_STR_FLW, BR_SGL_PLN_STR_FLW,
R_MTL_PLN_STR_BLK, BR_MTL_PLN_STR_BLK,
R_MTL_PLN_STR_FLW, BR_MTL_PLN_STR_FLW,
R_TAG, BR_TAG, B_TAG,
R_ACR_BGN, BR_ACR_BGN, B_ACR_BGN, R_ACR_CTN,
R_ALS_BGN, BR_ALS_BGN, B_ALS_BGN, R_ALS_CTN,
BL,
COMMENT,
};
#define ADV() adv(lexer)
#define ADV_NWL() adv_nwl(lexer)
#define SKP() skp(lexer)
#define SKP_NWL() skp_nwl(lexer)
#define MRK_END() mrk_end(lexer)
#define LKA lexer->lookahead
#define VLD valid_symbols
#define SCN_SUCC 1
#define SCN_STOP 0
#define SCN_FAIL -1
#define IND_ROT 'r'
#define IND_MAP 'm'
#define IND_SEQ 'q'
#define IND_STR 's'
#define RET_SYM(RESULT_SYMBOL) { \
flush(); \
lexer->result_symbol = RESULT_SYMBOL; \
return true; \
}
#define POP_IND() { \
/* incorrect status caused by error recovering */ \
if (ind_typ_stk.size() == 1) { \
return false; \
} \
pop_ind(); \
}
#define PUSH_IND(TYP, LEN) push_ind(TYP, LEN)
#define PUSH_BGN_IND(TYP) { \
if (has_tab_ind) return false; \
push_ind(TYP, bgn_col); \
}
#define MAY_PUSH_IMP_IND(TYP) { \
if (cur_ind != blk_imp_col) { \
if (blk_imp_tab) return false; \
push_ind(IND_MAP, blk_imp_col); \
} \
}
#define MAY_PUSH_SPC_SEQ_IND() { \
if (cur_ind_typ == IND_MAP) { \
push_ind(IND_SEQ, bgn_col); \
} \
}
#define MAY_UPD_IMP_COL() { \
if (blk_imp_row != bgn_row) { \
blk_imp_row = bgn_row; \
blk_imp_col = bgn_col; \
blk_imp_tab = has_tab_ind; \
} \
}
#define UPD_SCH_STT() { \
sch_stt = adv_sch_stt(sch_stt, cur_chr, &rlt_sch); \
}
#define SGL_PLN_SYM(POS, CTX) ( \
rlt_sch == RS_NUL ? POS##_SGL_PLN_NUL_##CTX : \
rlt_sch == RS_BOL ? POS##_SGL_PLN_BOL_##CTX : \
rlt_sch == RS_INT ? POS##_SGL_PLN_INT_##CTX : \
rlt_sch == RS_FLT ? POS##_SGL_PLN_FLT_##CTX : \
POS##_SGL_PLN_STR_##CTX \
)
struct Scanner {
int16_t row;
int16_t col;
int16_t blk_imp_row;
int16_t blk_imp_col;
int16_t blk_imp_tab;
vector<int16_t> ind_typ_stk;
vector<int16_t> ind_len_stk;
// temp
int16_t end_row;
int16_t end_col;
int16_t cur_row;
int16_t cur_col;
int32_t cur_chr;
int8_t sch_stt;
ResultSchema rlt_sch;
Scanner() {
deserialize(NULL, 0);
}
unsigned serialize(char *buffer) {
size_t i = 0;
buffer[i++] = row;
buffer[i++] = col;
buffer[i++] = blk_imp_row;
buffer[i++] = blk_imp_col;
buffer[i++] = blk_imp_tab;
vector<int16_t>::iterator
typ_itr = ind_typ_stk.begin() + 1,
typ_end = ind_typ_stk.end(),
len_itr = ind_len_stk.begin() + 1;
for (; typ_itr != typ_end && i < TREE_SITTER_SERIALIZATION_BUFFER_SIZE; ++typ_itr, ++len_itr) {
buffer[i++] = *typ_itr;
buffer[i++] = *len_itr;
}
return i;
}
void deserialize(const char *buffer, unsigned length) {
row = 0;
col = 0;
blk_imp_row = -1;
blk_imp_col = -1;
blk_imp_tab = 0;
ind_typ_stk.clear();
ind_typ_stk.push_back(IND_ROT);
ind_len_stk.clear();
ind_len_stk.push_back(-1);
if (length > 0) {
size_t i = 0;
row = buffer[i++];
col = buffer[i++];
blk_imp_row = buffer[i++];
blk_imp_col = buffer[i++];
blk_imp_tab = buffer[i++];
while (i < length) {
ind_typ_stk.push_back(buffer[i++]);
ind_len_stk.push_back(buffer[i++]);
}
}
}
void adv(TSLexer *lexer) {
cur_col++;
cur_chr = lexer->lookahead;
lexer->advance(lexer, false);
}
void adv_nwl(TSLexer *lexer) {
cur_row++;
cur_col = 0;
cur_chr = lexer->lookahead;
lexer->advance(lexer, false);
}
void skp(TSLexer *lexer) {
cur_col++;
cur_chr = lexer->lookahead;
lexer->advance(lexer, true);
}
void skp_nwl(TSLexer *lexer) {
cur_row++;
cur_col = 0;
cur_chr = lexer->lookahead;
lexer->advance(lexer, true);
}
void mrk_end(TSLexer *lexer) {
end_row = cur_row;
end_col = cur_col;
lexer->mark_end(lexer);
}
void init() {
cur_row = row;
cur_col = col;
cur_chr = 0;
sch_stt = 0;
rlt_sch = RS_STR;
}
void flush() {
row = end_row;
col = end_col;
}
void pop_ind() {
ind_len_stk.pop_back();
ind_typ_stk.pop_back();
}
void push_ind(int16_t typ, int16_t len) {
ind_len_stk.push_back(len);
ind_typ_stk.push_back(typ);
}
bool is_wsp(int32_t c) {
return c == ' ' || c == '\t';
}
bool is_nwl(int32_t c) {
return c == '\r' || c == '\n';
}
bool is_wht(int32_t c) {
return is_wsp(c) || is_nwl(c) || c == 0;
}
bool is_ns_dec_digit(int32_t c) {
return c >= '0' && c <= '9';
}
bool is_ns_hex_digit(int32_t c) {
return is_ns_dec_digit(c)
|| (c >= 'a' && c <= 'f')
|| (c >= 'A' && c <= 'F');
}
bool is_ns_word_char(int32_t c) {
return c == '-'
|| (c >= '0' && c <= '9')
|| (c >= 'a' && c <= 'z')
|| (c >= 'A' && c <= 'Z');
}
bool is_nb_json(int32_t c) {
return c == 0x09 || (c >= 0x20 && c <= 0x10ffff);
}
bool is_nb_double_char(int32_t c) {
return is_nb_json(c) && c != '\\' && c != '"';
}
bool is_nb_single_char(int32_t c) {
return is_nb_json(c) && c != '\'';
}
bool is_ns_char(int32_t c) {
return (c >= 0x21 && c <= 0x7e)
|| c == 0x85
|| (c >= 0xa0 && c <= 0xd7ff)
|| (c >= 0xe000 && c <= 0xfefe)
|| (c >= 0xff00 && c <= 0xfffd)
|| (c >= 0x10000 && c <= 0x10ffff);
}
bool is_c_indicator(int32_t c) {
return c == '-' || c == '?' || c == ':' || c == ',' || c == '[' || c == ']' || c == '{' || c == '}'
|| c == '#' || c == '&' || c == '*' || c == '!' || c == '|' || c == '>' || c == '\'' || c == '"'
|| c == '%' || c == '@' || c == '`';
}
bool is_c_flow_indicator(int32_t c) {
return c == ',' || c == '[' || c == ']' || c == '{' || c == '}';
}
bool is_plain_safe_in_block(int32_t c) {
return is_ns_char(c);
}
bool is_plain_safe_in_flow(int32_t c) {
return is_ns_char(c) && !is_c_flow_indicator(c);
}
bool is_ns_uri_char(int32_t c) {
return is_ns_word_char(c)
|| c == '#' || c == ';' || c == '/' || c == '?' || c == ':' || c == '@' || c == '&'
|| c == '=' || c == '+' || c == '$' || c == ',' || c == '_' || c == '.' || c == '!'
|| c == '~' || c == '*' || c == '\'' || c == '(' || c == ')' || c == '[' || c == ']';
}
bool is_ns_tag_char(int32_t c) {
return is_ns_word_char(c)
|| c == '#' || c == ';' || c == '/' || c == '?' || c == ':' || c == '@' || c == '&'
|| c == '=' || c == '+' || c == '$' || c == '_' || c == '.'
|| c == '~' || c == '*' || c == '\'' || c == '(' || c == ')';
}
bool is_ns_anchor_char(int32_t c) {
return is_ns_char(c) && !is_c_flow_indicator(c);
}
char scn_uri_esc(TSLexer *lexer) {
if (LKA != '%') return SCN_STOP;
MRK_END();
ADV();
if (!is_ns_hex_digit(LKA)) return SCN_FAIL;
ADV();
if (!is_ns_hex_digit(LKA)) return SCN_FAIL;
ADV();
return SCN_SUCC;
}
char scn_ns_uri_char(TSLexer *lexer) {
if (is_ns_uri_char(LKA)) {ADV(); return SCN_SUCC;}
return scn_uri_esc(lexer);
}
char scn_ns_tag_char(TSLexer *lexer) {
if (is_ns_tag_char(LKA)) {ADV(); return SCN_SUCC;}
return scn_uri_esc(lexer);
}
bool scn_dir_bgn(TSLexer *lexer) {
ADV();
if (LKA == 'Y') {
ADV();
if (LKA == 'A') {
ADV();
if (LKA == 'M') {
ADV();
if (LKA == 'L') {
ADV();
if (is_wht(LKA)) {
MRK_END();
RET_SYM(S_DIR_YML_BGN);
}
}
}
}
} else if (LKA == 'T') {
ADV();
if (LKA == 'A') {
ADV();
if (LKA == 'G') {
ADV();
if (is_wht(LKA)) {
MRK_END();
RET_SYM(S_DIR_TAG_BGN);
}
}
}
}
for (;;) {
if (!is_ns_char(LKA)) break;
ADV();
}
if (cur_col > 1 && is_wht(LKA)) {
MRK_END();
RET_SYM(S_DIR_RSV_BGN);
}
return false;
}
bool scn_dir_yml_ver(TSLexer *lexer, TSSymbol result_symbol) {
uint16_t n1 = 0;
uint16_t n2 = 0;
while (is_ns_dec_digit(LKA)) {ADV();n1++;}
if (LKA != '.') return false;
ADV();
while (is_ns_dec_digit(LKA)) {ADV();n2++;}
if (n1 == 0 || n2 == 0) return false;
MRK_END();
RET_SYM(result_symbol);
}
bool scn_tag_hdl_tal(TSLexer *lexer) {
if (LKA == '!') {ADV();return true;}
uint16_t n = 0;
while (is_ns_word_char(LKA)) {ADV();n++;}
if (n == 0) return true;
if (LKA == '!') {ADV();return true;}
return false;
}
bool scn_dir_tag_hdl(TSLexer *lexer, TSSymbol result_symbol) {
if (LKA == '!') {
ADV();
if (scn_tag_hdl_tal(lexer)) {MRK_END();RET_SYM(result_symbol);}
}
return false;
}
bool scn_dir_tag_pfx(TSLexer *lexer, TSSymbol result_symbol) {
if (LKA == '!') ADV();
else if (scn_ns_tag_char(lexer) == SCN_SUCC);
else return false;
for (;;) {
switch (scn_ns_uri_char(lexer)) {
case SCN_STOP:
MRK_END();
case SCN_FAIL:
RET_SYM(result_symbol);
}
}
}
bool scn_dir_rsv_prm(TSLexer *lexer, TSSymbol result_symbol) {
if (!is_ns_char(LKA)) return false;
ADV();
while (is_ns_char(LKA)) ADV();
MRK_END();
RET_SYM(result_symbol);
}
bool scn_tag(TSLexer *lexer, TSSymbol result_symbol) {
if (LKA != '!') return false;
ADV();
if (is_wht(LKA)) {MRK_END();RET_SYM(result_symbol);}
if (LKA == '<') {
ADV();
if (scn_ns_uri_char(lexer) != SCN_SUCC) return false;
for (;;) {
switch (scn_ns_uri_char(lexer)) {
case SCN_STOP:
if (LKA == '>') {
ADV();
MRK_END();
RET_SYM(result_symbol);
}
case SCN_FAIL:
return false;
}
}
} else {
if (scn_tag_hdl_tal(lexer) && scn_ns_tag_char(lexer) != SCN_SUCC) return false;
for (;;) {
switch (scn_ns_tag_char(lexer)) {
case SCN_STOP:
MRK_END();
case SCN_FAIL:
RET_SYM(result_symbol);
}
}
}
return false;
}
bool scn_acr_bgn(TSLexer *lexer, TSSymbol result_symbol) {
if (LKA != '&') return false;
ADV();
if (!is_ns_anchor_char(LKA)) return false;
MRK_END();
RET_SYM(result_symbol);
}
bool scn_acr_ctn(TSLexer *lexer, TSSymbol result_symbol) {
while (is_ns_anchor_char(LKA)) ADV();
MRK_END();
RET_SYM(result_symbol);
}
bool scn_als_bgn(TSLexer *lexer, TSSymbol result_symbol) {
if (LKA != '*') return false;
ADV();
if (!is_ns_anchor_char(LKA)) return false;
MRK_END();
RET_SYM(result_symbol);
}
bool scn_als_ctn(TSLexer *lexer, TSSymbol result_symbol) {
while (is_ns_anchor_char(LKA)) ADV();
MRK_END();
RET_SYM(result_symbol);
}
bool scn_dqt_esc_seq(TSLexer *lexer, TSSymbol result_symbol) {
uint16_t i;
switch (LKA) {
case '0': case 'a': case 'b': case 't': case '\t': case 'n': case 'v':
case 'r': case 'e': case ' ': case '"': case '/': case '\\': case 'N':
case '_': case 'L': case 'P':
ADV();
break;
case 'U':
ADV();
for (i = 0; i < 8; i++) if (is_ns_hex_digit(LKA)) ADV(); else return false;
break;
case 'u':
ADV();
for (i = 0; i < 4; i++) if (is_ns_hex_digit(LKA)) ADV(); else return false;
break;
case 'x':
ADV();
for (i = 0; i < 2; i++) if (is_ns_hex_digit(LKA)) ADV(); else return false;
break;
default:
return false;
}
MRK_END();
RET_SYM(result_symbol);
}
bool scn_dqt_str_cnt(TSLexer *lexer, TSSymbol result_symbol) {
if (!is_nb_double_char(LKA)) return false;
if (cur_col == 0 && scn_drs_doc_end(lexer)) {
MRK_END();
RET_SYM(cur_chr == '-' ? S_DRS_END : S_DOC_END);
} else ADV();
while (is_nb_double_char(LKA)) ADV();
MRK_END();
RET_SYM(result_symbol);
}
bool scn_sqt_str_cnt(TSLexer *lexer, TSSymbol result_symbol) {
if (!is_nb_single_char(LKA)) return false;
if (cur_col == 0 && scn_drs_doc_end(lexer)) {
MRK_END();
RET_SYM(cur_chr == '-' ? S_DRS_END : S_DOC_END);
} else ADV();
while (is_nb_single_char(LKA)) ADV();
MRK_END();
RET_SYM(result_symbol);
}
bool scn_blk_str_bgn(TSLexer *lexer, TSSymbol result_symbol) {
if (LKA != '|' && LKA != '>') return false;
ADV();
int16_t cur_ind = ind_len_stk.back();
int16_t ind = -1;
if (LKA >= '1' && LKA <= '9') {
ind = LKA - '1';
ADV();
if (LKA == '+' || LKA == '-') {
ADV();
}
} else if (LKA == '+' || LKA == '-') {
ADV();
if (LKA >= '1' && LKA <= '9') {
ind = LKA - '1';
ADV();
}
}
if (!is_wht(LKA)) return false;
MRK_END();
if (ind != -1) ind += cur_ind;
else {
ind = cur_ind;
while (is_wsp(LKA)) ADV();
if (LKA == '#') {
ADV();
while (!is_nwl(LKA) && LKA != 0) ADV();
}
if (is_nwl(LKA)) ADV_NWL();
while (LKA != 0) {
if (LKA == ' ') ADV();
else if (is_nwl(LKA)) {
if (cur_col - 1 < ind) break;
ind = cur_col - 1;
ADV_NWL();
} else {
if (cur_col - 1 > ind) ind = cur_col - 1;
break;
}
}
}
PUSH_IND(IND_STR, ind);
RET_SYM(result_symbol);
}
bool scn_blk_str_cnt(TSLexer *lexer, TSSymbol result_symbol) {
if (!is_ns_char(LKA)) return false;
if (cur_col == 0 && scn_drs_doc_end(lexer)) {POP_IND();RET_SYM(BL);}
else ADV();
MRK_END();
for (;;) {
if (is_ns_char(LKA)) {
ADV();
while (is_ns_char(LKA)) ADV();
MRK_END();
}
if (is_wsp(LKA)) {
ADV();
while (is_wsp(LKA)) ADV();
} else break;
}
RET_SYM(result_symbol);
}
char scn_pln_cnt(TSLexer *lexer, bool (Scanner::*is_plain_safe)(int32_t)) {
bool is_cur_saf = (this->*is_plain_safe)(cur_chr);
bool is_lka_wsp = is_wsp(LKA);
bool is_lka_saf = (this->*is_plain_safe)(LKA);
if (is_lka_saf || is_lka_wsp) {
for (;;) {
if (is_lka_saf && LKA != '#' && LKA != ':') {ADV();MRK_END();UPD_SCH_STT();}
else if (is_cur_saf && LKA == '#') {ADV();MRK_END();UPD_SCH_STT();}
else if (is_lka_wsp) {ADV();UPD_SCH_STT();}
else if (LKA == ':') ADV(); // check later
else break;
is_cur_saf = is_lka_saf;
is_lka_wsp = is_wsp(LKA);
is_lka_saf = (this->*is_plain_safe)(LKA);
if (cur_chr == ':') {
if (is_lka_saf) {MRK_END();UPD_SCH_STT();}
else return SCN_FAIL;
}
}
} else return SCN_STOP;
return SCN_SUCC;
}
bool scn_drs_doc_end(TSLexer *lexer) {
if (LKA != '-' && LKA != '.') return false;
int32_t delimeter = LKA;
ADV();
if (LKA == delimeter) {
ADV();
if (LKA == delimeter) {
ADV();
if (is_wht(LKA)) return true;
}
}
MRK_END();
return false;
}
bool scan(TSLexer *lexer, const bool *valid_symbols) {
init();
MRK_END();
bool allow_comment = !(VLD[R_DQT_STR_CTN] || VLD[BR_DQT_STR_CTN] || VLD[R_SQT_STR_CTN] || VLD[BR_SQT_STR_CTN]);
vector<int16_t>::reverse_iterator ind_ptr = ind_len_stk.rbegin();
vector<int16_t>::reverse_iterator ind_end = ind_len_stk.rend();
int16_t cur_ind = *ind_ptr++;
int16_t prt_ind = ind_ptr == ind_end ? -1 : *ind_ptr;
int16_t cur_ind_typ = ind_typ_stk.back();
bool has_tab_ind = false;
int16_t leading_spaces = 0;
for (;;) {
if (LKA == ' ') {
if (!has_tab_ind) leading_spaces++;
SKP();
} else if (LKA == '\t') {
has_tab_ind = true;
SKP();
} else if (is_nwl(LKA)) {
has_tab_ind = false;
leading_spaces = 0;
SKP_NWL();
} else if (allow_comment && LKA == '#') {
if (VLD[BR_BLK_STR_CTN] && VLD[BL] && cur_col <= cur_ind) {POP_IND();RET_SYM(BL);}
if (
VLD[BR_BLK_STR_CTN]
? cur_row == row
: cur_col == 0 || cur_row != row || cur_col > col
) {
ADV();
while (!is_nwl(LKA) && LKA != 0) ADV();
MRK_END();
RET_SYM(COMMENT);
} else break;
} else break;
}
if (LKA == 0) {
if (VLD[BL]) {MRK_END();POP_IND();RET_SYM(BL)}
if (VLD[END_OF_FILE]) {MRK_END();RET_SYM(END_OF_FILE)}
return false;
}
int16_t bgn_row = cur_row;
int16_t bgn_col = cur_col;
int32_t bgn_chr = LKA;
if (VLD[BL] && bgn_col <= cur_ind && !has_tab_ind) {
if (
cur_ind == prt_ind && cur_ind_typ == IND_SEQ
? bgn_col < cur_ind || LKA != '-'
: bgn_col <= prt_ind || cur_ind_typ == IND_STR
) {POP_IND();RET_SYM(BL);}
}
bool has_nwl = cur_row > row;
bool is_r = !has_nwl;
bool is_br = has_nwl && leading_spaces > cur_ind;
bool is_b = has_nwl && leading_spaces == cur_ind && !has_tab_ind;
bool is_s = bgn_col == 0;
if (VLD[R_DIR_YML_VER] && is_r) return scn_dir_yml_ver(lexer, R_DIR_YML_VER);
if (VLD[R_DIR_TAG_HDL] && is_r) return scn_dir_tag_hdl(lexer, R_DIR_TAG_HDL);
if (VLD[R_DIR_TAG_PFX] && is_r) return scn_dir_tag_pfx(lexer, R_DIR_TAG_PFX);
if (VLD[R_DIR_RSV_PRM] && is_r) return scn_dir_rsv_prm(lexer, R_DIR_RSV_PRM);
if (VLD[BR_BLK_STR_CTN] && is_br && scn_blk_str_cnt(lexer, BR_BLK_STR_CTN)) return true;
if (
(VLD[R_DQT_STR_CTN] && is_r && scn_dqt_str_cnt(lexer, R_DQT_STR_CTN))
|| (VLD[BR_DQT_STR_CTN] && is_br && scn_dqt_str_cnt(lexer, BR_DQT_STR_CTN))
) return true;
if (
(VLD[R_SQT_STR_CTN] && is_r && scn_sqt_str_cnt(lexer, R_SQT_STR_CTN))
|| (VLD[BR_SQT_STR_CTN] && is_br && scn_sqt_str_cnt(lexer, BR_SQT_STR_CTN))
) return true;
if (VLD[R_ACR_CTN] && is_r) return scn_acr_ctn(lexer, R_ACR_CTN);
if (VLD[R_ALS_CTN] && is_r) return scn_als_ctn(lexer, R_ALS_CTN);
if (LKA == '%') {
if (VLD[S_DIR_YML_BGN] && is_s) return scn_dir_bgn(lexer);
} else if (LKA == '*') {
if (VLD[R_ALS_BGN] && is_r) {MAY_UPD_IMP_COL();return scn_als_bgn(lexer, R_ALS_BGN);}
if (VLD[BR_ALS_BGN] && is_br) {MAY_UPD_IMP_COL();return scn_als_bgn(lexer, BR_ALS_BGN);}
if (VLD[B_ALS_BGN] && is_b) {MAY_UPD_IMP_COL();return scn_als_bgn(lexer, B_ALS_BGN);}
} else if (LKA == '&') {
if (VLD[R_ACR_BGN] && is_r) {MAY_UPD_IMP_COL();return scn_acr_bgn(lexer, R_ACR_BGN);}
if (VLD[BR_ACR_BGN] && is_br) {MAY_UPD_IMP_COL();return scn_acr_bgn(lexer, BR_ACR_BGN);}
if (VLD[B_ACR_BGN] && is_b) {MAY_UPD_IMP_COL();return scn_acr_bgn(lexer, B_ACR_BGN);}
} else if (LKA == '!') {
if (VLD[R_TAG] && is_r) {MAY_UPD_IMP_COL();return scn_tag(lexer, R_TAG);}
if (VLD[BR_TAG] && is_br) {MAY_UPD_IMP_COL();return scn_tag(lexer, BR_TAG);}
if (VLD[B_TAG] && is_b) {MAY_UPD_IMP_COL();return scn_tag(lexer, B_TAG);}
} else if (LKA == '[') {
if (VLD[R_FLW_SEQ_BGN] && is_r) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(R_FLW_SEQ_BGN)}
if (VLD[BR_FLW_SEQ_BGN] && is_br) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(BR_FLW_SEQ_BGN)}
if (VLD[B_FLW_SEQ_BGN] && is_b) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(B_FLW_SEQ_BGN)}
} else if (LKA == ']') {
if (VLD[R_FLW_SEQ_END] && is_r) {ADV();MRK_END();RET_SYM(R_FLW_SEQ_END)}
if (VLD[BR_FLW_SEQ_END] && is_br) {ADV();MRK_END();RET_SYM(BR_FLW_SEQ_END)}
} else if (LKA == '{') {
if (VLD[R_FLW_MAP_BGN] && is_r) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(R_FLW_MAP_BGN)}
if (VLD[BR_FLW_MAP_BGN] && is_br) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(BR_FLW_MAP_BGN)}
if (VLD[B_FLW_MAP_BGN] && is_b) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(B_FLW_MAP_BGN)}
} else if (LKA == '}') {
if (VLD[R_FLW_MAP_END] && is_r) {ADV();MRK_END();RET_SYM(R_FLW_MAP_END)}
if (VLD[BR_FLW_MAP_END] && is_br) {ADV();MRK_END();RET_SYM(BR_FLW_MAP_END)}
} else if (LKA == ',') {
if (VLD[R_FLW_SEP_BGN] && is_r) {ADV();MRK_END();RET_SYM(R_FLW_SEP_BGN)}
if (VLD[BR_FLW_SEP_BGN] && is_br) {ADV();MRK_END();RET_SYM(BR_FLW_SEP_BGN)}
} else if (LKA == '"') {
if (VLD[R_DQT_STR_BGN] && is_r) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(R_DQT_STR_BGN)}
if (VLD[BR_DQT_STR_BGN] && is_br) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(BR_DQT_STR_BGN)}
if (VLD[B_DQT_STR_BGN] && is_b) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(B_DQT_STR_BGN)}
if (VLD[R_DQT_STR_END] && is_r) {ADV();MRK_END();RET_SYM(R_DQT_STR_END)}
if (VLD[BR_DQT_STR_END] && is_br) {ADV();MRK_END();RET_SYM(BR_DQT_STR_END)}
} else if (LKA == '\'') {
if (VLD[R_SQT_STR_BGN] && is_r) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(R_SQT_STR_BGN)}
if (VLD[BR_SQT_STR_BGN] && is_br) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(BR_SQT_STR_BGN)}
if (VLD[B_SQT_STR_BGN] && is_b) {MAY_UPD_IMP_COL();ADV();MRK_END();RET_SYM(B_SQT_STR_BGN)}
if (VLD[R_SQT_STR_END] && is_r) {
ADV();
if (LKA == '\'') {ADV();MRK_END();RET_SYM(R_SQT_ESC_SQT)}
else {MRK_END();RET_SYM(R_SQT_STR_END)}
}
if (VLD[BR_SQT_STR_END] && is_br) {
ADV();
if (LKA == '\'') {ADV();MRK_END();RET_SYM(BR_SQT_ESC_SQT)}
else {MRK_END();RET_SYM(BR_SQT_STR_END)}
}
} else if (LKA == '?') {
bool is_r_blk_key_bgn = VLD[R_BLK_KEY_BGN] && is_r;
bool is_br_blk_key_bgn = VLD[BR_BLK_KEY_BGN] && is_br;
bool is_b_blk_key_bgn = VLD[B_BLK_KEY_BGN] && is_b;
bool is_r_flw_key_bgn = VLD[R_FLW_KEY_BGN] && is_r;
bool is_br_flw_key_bgn = VLD[BR_FLW_KEY_BGN] && is_br;
if (is_r_blk_key_bgn || is_br_blk_key_bgn || is_b_blk_key_bgn || is_r_flw_key_bgn || is_br_flw_key_bgn) {
ADV();
if (is_wht(LKA)) {
MRK_END();
if (is_r_blk_key_bgn) {PUSH_BGN_IND(IND_MAP);RET_SYM(R_BLK_KEY_BGN);}
if (is_br_blk_key_bgn) {PUSH_BGN_IND(IND_MAP);RET_SYM(BR_BLK_KEY_BGN);}
if (is_b_blk_key_bgn) RET_SYM(B_BLK_KEY_BGN);
if (is_r_flw_key_bgn) RET_SYM(R_FLW_KEY_BGN);
if (is_br_flw_key_bgn) RET_SYM(BR_FLW_KEY_BGN);
}
}
} else if (LKA == ':') {
if (VLD[R_FLW_JSV_BGN] && is_r) {ADV();MRK_END();RET_SYM(R_FLW_JSV_BGN);}
if (VLD[BR_FLW_JSV_BGN] && is_br) {ADV();MRK_END();RET_SYM(BR_FLW_JSV_BGN);}
bool is_r_blk_val_bgn = VLD[R_BLK_VAL_BGN] && is_r;
bool is_br_blk_val_bgn = VLD[BR_BLK_VAL_BGN] && is_br;
bool is_b_blk_val_bgn = VLD[B_BLK_VAL_BGN] && is_b;
bool is_r_blk_imp_bgn = VLD[R_BLK_IMP_BGN] && is_r;
bool is_r_flw_njv_bgn = VLD[R_FLW_NJV_BGN] && is_r;
bool is_br_flw_njv_bgn = VLD[BR_FLW_NJV_BGN] && is_br;
if (is_r_blk_val_bgn || is_br_blk_val_bgn || is_b_blk_val_bgn || is_r_blk_imp_bgn || is_r_flw_njv_bgn || is_br_flw_njv_bgn) {
ADV();
bool is_lka_wht = is_wht(LKA);
if (is_lka_wht) {
if (is_r_blk_val_bgn) {PUSH_BGN_IND(IND_MAP);MRK_END();RET_SYM(R_BLK_VAL_BGN);}
if (is_br_blk_val_bgn) {PUSH_BGN_IND(IND_MAP);MRK_END();RET_SYM(BR_BLK_VAL_BGN);}
if (is_b_blk_val_bgn) {MRK_END();RET_SYM(B_BLK_VAL_BGN);}
if (is_r_blk_imp_bgn) {MAY_PUSH_IMP_IND();MRK_END();RET_SYM(R_BLK_IMP_BGN);}
}
if (is_lka_wht || LKA == ',' || LKA == ']' || LKA == '}') {
if (is_r_flw_njv_bgn) {MRK_END();RET_SYM(R_FLW_NJV_BGN);}
if (is_br_flw_njv_bgn) {MRK_END();RET_SYM(BR_FLW_NJV_BGN);}
}
}
} else if (LKA == '-') {
bool is_r_blk_seq_bgn = VLD[R_BLK_SEQ_BGN] && is_r;
bool is_br_blk_seq_bgn = VLD[BR_BLK_SEQ_BGN] && is_br;
bool is_b_blk_seq_bgn = VLD[B_BLK_SEQ_BGN] && is_b;
bool is_s_drs_end = is_s;
if (is_r_blk_seq_bgn || is_br_blk_seq_bgn || is_b_blk_seq_bgn || is_s_drs_end) {
ADV();
if (is_wht(LKA)) {
if (is_r_blk_seq_bgn) {PUSH_BGN_IND(IND_SEQ);MRK_END();RET_SYM(R_BLK_SEQ_BGN)}
if (is_br_blk_seq_bgn) {PUSH_BGN_IND(IND_SEQ);MRK_END();RET_SYM(BR_BLK_SEQ_BGN)}
if (is_b_blk_seq_bgn) {MAY_PUSH_SPC_SEQ_IND();MRK_END();RET_SYM(B_BLK_SEQ_BGN)}
} else if (LKA == '-' && is_s_drs_end) {
ADV();
if (LKA == '-') {
ADV();
if (is_wht(LKA)) {
if (VLD[BL]) {POP_IND();RET_SYM(BL);}
MRK_END();
RET_SYM(S_DRS_END);
}
}
}
}
} else if (LKA == '.') {
if (is_s) {
ADV();
if (LKA == '.') {
ADV();
if (LKA == '.') {
ADV();
if (is_wht(LKA)) {
if (VLD[BL]) {POP_IND();RET_SYM(BL);}
MRK_END();
RET_SYM(S_DOC_END);
}
}
}
}
} else if (LKA == '\\') {
bool is_r_dqt_esc_nwl = VLD[R_DQT_ESC_NWL] && is_r;
bool is_br_dqt_esc_nwl = VLD[BR_DQT_ESC_NWL] && is_br;
bool is_r_dqt_esc_seq = VLD[R_DQT_ESC_SEQ] && is_r;
bool is_br_dqt_esc_seq = VLD[BR_DQT_ESC_SEQ] && is_br;
if (is_r_dqt_esc_nwl || is_br_dqt_esc_nwl || is_r_dqt_esc_seq || is_br_dqt_esc_seq) {
ADV();
if (is_nwl(LKA)) {
if (is_r_dqt_esc_nwl) {MRK_END();RET_SYM(R_DQT_ESC_NWL)}
if (is_br_dqt_esc_nwl) {MRK_END();RET_SYM(BR_DQT_ESC_NWL)}
}
if (is_r_dqt_esc_seq) return scn_dqt_esc_seq(lexer, R_DQT_ESC_SEQ);
if (is_br_dqt_esc_seq) return scn_dqt_esc_seq(lexer, BR_DQT_ESC_SEQ);
return false;
}
} else if (LKA == '|') {
if (VLD[R_BLK_LIT_BGN] && is_r) return scn_blk_str_bgn(lexer, R_BLK_LIT_BGN);
if (VLD[BR_BLK_LIT_BGN] && is_br) return scn_blk_str_bgn(lexer, BR_BLK_LIT_BGN);
} else if (LKA == '>') {
if (VLD[R_BLK_FLD_BGN] && is_r) return scn_blk_str_bgn(lexer, R_BLK_FLD_BGN);
if (VLD[BR_BLK_FLD_BGN] && is_br) return scn_blk_str_bgn(lexer, BR_BLK_FLD_BGN);
}
bool maybe_sgl_pln_blk = (VLD[R_SGL_PLN_STR_BLK] && is_r) || (VLD[BR_SGL_PLN_STR_BLK] && is_br) || (VLD[B_SGL_PLN_STR_BLK] && is_b);
bool maybe_sgl_pln_flw = (VLD[R_SGL_PLN_STR_FLW] && is_r) || (VLD[BR_SGL_PLN_STR_FLW] && is_br);
bool maybe_mtl_pln_blk = (VLD[R_MTL_PLN_STR_BLK] && is_r) || (VLD[BR_MTL_PLN_STR_BLK] && is_br);
bool maybe_mtl_pln_flw = (VLD[R_MTL_PLN_STR_FLW] && is_r) || (VLD[BR_MTL_PLN_STR_FLW] && is_br);
if (maybe_sgl_pln_blk || maybe_sgl_pln_flw || maybe_mtl_pln_blk || maybe_mtl_pln_flw) {
bool is_in_blk = maybe_sgl_pln_blk || maybe_mtl_pln_blk;
bool (Scanner::*is_plain_safe)(int32_t) = is_in_blk ? &Scanner::is_plain_safe_in_block : &Scanner::is_plain_safe_in_flow;
if (cur_col - bgn_col == 0) ADV();
if (cur_col - bgn_col == 1) {
bool is_plain_first =
(is_ns_char(bgn_chr) && !is_c_indicator(bgn_chr))
|| ((bgn_chr == '-' || bgn_chr == '?' || bgn_chr == ':')
&& (this->*is_plain_safe)(LKA));
if (!is_plain_first) return false;
UPD_SCH_STT();
} else {
// no need to check the following cases:
// ..X
// ...X
// --X
// ---X
// X: lookahead
sch_stt = SCH_STT_FRZ; // must be RS_STR
}
MRK_END();
for (;;) {
if (!is_nwl(LKA)) {
if (scn_pln_cnt(lexer, is_plain_safe) != SCN_SUCC) break;
}
if (LKA == 0 || !is_nwl(LKA)) break;
for (;;) {
if (is_nwl(LKA)) ADV_NWL();
else if (is_wsp(LKA)) ADV();
else break;
}
if (LKA == 0 || cur_col <= cur_ind) break;
if (cur_col == 0 && scn_drs_doc_end(lexer)) break;
}
if (end_row == bgn_row) {
if (maybe_sgl_pln_blk) {MAY_UPD_IMP_COL();RET_SYM(is_r ? SGL_PLN_SYM(R, BLK) : is_br ? SGL_PLN_SYM(BR, BLK) : SGL_PLN_SYM(B, BLK));}
if (maybe_sgl_pln_flw) RET_SYM(is_r ? SGL_PLN_SYM(R, FLW) : SGL_PLN_SYM(BR, FLW));
} else {
if (maybe_mtl_pln_blk) {MAY_UPD_IMP_COL();RET_SYM(is_r ? R_MTL_PLN_STR_BLK : BR_MTL_PLN_STR_BLK);}
if (maybe_mtl_pln_flw) RET_SYM(is_r ? R_MTL_PLN_STR_FLW : BR_MTL_PLN_STR_FLW);
}
return false;
}
return false;
}
};
}
extern "C" {
void *tree_sitter_yaml_external_scanner_create() {
return new Scanner();
}
void tree_sitter_yaml_external_scanner_destroy(void *payload) {
Scanner *scanner = static_cast<Scanner *>(payload);
delete scanner;
}
unsigned tree_sitter_yaml_external_scanner_serialize(void *payload, char *buffer) {
Scanner *scanner = static_cast<Scanner *>(payload);
return scanner->serialize(buffer);
}
void tree_sitter_yaml_external_scanner_deserialize(void *payload, const char *buffer, unsigned length) {
Scanner *scanner = static_cast<Scanner *>(payload);
scanner->deserialize(buffer, length);
}
bool tree_sitter_yaml_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {
Scanner *scanner = static_cast<Scanner *>(payload);
return scanner->scan(lexer, valid_symbols);
}
}

@ -1,204 +0,0 @@
#include <cassert>
namespace tree_sitter_yaml {
const int8_t SCH_STT_FRZ = -1;
enum ResultSchema {
RS_STR,
RS_INT,
RS_NUL,
RS_BOL,
RS_FLT,
};
int8_t adv_sch_stt(int8_t sch_stt, int32_t cur_chr, ResultSchema *rlt_sch) {
switch (sch_stt) {
case -1:
break;
case 0:
if (cur_chr == '.') {*rlt_sch = RS_STR; return 6;}
if (cur_chr == '0') {*rlt_sch = RS_INT; return 37;}
if (cur_chr == 'F') {*rlt_sch = RS_STR; return 2;}
if (cur_chr == 'N') {*rlt_sch = RS_STR; return 16;}
if (cur_chr == 'T') {*rlt_sch = RS_STR; return 13;}
if (cur_chr == 'f') {*rlt_sch = RS_STR; return 17;}
if (cur_chr == 'n') {*rlt_sch = RS_STR; return 29;}
if (cur_chr == 't') {*rlt_sch = RS_STR; return 26;}
if (cur_chr == '~') {*rlt_sch = RS_NUL; return 35;}
if (cur_chr == '+' ||
cur_chr == '-') {*rlt_sch = RS_STR; return 1;}
if (('1' <= cur_chr && cur_chr <= '9')) {*rlt_sch = RS_INT; return 38;}
break;
case 1:
if (cur_chr == '.') {*rlt_sch = RS_STR; return 7;}
if (('0' <= cur_chr && cur_chr <= '9')) {*rlt_sch = RS_INT; return 38;}
break;
case 2:
if (cur_chr == 'A') {*rlt_sch = RS_STR; return 9;}
if (cur_chr == 'a') {*rlt_sch = RS_STR; return 22;}
break;
case 3:
if (cur_chr == 'A') {*rlt_sch = RS_STR; return 12;}
if (cur_chr == 'a') {*rlt_sch = RS_STR; return 12;}
break;
case 4:
if (cur_chr == 'E') {*rlt_sch = RS_BOL; return 36;}
break;
case 5:
if (cur_chr == 'F') {*rlt_sch = RS_FLT; return 41;}
break;
case 6:
if (cur_chr == 'I') {*rlt_sch = RS_STR; return 11;}
if (cur_chr == 'N') {*rlt_sch = RS_STR; return 3;}
if (cur_chr == 'i') {*rlt_sch = RS_STR; return 24;}
if (cur_chr == 'n') {*rlt_sch = RS_STR; return 18;}
if (('0' <= cur_chr && cur_chr <= '9')) {*rlt_sch = RS_FLT; return 42;}
break;
case 7:
if (cur_chr == 'I') {*rlt_sch = RS_STR; return 11;}
if (cur_chr == 'i') {*rlt_sch = RS_STR; return 24;}
if (('0' <= cur_chr && cur_chr <= '9')) {*rlt_sch = RS_FLT; return 42;}
break;
case 8:
if (cur_chr == 'L') {*rlt_sch = RS_NUL; return 35;}
break;
case 9:
if (cur_chr == 'L') {*rlt_sch = RS_STR; return 14;}
break;
case 10:
if (cur_chr == 'L') {*rlt_sch = RS_STR; return 8;}
break;
case 11:
if (cur_chr == 'N') {*rlt_sch = RS_STR; return 5;}
if (cur_chr == 'n') {*rlt_sch = RS_STR; return 20;}
break;
case 12:
if (cur_chr == 'N') {*rlt_sch = RS_FLT; return 41;}
break;
case 13:
if (cur_chr == 'R') {*rlt_sch = RS_STR; return 15;}
if (cur_chr == 'r') {*rlt_sch = RS_STR; return 28;}
break;
case 14:
if (cur_chr == 'S') {*rlt_sch = RS_STR; return 4;}
break;
case 15:
if (cur_chr == 'U') {*rlt_sch = RS_STR; return 4;}
break;
case 16:
if (cur_chr == 'U') {*rlt_sch = RS_STR; return 10;}
if (cur_chr == 'u') {*rlt_sch = RS_STR; return 23;}
break;
case 17:
if (cur_chr == 'a') {*rlt_sch = RS_STR; return 22;}
break;
case 18:
if (cur_chr == 'a') {*rlt_sch = RS_STR; return 25;}
break;
case 19:
if (cur_chr == 'e') {*rlt_sch = RS_BOL; return 36;}
break;
case 20:
if (cur_chr == 'f') {*rlt_sch = RS_FLT; return 41;}
break;
case 21:
if (cur_chr == 'l') {*rlt_sch = RS_NUL; return 35;}
break;
case 22:
if (cur_chr == 'l') {*rlt_sch = RS_STR; return 27;}
break;
case 23:
if (cur_chr == 'l') {*rlt_sch = RS_STR; return 21;}
break;
case 24:
if (cur_chr == 'n') {*rlt_sch = RS_STR; return 20;}
break;
case 25:
if (cur_chr == 'n') {*rlt_sch = RS_FLT; return 41;}
break;
case 26:
if (cur_chr == 'r') {*rlt_sch = RS_STR; return 28;}
break;
case 27:
if (cur_chr == 's') {*rlt_sch = RS_STR; return 19;}
break;
case 28:
if (cur_chr == 'u') {*rlt_sch = RS_STR; return 19;}
break;
case 29:
if (cur_chr == 'u') {*rlt_sch = RS_STR; return 23;}
break;
case 30:
if (cur_chr == '+' ||
cur_chr == '-') {*rlt_sch = RS_STR; return 32;}
if (('0' <= cur_chr && cur_chr <= '9')) {*rlt_sch = RS_FLT; return 43;}
break;
case 31:
if (('0' <= cur_chr && cur_chr <= '7')) {*rlt_sch = RS_INT; return 39;}
break;
case 32:
if (('0' <= cur_chr && cur_chr <= '9')) {*rlt_sch = RS_FLT; return 43;}
break;
case 33:
if (('0' <= cur_chr && cur_chr <= '9') ||
('A' <= cur_chr && cur_chr <= 'F') ||
('a' <= cur_chr && cur_chr <= 'f')) {*rlt_sch = RS_INT; return 40;}
break;
case 34:
assert(false);
break;
case 35:
*rlt_sch = RS_NUL;
break;
case 36:
*rlt_sch = RS_BOL;
break;
case 37:
*rlt_sch = RS_INT;
if (cur_chr == '.') {*rlt_sch = RS_FLT; return 42;}
if (cur_chr == 'o') {*rlt_sch = RS_STR; return 31;}
if (cur_chr == 'x') {*rlt_sch = RS_STR; return 33;}
if (cur_chr == 'E' ||
cur_chr == 'e') {*rlt_sch = RS_STR; return 30;}
if (('0' <= cur_chr && cur_chr <= '9')) {*rlt_sch = RS_INT; return 38;}
break;
case 38:
*rlt_sch = RS_INT;
if (cur_chr == '.') {*rlt_sch = RS_FLT; return 42;}
if (cur_chr == 'E' ||
cur_chr == 'e') {*rlt_sch = RS_STR; return 30;}
if (('0' <= cur_chr && cur_chr <= '9')) {*rlt_sch = RS_INT; return 38;}
break;
case 39:
*rlt_sch = RS_INT;
if (('0' <= cur_chr && cur_chr <= '7')) {*rlt_sch = RS_INT; return 39;}
break;
case 40:
*rlt_sch = RS_INT;
if (('0' <= cur_chr && cur_chr <= '9') ||
('A' <= cur_chr && cur_chr <= 'F') ||
('a' <= cur_chr && cur_chr <= 'f')) {*rlt_sch = RS_INT; return 40;}
break;
case 41:
*rlt_sch = RS_FLT;
break;
case 42:
*rlt_sch = RS_FLT;
if (cur_chr == 'E' ||
cur_chr == 'e') {*rlt_sch = RS_STR; return 30;}
if (('0' <= cur_chr && cur_chr <= '9')) {*rlt_sch = RS_FLT; return 42;}
break;
case 43:
*rlt_sch = RS_FLT;
if (('0' <= cur_chr && cur_chr <= '9')) {*rlt_sch = RS_FLT; return 43;}
break;
default:
*rlt_sch = RS_STR;
return -1;
}
if (cur_chr != '\r' && cur_chr != '\n' && cur_chr != ' ' && cur_chr != 0) *rlt_sch = RS_STR;
return -1;
}
}

@ -1,223 +0,0 @@
#ifndef TREE_SITTER_PARSER_H_
#define TREE_SITTER_PARSER_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#define ts_builtin_sym_error ((TSSymbol)-1)
#define ts_builtin_sym_end 0
#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
typedef uint16_t TSStateId;
#ifndef TREE_SITTER_API_H_
typedef uint16_t TSSymbol;
typedef uint16_t TSFieldId;
typedef struct TSLanguage TSLanguage;
#endif
typedef struct {
TSFieldId field_id;
uint8_t child_index;
bool inherited;
} TSFieldMapEntry;
typedef struct {
uint16_t index;
uint16_t length;
} TSFieldMapSlice;
typedef struct {
bool visible;
bool named;
bool supertype;
} TSSymbolMetadata;
typedef struct TSLexer TSLexer;
struct TSLexer {
int32_t lookahead;
TSSymbol result_symbol;
void (*advance)(TSLexer *, bool);
void (*mark_end)(TSLexer *);
uint32_t (*get_column)(TSLexer *);
bool (*is_at_included_range_start)(const TSLexer *);
bool (*eof)(const TSLexer *);
};
typedef enum {
TSParseActionTypeShift,
TSParseActionTypeReduce,
TSParseActionTypeAccept,
TSParseActionTypeRecover,
} TSParseActionType;
typedef union {
struct {
uint8_t type;
TSStateId state;
bool extra;
bool repetition;
} shift;
struct {
uint8_t type;
uint8_t child_count;
TSSymbol symbol;
int16_t dynamic_precedence;
uint16_t production_id;
} reduce;
uint8_t type;
} TSParseAction;
typedef struct {
uint16_t lex_state;
uint16_t external_lex_state;
} TSLexMode;
typedef union {
TSParseAction action;
struct {
uint8_t count;
bool reusable;
} entry;
} TSParseActionEntry;
struct TSLanguage {
uint32_t version;
uint32_t symbol_count;
uint32_t alias_count;
uint32_t token_count;
uint32_t external_token_count;
uint32_t state_count;
uint32_t large_state_count;
uint32_t production_id_count;
uint32_t field_count;
uint16_t max_alias_sequence_length;
const uint16_t *parse_table;
const uint16_t *small_parse_table;
const uint32_t *small_parse_table_map;
const TSParseActionEntry *parse_actions;
const char **symbol_names;
const char **field_names;
const TSFieldMapSlice *field_map_slices;
const TSFieldMapEntry *field_map_entries;
const TSSymbolMetadata *symbol_metadata;
const TSSymbol *public_symbol_map;
const uint16_t *alias_map;
const TSSymbol *alias_sequences;
const TSLexMode *lex_modes;
bool (*lex_fn)(TSLexer *, TSStateId);
bool (*keyword_lex_fn)(TSLexer *, TSStateId);
TSSymbol keyword_capture_token;
struct {
const bool *states;
const TSSymbol *symbol_map;
void *(*create)(void);
void (*destroy)(void *);
bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);
unsigned (*serialize)(void *, char *);
void (*deserialize)(void *, const char *, unsigned);
} external_scanner;
};
/*
* Lexer Macros
*/
#define START_LEXER() \
bool result = false; \
bool skip = false; \
bool eof = false; \
int32_t lookahead; \
goto start; \
next_state: \
lexer->advance(lexer, skip); \
start: \
skip = false; \
lookahead = lexer->lookahead;
#define ADVANCE(state_value) \
{ \
state = state_value; \
goto next_state; \
}
#define SKIP(state_value) \
{ \
skip = true; \
state = state_value; \
goto next_state; \
}
#define ACCEPT_TOKEN(symbol_value) \
result = true; \
lexer->result_symbol = symbol_value; \
lexer->mark_end(lexer);
#define END_STATE() return result;
/*
* Parse Table Macros
*/
#define SMALL_STATE(id) id - LARGE_STATE_COUNT
#define STATE(id) id
#define ACTIONS(id) id
#define SHIFT(state_value) \
{{ \
.shift = { \
.type = TSParseActionTypeShift, \
.state = state_value \
} \
}}
#define SHIFT_REPEAT(state_value) \
{{ \
.shift = { \
.type = TSParseActionTypeShift, \
.state = state_value, \
.repetition = true \
} \
}}
#define SHIFT_EXTRA() \
{{ \
.shift = { \
.type = TSParseActionTypeShift, \
.extra = true \
} \
}}
#define REDUCE(symbol_val, child_count_val, ...) \
{{ \
.reduce = { \
.type = TSParseActionTypeReduce, \
.symbol = symbol_val, \
.child_count = child_count_val, \
__VA_ARGS__ \
}, \
}}
#define RECOVER() \
{{ \
.type = TSParseActionTypeRecover \
}}
#define ACCEPT_INPUT() \
{{ \
.type = TSParseActionTypeAccept \
}}
#ifdef __cplusplus
}
#endif
#endif // TREE_SITTER_PARSER_H_

File diff suppressed because it is too large Load Diff