Unvendor tree-sitter-devicetree

pull/893/head^2
Antonin Delpeuch 2025-10-06 21:52:58 +07:00 committed by Wilfred Hughes
parent 5c7dc03109
commit 35f63d1015
47 changed files with 16 additions and 45713 deletions

@ -2,7 +2,7 @@
### Parsing
Added support for protocol buffer files. Updated CMake, Solidity, HCL, Dart and R parsers.
Added support for protocol buffer files. Updated CMake, Solidity, HCL, Dart, Devicetree and R parsers.
### Display

11
Cargo.lock generated

@ -282,6 +282,7 @@ dependencies = [
"tree-sitter-cpp",
"tree-sitter-css",
"tree-sitter-dart-orchard",
"tree-sitter-devicetree",
"tree-sitter-elixir",
"tree-sitter-erlang",
"tree-sitter-fsharp",
@ -1082,6 +1083,16 @@ dependencies = [
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-devicetree"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1e6874b59d8252cbaf9750f7152166e17ed162921a5f6d4e8bd2a2bc2aed46b"
dependencies = [
"cc",
"tree-sitter-language",
]
[[package]]
name = "tree-sitter-elixir"
version = "0.3.4"

@ -83,6 +83,7 @@ tree-sitter-cmake = "0.7.1"
tree-sitter-cpp = "0.23.4"
tree-sitter-css = "0.23.1"
tree-sitter-dart-orchard = "0.2.1"
tree-sitter-devicetree = "0.14.1"
tree-sitter-elixir = "0.3.4"
tree-sitter-erlang = "0.13.0"
tree-sitter-fsharp = "0.1.0"

@ -82,11 +82,6 @@ fn main() {
src_dir: "vendored_parsers/tree-sitter-commonlisp-src",
extra_files: vec![],
},
TreeSitterParser {
name: "tree-sitter-devicetree",
src_dir: "vendored_parsers/tree-sitter-devicetree-src",
extra_files: vec![],
},
TreeSitterParser {
name: "tree-sitter-elisp",
src_dir: "vendored_parsers/tree-sitter-elisp-src",

@ -56,7 +56,7 @@ sample_files/dart_1.dart sample_files/dart_2.dart
107d073c2922ff14e9ba66ee0f489592 -
sample_files/devicetree_1.dts sample_files/devicetree_2.dts
f7c4e7b4444b02d87b2eec1485d86211 -
7ab2bd26334b6729a481665e5566cf97 -
sample_files/elisp_1.el sample_files/elisp_2.el
d7bdaf5f87e1c44475774c6e7ba70822 -

@ -73,7 +73,6 @@ extern "C" {
fn tree_sitter_apex() -> ts::Language;
fn tree_sitter_clojure() -> ts::Language;
fn tree_sitter_commonlisp() -> ts::Language;
fn tree_sitter_devicetree() -> ts::Language;
fn tree_sitter_elisp() -> ts::Language;
fn tree_sitter_elm() -> ts::Language;
fn tree_sitter_elvish() -> ts::Language;
@ -290,7 +289,8 @@ pub(crate) fn from_language(language: guess::Language) -> TreeSitterConfig {
}
}
DeviceTree => {
let language = unsafe { tree_sitter_devicetree() };
let language_fn = tree_sitter_devicetree::LANGUAGE;
let language = tree_sitter::Language::new(language_fn);
TreeSitterConfig {
language: language.clone(),
atom_nodes: ["byte_string_literal", "string_literal"]

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

@ -1,6 +0,0 @@
root = true
[*.js]
charset = utf-8
indent_style = tab
indent_size = 4

@ -1,15 +0,0 @@
{
"env": {
"commonjs": true,
"es2021": true
},
"extends": ["eslint:recommended", "prettier"],
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"rules": {
"no-undef": "off",
"no-unused-vars": ["error", { "args": "none" }]
}
}

@ -1,28 +0,0 @@
name: CI
on:
workflow_dispatch:
push:
branches:
- main
pull_request:
branches:
- '**'
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: true
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
node-version: [lts/*]
steps:
# https://github.com/nodejs/node-gyp/issues/2869
- name: Install distutils
run: python3 -m pip install setuptools
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm test

@ -1,21 +0,0 @@
name: Lint
on:
push:
branches:
- main
pull_request:
branches:
- '**'
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install modules
run: npm install
- name: Run Prettier
run: npm run prettier:check
- name: Run ESLint
run: npm run lint

@ -1,36 +0,0 @@
name: Release
on:
push:
tags:
- '*'
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
strategy:
matrix:
node-version: [lts/*]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- name: build
run: npm run build:wasm
- name: release
uses: softprops/action-gh-release@v1
with:
fail_on_unmatched_files: true
generate_release_notes: true
files: |
*.wasm

@ -1,11 +0,0 @@
build
node_modules
target
Cargo.lock
parser.exp
parser.lib
parser.obj
*.log
*.html
*.wasm

@ -1,3 +0,0 @@
/build
/examples
/test

@ -1,3 +0,0 @@
# Generated files
bindings
src

@ -1,15 +0,0 @@
{
"trailingComma": "es5",
"tabWidth": 4,
"semi": true,
"singleQuote": true,
"endOfLine": "auto",
"overrides": [
{
"files": ["*.json", "*.yml", "*.yaml"],
"options": {
"tabWidth": 2
}
}
]
}

@ -1,3 +0,0 @@
{
"recommendations": ["esbenp.prettier-vscode"]
}

@ -1,18 +0,0 @@
{
"[javascript]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json][jsonc]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[yml][github-actions-workflow]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}

@ -1,15 +0,0 @@
{
"tasks": [
{
"type": "npm",
"script": "build",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": [],
"label": "npm: build",
"detail": "tree-sitter generate"
}
]
}

@ -1,40 +0,0 @@
# Changelog
## v0.8.0
- Added `name` property to `/delete-node/` and `/delete-property/`.
- Added support for preprocessor commands inside nodes.
## v0.7.1
- Updated to tree-sitter v0.20.8.
## v0.6.0
- Updated to tree-sitter v0.20.7
- `property` node's `value` field no longer includes the `=` token.
- Added support for more devicetree features:
- `/plugin/`
- `/omit-if-no-ref/`
- `/bits/`
- `/incbin/`
## v0.5.0
- Updated to tree-sitter v0.20.6
## v0.4.0
- Updated to tree-sitter v0.19.4
## v0.3.0
- Fixed commas not being allowed in node addresses.
## v0.2.0
- Fixed references not being allowed as node names.
## v0.1.0
- Initial release

@ -1,26 +0,0 @@
[package]
name = "tree-sitter-devicetree"
description = "devicetree grammar for the tree-sitter parsing library"
version = "0.4.0"
keywords = ["incremental", "parsing", "devicetree"]
categories = ["parsing", "text-editors"]
repository = "https://github.com/joelspadin/tree-sitter-devicetree"
edition = "2018"
license = "MIT"
build = "bindings/rust/build.rs"
include = [
"bindings/rust/*",
"grammar.js",
"queries/*",
"src/*",
]
[lib]
path = "bindings/rust/lib.rs"
[dependencies]
tree-sitter = ">= 0.19, < 0.21"
[build-dependencies]
cc = "1.0"

@ -1,21 +0,0 @@
The MIT License (MIT)
Copyright (c) 2020 Joel Spadin
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,7 +0,0 @@
# tree-sitter-devicetree
A [tree-sitter](https://github.com/tree-sitter/tree-sitter) grammar for Devicetree
with support for [Zephyr's](https://github.com/zephyrproject-rtos/zephyr)
superset of Devicetree syntax.
Some parts of the grammar are adapted from [tree-sitter-c](https://github.com/tree-sitter/tree-sitter-c).

@ -1,18 +0,0 @@
{
"targets": [
{
"target_name": "tree_sitter_devicetree_binding",
"include_dirs": [
"<!(node -e \"require('nan')\")",
"src"
],
"sources": [
"src/parser.c",
"bindings/node/binding.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_devicetree();
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_devicetree());
Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("devicetree").ToLocalChecked());
Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance);
}
NODE_MODULE(tree_sitter_devicetree_binding, Init)
} // namespace

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

@ -1,40 +0,0 @@
fn main() {
let src_dir = std::path::Path::new("src");
let mut c_config = cc::Build::new();
c_config.include(&src_dir);
c_config
.flag_if_supported("-Wno-unused-parameter")
.flag_if_supported("-Wno-unused-but-set-variable")
.flag_if_supported("-Wno-trigraphs");
let parser_path = src_dir.join("parser.c");
c_config.file(&parser_path);
// If your language uses an external scanner written in C,
// then include this block of code:
/*
let scanner_path = src_dir.join("scanner.c");
c_config.file(&scanner_path);
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
*/
c_config.compile("parser");
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
// If your language uses an external scanner written in C++,
// then include this block of code:
/*
let mut cpp_config = cc::Build::new();
cpp_config.cpp(true);
cpp_config.include(&src_dir);
cpp_config
.flag_if_supported("-Wno-unused-parameter")
.flag_if_supported("-Wno-unused-but-set-variable");
let scanner_path = src_dir.join("scanner.cc");
cpp_config.file(&scanner_path);
cpp_config.compile("scanner");
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
*/
}

@ -1,52 +0,0 @@
//! This crate provides devicetree language support for the [tree-sitter][] parsing library.
//!
//! Typically, you will use the [language][language func] function to add this language to a
//! tree-sitter [Parser][], and then use the parser to parse some code:
//!
//! ```
//! let code = "";
//! let mut parser = tree_sitter::Parser::new();
//! parser.set_language(tree_sitter_devicetree::language()).expect("Error loading devicetree grammar");
//! let tree = parser.parse(code, None).unwrap();
//! ```
//!
//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
//! [language func]: fn.language.html
//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html
//! [tree-sitter]: https://tree-sitter.github.io/
use tree_sitter::Language;
extern "C" {
fn tree_sitter_devicetree() -> Language;
}
/// Get the tree-sitter [Language][] for this grammar.
///
/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
pub fn language() -> Language {
unsafe { tree_sitter_devicetree() }
}
/// The content of the [`node-types.json`][] file for this grammar.
///
/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json");
// Uncomment these to include any queries that this grammar contains
// pub const HIGHLIGHTS_QUERY: &'static str = include_str!("../../queries/highlights.scm");
// pub const INJECTIONS_QUERY: &'static str = include_str!("../../queries/injections.scm");
// pub const LOCALS_QUERY: &'static str = include_str!("../../queries/locals.scm");
// pub const TAGS_QUERY: &'static str = include_str!("../../queries/tags.scm");
#[cfg(test)]
mod tests {
#[test]
fn test_can_load_grammar() {
let mut parser = tree_sitter::Parser::new();
parser
.set_language(super::language())
.expect("Error loading devicetree language");
}
}

@ -1,592 +0,0 @@
/**
* Based in part on:
*
* https://github.com/tree-sitter/tree-sitter-c
* MIT license, Copyright (c) 2014 Max Brunsfeld
*
* https://github.com/zephyrproject-rtos/python-devicetree/tree/main
* BSD 3-Clause license, Copyright (c) 2019, Nordic Semiconductor
*/
/// <reference types="tree-sitter-cli/dsl" />
// @ts-check
const PREC = {
PAREN_DECLARATOR: -10,
ASSIGNMENT: -1,
CONDITIONAL: -2,
DEFAULT: 0,
LOGICAL_OR: 1,
LOGICAL_AND: 2,
INCLUSIVE_OR: 3,
EXCLUSIVE_OR: 4,
BITWISE_AND: 5,
EQUAL: 6,
RELATIONAL: 7,
SIZEOF: 8,
SHIFT: 9,
ADD: 10,
MULTIPLY: 11,
CAST: 12,
UNARY: 13,
CALL: 14,
FIELD: 15,
SUBSCRIPT: 16,
};
module.exports = grammar({
name: 'devicetree',
extras: ($) => [/\s|\\\r?\n/, $.comment],
inline: ($) => [
$.node_identifier,
$.label_identifier,
$.property_identifier,
$.parenthesized_expression,
],
rules: {
document: ($) => repeat($._top_level_item),
_top_level_item: ($) =>
choice(
$.file_version,
$.plugin,
$.memory_reservation,
$.omit_if_no_ref,
$.node,
$.dtsi_include,
$.preproc_include,
$.preproc_def,
$.preproc_function_def,
$.preproc_if,
$.preproc_ifdef,
$.preproc_undef
),
_label: ($) => seq(field('label', $.label_identifier), ':'),
file_version: ($) => seq('/dts-v1/', ';'),
plugin: ($) => seq('/plugin/', ';'),
memory_reservation: ($) =>
seq(
repeat($._label),
'/memreserve/',
field('address', $.integer_literal),
field('length', $.integer_literal),
';'
),
// http://stackoverflow.com/questions/13014947/regex-to-match-a-c-style-multiline-comment/36328890#36328890
comment: ($) =>
token(
choice(
seq('//', /(\\(.|\r?\n)|[^\\\n])*/),
seq('/*', /[^*]*\*+([^/*][^*]*\*+)*/, '/')
)
),
_label_name: ($) => /[a-zA-Z_][0-9a-zA-Z_]*/,
_node_path: ($) => /\/[0-9a-zA-Z/,._+-]*/,
_node_or_property: ($) => /[a-zA-Z][0-9a-zA-Z,._+-]*/,
_property_with_hash: ($) => /[#0-9a-zA-Z,._+-]*#[#0-9a-zA-Z,._+-]*/,
_property_starts_with_number: ($) => /[0-9][#0-9a-zA-Z,._+-]*/,
unit_address: ($) => /[0-9a-zA-Z,._+-]+/,
label_identifier: ($) => alias($._label_name, $.identifier),
node_identifier: ($) =>
alias(
choice($._node_or_property, $._node_path, $._label_name),
$.identifier
),
property_identifier: ($) =>
alias(
choice(
$._node_or_property,
$._property_with_hash,
$._property_starts_with_number,
$._label_name
),
$.identifier
),
reference: ($) => choice($._label_reference, $._node_reference),
_label_reference: ($) => seq('&', field('label', $.label_identifier)),
_node_reference: ($) =>
seq(
'&{',
field('path', $.node_identifier),
field('address', optional(seq('@', $.unit_address))),
'}'
),
omit_if_no_ref: ($) =>
seq('/omit-if-no-ref/', choice($.node, seq($.reference, ';'))),
node: ($) =>
seq(
repeat($._label),
choice(
field('name', $.reference),
seq(
field('name', $.node_identifier),
field('address', optional(seq('@', $.unit_address)))
)
),
'{',
repeat($._node_members),
'}',
';'
),
_bits: ($) => seq('/bits/', $.integer_literal),
property: ($) =>
seq(
repeat($._label),
field('name', $.property_identifier),
optional(
seq(
'=',
field('bits', optional($._bits)),
field('value', commaSep($._property_value))
)
),
';'
),
_node_members: ($) =>
choice(
$.delete_property,
$.delete_node,
$.omit_if_no_ref,
$.node,
$.property,
$.preproc_include,
$.preproc_def,
$.preproc_function_def,
alias($.preproc_if_in_node, $.preproc_if),
alias($.preproc_ifdef_in_node, $.preproc_ifdef),
$.preproc_undef
),
// TODO: is delete-node allowed at top level?
delete_node: ($) =>
seq(
'/delete-node/',
field('name', choice($.node_identifier, $.reference)),
';'
),
delete_property: ($) =>
seq('/delete-property/', field('name', $.property_identifier), ';'),
incbin: ($) =>
seq(
'/incbin/',
'(',
field('filename', $.string_literal),
optional(
seq(
',',
field('offset', $._integer_cell_items),
',',
field('size', $._integer_cell_items)
)
),
')'
),
// TODO: labels can appear before or after any component of a property value,
// or between cells of a cell array, or between bytes of a bytestring.
_property_value: ($) =>
choice(
$.integer_cells,
$.string_literal,
$.byte_string_literal,
$.reference,
$.incbin
),
integer_cells: ($) => seq('<', repeat($._integer_cell_items), '>'),
_integer_cell_items: ($) =>
choice(
$.integer_literal,
$.reference,
$.parenthesized_expression,
$.identifier,
$.call_expression
),
string_literal: ($) =>
seq(
'"',
repeat(
choice(
token.immediate(prec(1, /[^\\"\n]+/)),
$.escape_sequence
)
),
'"'
),
escape_sequence: ($) =>
token(
prec(
1,
seq(
'\\',
choice(
/[^xuU]/,
/\d{2,3}/,
/x[0-9a-fA-F]{2,}/,
/u[0-9a-fA-F]{4}/,
/U[0-9a-fA-F]{8}/
)
)
)
),
system_lib_string: ($) =>
token(seq('<', repeat(choice(/[^>\n]/, '\\>')), '>')),
byte_string_literal: ($) => seq('[', repeat($._byte_string_item), ']'),
_byte_string_item: ($) => /[0-9a-fA-F]+/,
integer_literal: ($) => {
const separator = "'";
const hex = /[0-9a-fA-F]/;
const decimal = /[0-9]/;
const hexDigits = seq(
repeat1(hex),
repeat(seq(separator, repeat1(hex)))
);
const decimalDigits = seq(
repeat1(decimal),
repeat(seq(separator, repeat1(decimal)))
);
return token(
choice(
decimalDigits,
seq('0b', decimalDigits),
seq('0x', hexDigits)
)
);
},
identifier: ($) => /[a-zA-Z_]\w*/,
_expression: ($) =>
choice(
$.conditional_expression,
$.binary_expression,
$.unary_expression,
$.call_expression,
$.identifier,
$.integer_literal,
$.parenthesized_expression
),
parenthesized_expression: ($) => seq('(', $._expression, ')'),
call_expression: ($) =>
prec(
PREC.CALL,
seq(
field('function', $.identifier),
field('arguments', $.argument_list)
)
),
argument_list: ($) => seq('(', commaSep($._expression), ')'),
conditional_expression: ($) =>
prec.right(
PREC.CONDITIONAL,
seq(
field('condition', $._expression),
'?',
field('consequence', $._expression),
':',
field('alternative', $._expression)
)
),
unary_expression: ($) =>
prec.left(
PREC.UNARY,
seq(
field('operator', choice('!', '~', '-', '+')),
field('argument', $._expression)
)
),
binary_expression: ($) => {
/** @type {[string, number][]} */
const table = [
['+', PREC.ADD],
['-', PREC.ADD],
['*', PREC.MULTIPLY],
['/', PREC.MULTIPLY],
['%', PREC.MULTIPLY],
['||', PREC.LOGICAL_OR],
['&&', PREC.LOGICAL_AND],
['|', PREC.INCLUSIVE_OR],
['^', PREC.EXCLUSIVE_OR],
['&', PREC.BITWISE_AND],
['==', PREC.EQUAL],
['!=', PREC.EQUAL],
['>', PREC.RELATIONAL],
['>=', PREC.RELATIONAL],
['<=', PREC.RELATIONAL],
['<', PREC.RELATIONAL],
['<<', PREC.SHIFT],
['>>', PREC.SHIFT],
];
return choice(
...table.map(([operator, precedence]) => {
return prec.left(
precedence,
seq(
field('left', $._expression),
field('operator', operator),
field('right', $._expression)
)
);
})
);
},
dtsi_include: ($) => seq('/include/', field('path', $.string_literal)),
preproc_include: ($) =>
seq(
preprocessor('include'),
field(
'path',
choice($.string_literal, $.system_lib_string, $.identifier)
),
token.immediate(/\r?\n/)
),
preproc_def: ($) =>
seq(
preprocessor('define'),
field('name', $.identifier),
field('value', optional($.preproc_arg)),
token.immediate(/\r?\n/)
),
preproc_function_def: ($) =>
seq(
preprocessor('define'),
field('name', $.identifier),
field('parameters', $.preproc_params),
field('value', optional($.preproc_arg)),
token.immediate(/\r?\n/)
),
preproc_params: ($) =>
seq(
token.immediate('('),
commaSep(choice($.identifier, '...')),
')'
),
preproc_undef: ($) =>
seq(
preprocessor('undef'),
field('name', $.identifier),
token.immediate(/\r?\n/)
),
preproc_arg: ($) => token(prec(-1, repeat1(/.|\\\r?\n/))),
...preprocIf('', ($) => $._top_level_item),
...preprocIf('_in_node', ($) => $._node_members),
_preproc_expression: ($) =>
choice(
$.identifier,
alias($.preproc_call_expression, $.call_expression),
$.integer_literal,
$.preproc_defined,
alias($.preproc_unary_expression, $.unary_expression),
alias($.preproc_binary_expression, $.binary_expression),
alias(
$.preproc_parenthesized_expression,
$.parenthesized_expression
)
),
preproc_parenthesized_expression: ($) =>
seq('(', $._preproc_expression, ')'),
preproc_defined: ($) =>
choice(
prec(PREC.CALL, seq('defined', '(', $.identifier, ')')),
seq('defined', $.identifier)
),
preproc_unary_expression: ($) =>
prec.left(
PREC.UNARY,
seq(
field('operator', choice('!', '~', '-', '+')),
field('argument', $._preproc_expression)
)
),
preproc_call_expression: ($) =>
prec(
PREC.CALL,
seq(
field('function', $.identifier),
field(
'arguments',
alias($.preproc_argument_list, $.argument_list)
)
)
),
preproc_argument_list: ($) =>
seq('(', commaSep($._preproc_expression), ')'),
preproc_binary_expression: ($) => {
const table = [
['+', PREC.ADD],
['-', PREC.ADD],
['*', PREC.MULTIPLY],
['/', PREC.MULTIPLY],
['%', PREC.MULTIPLY],
['||', PREC.LOGICAL_OR],
['&&', PREC.LOGICAL_AND],
['|', PREC.INCLUSIVE_OR],
['^', PREC.EXCLUSIVE_OR],
['&', PREC.BITWISE_AND],
['==', PREC.EQUAL],
['!=', PREC.EQUAL],
['>', PREC.RELATIONAL],
['>=', PREC.RELATIONAL],
['<=', PREC.RELATIONAL],
['<', PREC.RELATIONAL],
['<<', PREC.SHIFT],
['>>', PREC.SHIFT],
];
return choice(
...table.map(([operator, precedence]) => {
return prec.left(
precedence,
seq(
field('left', $._preproc_expression),
// @ts-ignore
field('operator', operator),
field('right', $._preproc_expression)
)
);
})
);
},
},
});
/**
* @param {string} command
*/
function preprocessor(command) {
return alias(
token(prec(2, new RegExp('#[ \t]*' + command))),
'#' + command
);
}
/**
* @param {RuleOrLiteral} rule
*/
function commaSep(rule) {
return optional(commaSep1(rule));
}
/**
* @param {RuleOrLiteral} rule
*/
function commaSep1(rule) {
return seq(rule, repeat(seq(',', rule)));
}
/**
* @param {string} suffix
* @param {RuleBuilder<string>} content
* @returns {RuleBuilders<string, string>}
*/
function preprocIf(suffix, content) {
/**
* @param {GrammarSymbols<string>} $
* @returns {ChoiceRule}
*/
function elseBlock($) {
return choice(
suffix
? alias($['preproc_else' + suffix], $.preproc_else)
: $.preproc_else,
suffix
? alias($['preproc_elif' + suffix], $.preproc_elif)
: $.preproc_elif
);
}
return {
['preproc_if' + suffix]: ($) =>
seq(
preprocessor('if'),
field('condition', $._preproc_expression),
'\n',
repeat(content($)),
field('alternative', optional(elseBlock($))),
preprocessor('endif')
),
['preproc_ifdef' + suffix]: ($) =>
seq(
choice(preprocessor('ifdef'), preprocessor('ifndef')),
field('name', $.identifier),
repeat(content($)),
field(
'alternative',
optional(choice(elseBlock($), $.preproc_elifdef))
),
preprocessor('endif')
),
['preproc_else' + suffix]: ($) =>
seq(preprocessor('else'), repeat(content($))),
['preproc_elif' + suffix]: ($) =>
seq(
preprocessor('elif'),
field('condition', $._preproc_expression),
'\n',
repeat(content($)),
field('alternative', optional(elseBlock($)))
),
['preproc_elifdef' + suffix]: ($) =>
seq(
choice(preprocessor('elifdef'), preprocessor('elifndef')),
field('name', $.identifier),
repeat(content($)),
field('alternative', optional(elseBlock($)))
),
};
}

File diff suppressed because it is too large Load Diff

@ -1,36 +0,0 @@
{
"name": "tree-sitter-devicetree",
"version": "0.9.0",
"description": "Tree-sitter parser for Devicetree files, with support for Zephyr's superset of Devicetree syntax.",
"main": "bindings/node",
"scripts": {
"build": "tree-sitter generate && node-gyp build",
"test": "tree-sitter test",
"lint": "eslint grammar.js",
"build:wasm": "tree-sitter build-wasm",
"prettier:check": "prettier --check .",
"prettier:format": "prettier --write ."
},
"author": "Joel Spadin",
"license": "MIT",
"dependencies": {
"nan": "^2.18.0"
},
"devDependencies": {
"eslint": "^8.54.0",
"eslint-config-prettier": "^9.0.0",
"prettier": "^3.1.0",
"tree-sitter-cli": "^0.20.8"
},
"tree-sitter": [
{
"scope": "source.devicetree",
"file-types": [
"dts",
"dtsi",
"overlay"
],
"injection-regex": "^(dts|devicetree)$"
}
]
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,224 +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 * const *symbol_names;
const char * const *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;
const TSStateId *primary_state_ids;
};
/*
* 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_

@ -1,41 +0,0 @@
========================================================================
Node addresses
========================================================================
/ {
foo@0123456789 {};
bar@abcdef {};
baz@ABCDEF {};
fred@1,0 {};
prop = <&{/bar@abcdef}>;
};
---
(document
(node
name: (identifier)
(node
name: (identifier)
address: (unit_address))
(node
name: (identifier)
address: (unit_address))
(node
name: (identifier)
address: (unit_address))
(node
name: (identifier)
address: (unit_address))
(property
name: (identifier)
value: (integer_cells
(reference
path: (identifier)
address: (unit_address)
)
)
)
)
)

@ -1,48 +0,0 @@
========================================================================
Delete nodes
========================================================================
/ {
foo: bar {};
/delete-node/ bar;
/delete-node/ &foo;
};
---
(document
(node
name: (identifier)
(node
label: (identifier)
name: (identifier)
)
(delete_node
name: (identifier))
(delete_node
name: (reference label: (identifier)))
)
)
========================================================================
Delete properties
========================================================================
/ {
baz = "baz";
/delete-property/ baz;
};
---
(document
(node
name: (identifier)
(property
name: (identifier)
value: (string_literal))
(delete_property
name: (identifier))
)
)

@ -1,65 +0,0 @@
========================================================================
Document Version
========================================================================
/dts-v1/;
/ {};
---
(document
(file_version)
(node
name: (identifier)
)
)
========================================================================
Plugin
========================================================================
/dts-v1/;
/plugin/;
/ {};
---
(document
(file_version)
(plugin)
(node
name: (identifier)
)
)
========================================================================
Include
========================================================================
/include/ "file.dtsi"
---
(document
(dtsi_include
path: (string_literal)
)
)
========================================================================
Memreserve
========================================================================
/memreserve/ 0x0000 0x1000;
---
(document
(memory_reservation
address: (integer_literal)
length: (integer_literal)
)
)

@ -1,67 +0,0 @@
========================================================================
Property value expressions
========================================================================
/ {
a = <17 0xc>;
b = <(1 + 2) (3 - 4 * 5) (6 / 7 % 8)>;
c = <((4 ^ ~5) << 5)>;
f = <(8 ? 9 : 10)>;
};
---
(document
(node
name: (identifier)
(property
name: (identifier)
value: (integer_cells (integer_literal) (integer_literal))
)
(property
name: (identifier)
value: (integer_cells
(binary_expression
left: (integer_literal)
right: (integer_literal)
)
(binary_expression
left: (integer_literal)
right: (binary_expression
left: (integer_literal)
right: (integer_literal)
)
)
(binary_expression
left: (binary_expression
left: (integer_literal)
right: (integer_literal)
)
right: (integer_literal)
)
)
)
(property
name: (identifier)
value: (integer_cells
(binary_expression
left: (binary_expression
left: (integer_literal)
right: (unary_expression argument: (integer_literal))
)
right: (integer_literal)
)
)
)
(property
name: (identifier)
value: (integer_cells
(conditional_expression
condition: (integer_literal)
consequence: (integer_literal)
alternative: (integer_literal)
)
)
)
)
)

@ -1,123 +0,0 @@
========================================================================
ZMK keymap
========================================================================
//https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/kyria/kyria.keymap
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
/ {
keymap {
compatible = "zmk,keymap";
default_layer {
// ---------------------------------------------------------------------------------------------------------------------------------
// | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ |
// | TAB | A | S | D | F | G | | H | J | K | L | ; | ' |
// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL |
// | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT |
bindings = <
&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH
&kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SCLN &kp QUOT
&kp LSFT &kp Z &kp X &kp C &kp V &kp B &kp LSFT &kp LSFT &kp LSFT &kp LSFT &kp N &kp M &kp CMMA &kp DOT &kp FSLH &kp RCTL
&kp LGUI &kp DEL &kp RET &kp SPC &kp ESC &kp RET &kp SPC &kp TAB &kp BKSP &kp RALT
>;
sensor-bindings = <&inc_dec_kp M_VOLU M_VOLD &inc_dec_kp PGUP PGDN>;
};
};
};
---
(document
(comment)
(comment)
(preproc_include path: (system_lib_string))
(preproc_include path: (system_lib_string))
(node
name: (identifier)
(node
name: (identifier)
(property name: (identifier) value: (string_literal))
(node
name: (identifier)
(comment)
(comment)
(comment)
(comment)
(comment)
(property
name: (identifier)
value: (integer_cells
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
(reference label: (identifier)) (identifier)
)
)
(property
name: (identifier)
value: (integer_cells
(reference label: (identifier)) (identifier) (identifier)
(reference label: (identifier)) (identifier) (identifier)
)
)
)
)
)
)

@ -1,122 +0,0 @@
========================================================================
Top-level label
========================================================================
label: node {};
---
(document
(node
label: (identifier)
name: (identifier)
)
)
========================================================================
Multiple labels
========================================================================
foo: bar: baz: qux: node {};
---
(document
(node
label: (identifier)
label: (identifier)
label: (identifier)
label: (identifier)
name: (identifier)
)
)
========================================================================
Labeled child node
========================================================================
/ {
label: node-name@deadbeef {};
};
---
(document
(node
name: (identifier)
(node
label: (identifier)
name: (identifier)
address: (unit_address)
)
)
)
========================================================================
Labeled node reference
========================================================================
foo: &bar {};
foo: &{/bar@deadbeef} {};
---
(document
(node
label: (identifier)
name: (reference
label: (identifier)
)
)
(node
label: (identifier)
name: (reference
path: (identifier)
address: (unit_address)
)
)
)
========================================================================
Labeled property
========================================================================
/ {
foo: foo = <1>;
bar: bar;
};
---
(document
(node
name: (identifier)
(property
label: (identifier)
name: (identifier)
value: (integer_cells (integer_literal))
)
(property
label: (identifier)
name: (identifier)
)
)
)
========================================================================
Labeled memreserve
========================================================================
mem1: mem2: /memreserve/ 0x0000 0x1000;
---
(document
(memory_reservation
label: (identifier)
label: (identifier)
address: (integer_literal)
length: (integer_literal)
)
)

@ -1,65 +0,0 @@
========================================================================
Top-level nodes
========================================================================
/ {};
&foo {};
---
(document
(node name: (identifier))
(node name: (reference label: (identifier)))
)
========================================================================
Child nodes
========================================================================
/ {
foo {
bar {};
};
baz {};
};
---
(document
(node name: (identifier)
(node name: (identifier)
(node name: (identifier))
)
(node name: (identifier))
)
)
========================================================================
Node addresses
========================================================================
/ {
foo@12345678 {};
bar@deadbeef,abcd1234 {};
baz@xyz-abc_123+456.789 {};
};
---
(document
(node name: (identifier)
(node
name: (identifier)
address: (unit_address)
)
(node
name: (identifier)
address: (unit_address)
)
(node
name: (identifier)
address: (unit_address)
)
)
)

@ -1,56 +0,0 @@
========================================================================
Omit Node
========================================================================
/ {
/omit-if-no-ref/ child {};
};
---
(document
(node
name: (identifier)
(omit_if_no_ref
(node name: (identifier))
)
)
)
========================================================================
Omit Labeled Node
========================================================================
/ {
/omit-if-no-ref/ label: child {};
};
---
(document
(node
name: (identifier)
(omit_if_no_ref
(node
label: (identifier)
name: (identifier)
)
)
)
)
========================================================================
Omit Reference
========================================================================
/omit-if-no-ref/ &node;
---
(document
(omit_if_no_ref
(reference
label: (identifier)
)
)
)

@ -1,340 +0,0 @@
========================================================================
Preprocessor include
========================================================================
#include "foo.h"
#include <bar.h>
# include "baz.dtsi"
# include <baz.dtsi>
---
(document
(preproc_include path: (string_literal))
(preproc_include path: (system_lib_string))
(preproc_include path: (string_literal))
(preproc_include path: (system_lib_string))
)
========================================================================
Preprocessor define
========================================================================
#define FOO 0
#define BAR(x) (x & 0x01)
#undef FOO
---
(document
(preproc_def
name: (identifier)
value: (preproc_arg)
)
(preproc_function_def
name: (identifier)
parameters: (preproc_params
(identifier)
)
value: (preproc_arg)
)
(preproc_undef
name: (identifier)
)
)
================================================================================
Ifdefs
================================================================================
#ifndef DEFINE1
/ {};
#endif
#ifdef DEFINE2
/ {};
#define c 32
#elif defined DEFINE3
#else
/ {};
#define c 16
#endif
#ifdef DEFINE2
#else
# ifdef DEFINE3
# else
# endif
#endif
---
(document
(preproc_ifdef
name: (identifier)
(node
name: (identifier)
)
)
(preproc_ifdef
name: (identifier)
(node
name: (identifier)
)
(preproc_def
name: (identifier)
value: (preproc_arg)
)
alternative: (preproc_elif
condition: (preproc_defined
(identifier)
)
alternative: (preproc_else
(node
name: (identifier)
)
(preproc_def
name: (identifier)
value: (preproc_arg)
)
)
)
)
(preproc_ifdef
name: (identifier)
alternative: (preproc_else
(preproc_ifdef
name: (identifier)
alternative: (preproc_else)
)
)
)
)
================================================================================
Elifdefs
================================================================================
#ifndef DEFINE1
/ {};
#elifndef DEFINE2
/ {};
#endif
#ifdef DEFINE2
/ {};
#elifdef DEFINE3
/ {};
#else
/ {};
#endif
---
(document
(preproc_ifdef
(identifier)
(node (identifier))
(preproc_elifdef
(identifier)
(node (identifier))
)
)
(preproc_ifdef
(identifier)
(node (identifier))
(preproc_elifdef
(identifier)
(node (identifier))
(preproc_else
(node (identifier))
)
)
)
)
========================================================================
Macro expressions
========================================================================
/ {
value = <FOO FUNC(FOO, BAR) LS(LC(A))>;
};
---
(document
(node
name: (identifier)
(property
name: (identifier)
value: (integer_cells
(identifier)
(call_expression
function: (identifier)
arguments: (argument_list
(identifier)
(identifier)
)
)
(call_expression
function: (identifier)
arguments: (argument_list (call_expression
function: (identifier)
arguments: (argument_list (identifier))
))
)
)
)
)
)
========================================================================
Preprocessor directives in node
========================================================================
/ {
#include "macros.dtsi"
#define FOO 0
#ifdef FOO
value = <FOO>;
#endif
#ifndef BAR
value = <BAR>;
#endif
#undef FOO
};
---
(document
(node
name: (identifier)
(preproc_include path: (string_literal))
(preproc_def
name: (identifier)
value: (preproc_arg))
(preproc_ifdef
name: (identifier)
(property
name: (identifier)
value: (integer_cells
(identifier)
)
)
)
(preproc_ifdef
name: (identifier)
(property
name: (identifier)
value: (integer_cells
(identifier)
)
)
)
(preproc_undef
name: (identifier)
)
)
)
================================================================================
Preprocessor conditionals in functions
================================================================================
/ {
#if d
foo = "foo";
#else
bar = "bar";
#endif
#if a
baz = "baz";
#elif b
spam = "spam";
#else
eggs = "eggs";
#endif
};
---
(document
(node
(identifier)
(preproc_if
(identifier)
(property
(identifier)
(string_literal)
)
(preproc_else
(property
(identifier)
(string_literal)
)
)
)
(preproc_if
(identifier)
(property
(identifier)
(string_literal)
)
(preproc_elif
(identifier)
(property
(identifier)
(string_literal)
)
(preproc_else
(property
(identifier)
(string_literal)
)
)
)
)
)
)
================================================================================
Preprocessor expressions
================================================================================
#if A(B || C) && \
!D(F)
/ {};
#endif
---
(document
(preproc_if
(binary_expression
(call_expression
(identifier)
(argument_list
(binary_expression
(identifier)
(identifier)
)
)
)
(unary_expression
(call_expression
(identifier)
(argument_list
(identifier)
)
)
)
)
(node
(identifier)
)
)
)

@ -1,293 +0,0 @@
========================================================================
Name with hyphen
========================================================================
/ {
hyphenated-name = "";
};
---
(document
(node
name: (identifier)
(property name: (identifier) value: (string_literal))
)
)
========================================================================
Name with hash
========================================================================
/ {
#startswithhash = "";
hash#inmiddle = "";
endswithhash# = "";
#multiple#hashes# = "";
};
---
(document
(node
name: (identifier)
(property name: (identifier) value: (string_literal))
(property name: (identifier) value: (string_literal))
(property name: (identifier) value: (string_literal))
(property name: (identifier) value: (string_literal))
)
)
========================================================================
Name with comma
========================================================================
/ {
comma,separated = "";
};
---
(document
(node
name: (identifier)
(property name: (identifier) value: (string_literal))
)
)
========================================================================
Name with number
========================================================================
/ {
0startswithnumber = "";
number0inmiddle = "";
endswithnumber0 ="";
};
---
(document
(node
name: (identifier)
(property name: (identifier) value: (string_literal))
(property name: (identifier) value: (string_literal))
(property name: (identifier) value: (string_literal))
)
)
========================================================================
Empty
========================================================================
/ {
empty;
};
---
(document
(node
name: (identifier)
(property name: (identifier))
)
)
========================================================================
Integers
========================================================================
/ {
int = <0>;
list = <0 1 2>;
list_bits = /bits/ 8 <0x12 0x34>;
};
---
(document
(node
name: (identifier)
(property
name: (identifier)
value: (integer_cells (integer_literal))
)
(property
name: (identifier)
value: (integer_cells
(integer_literal) (integer_literal) (integer_literal)
)
)
(property
name: (identifier)
bits: (integer_literal)
value: (integer_cells
(integer_literal) (integer_literal)
)
)
)
)
========================================================================
Strings
========================================================================
/ {
string = "foo";
strings = "foo", "bar";
};
---
(document
(node
name: (identifier)
(property name: (identifier) value: (string_literal))
(property
name: (identifier)
value: (string_literal)
value: (string_literal)
)
)
)
========================================================================
Byte strings
========================================================================
/ {
bytes = [00 12 34];
bytes2 = [001234];
empty = [];
};
---
(document
(node
name: (identifier)
(property
name: (identifier)
value: (byte_string_literal)
)
(property
name: (identifier)
value: (byte_string_literal)
)
(property
name: (identifier)
value: (byte_string_literal)
)
)
)
========================================================================
References
========================================================================
/ {
ref = &foo;
phandle = <&foo>;
node = <&{/foo/bar/baz@40000}>;
};
---
(document
(node
name: (identifier)
(property
name: (identifier)
value: (reference label: (identifier))
)
(property
name: (identifier)
value: (integer_cells
(reference label: (identifier))
)
)
(property
name: (identifier)
value: (integer_cells
(reference
path: (identifier)
address: (unit_address)
)
)
)
)
)
========================================================================
Mixed values
========================================================================
/ {
mixed = <0 &foo>, [12 34], "baz";
};
---
(document
(node
name: (identifier)
(property
name: (identifier)
value: (integer_cells (integer_literal) (reference label: (identifier)))
value: (byte_string_literal)
value: (string_literal)
)
)
)
========================================================================
Incbin
========================================================================
/ {
data = /incbin/ ("file.bin");
data2 = /incbin/ ("file.bin", 0x10, 64);
data3 = /incbin/ ("file.bin", (1 + 2), MACRO(1, 2 + 3));
};
---
(document
(node
name: (identifier)
(property
name: (identifier)
value: (incbin
filename: (string_literal)
)
)
(property
name: (identifier)
value: (incbin
filename: (string_literal)
offset: (integer_literal)
size: (integer_literal)
)
)
(property
name: (identifier)
value: (incbin
filename: (string_literal)
offset: (binary_expression
left: (integer_literal)
right: (integer_literal)
)
size: (call_expression
function: (identifier)
arguments: (argument_list
(integer_literal)
(binary_expression
left: (integer_literal)
right: (integer_literal)
)
)
)
)
)
)
)

@ -1,91 +0,0 @@
========================================================================
Zephyr armv6-m.dtsi
========================================================================
/* https://github.com/zephyrproject-rtos/zephyr/blob/master/dts/arm/armv6-m.dtsi */
/* SPDX-License-Identifier: Apache-2.0 */
#include "skeleton.dtsi"
/ {
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
interrupt-parent = <&nvic>;
ranges;
nvic: interrupt-controller@e000e100 {
compatible = "arm,v6m-nvic";
reg = <0xe000e100 0xc00>;
interrupt-controller;
#interrupt-cells = <2>;
};
systick: timer@e000e010 {
compatible = "arm,armv6m-systick";
reg = <0xe000e010 0x10>;
};
};
};
---
(document
(comment)
(comment)
(preproc_include path: (string_literal))
(node
name: (identifier)
(node
name: (identifier)
(property
name: (identifier)
value: (integer_cells (integer_literal))
)
(property
name: (identifier)
value: (integer_cells (integer_literal))
)
(property
name: (identifier)
value: (string_literal)
)
(property
name: (identifier)
value: (integer_cells (reference label: (identifier)))
)
(property name: (identifier))
(node
label: (identifier)
name: (identifier)
address: (unit_address)
(property
name: (identifier)
value: (string_literal)
)
(property
name: (identifier)
value: (integer_cells (integer_literal) (integer_literal))
)
(property name: (identifier))
(property
name: (identifier)
value: (integer_cells (integer_literal))
)
)
(node
label: (identifier)
name: (identifier)
address: (unit_address)
(property
name: (identifier)
value: (string_literal)
)
(property
name: (identifier)
value: (integer_cells (integer_literal) (integer_literal))
)
)
)
)
)