mirror of https://github.com/Wilfred/difftastic/
Merge branch 'cmake'
commit
515932151f
@ -0,0 +1,128 @@
|
|||||||
|
;; Based on the nvim-treesitter highlighting, which is under the Apache license.
|
||||||
|
;; https://github.com/nvim-treesitter/nvim-treesitter/blob/d76b0de6536c2461f97cfeca0550f8cb89793935/queries/cmake/highlights.scm
|
||||||
|
|
||||||
|
[
|
||||||
|
(quoted_argument)
|
||||||
|
(bracket_argument)
|
||||||
|
] @string
|
||||||
|
|
||||||
|
(variable_ref) @none
|
||||||
|
(variable) @variable
|
||||||
|
|
||||||
|
[
|
||||||
|
(bracket_comment)
|
||||||
|
(line_comment)
|
||||||
|
] @comment
|
||||||
|
|
||||||
|
(normal_command (identifier) @function)
|
||||||
|
|
||||||
|
["ENV" "CACHE"] @symbol
|
||||||
|
["$" "{" "}" "<" ">"] @punctuation.special
|
||||||
|
["(" ")"] @punctuation.bracket
|
||||||
|
|
||||||
|
[
|
||||||
|
(function)
|
||||||
|
(endfunction)
|
||||||
|
(macro)
|
||||||
|
(endmacro)
|
||||||
|
] @keyword.function
|
||||||
|
|
||||||
|
[
|
||||||
|
(if)
|
||||||
|
(elseif)
|
||||||
|
(else)
|
||||||
|
(endif)
|
||||||
|
] @conditional
|
||||||
|
|
||||||
|
[
|
||||||
|
(foreach)
|
||||||
|
(endforeach)
|
||||||
|
(while)
|
||||||
|
(endwhile)
|
||||||
|
] @repeat
|
||||||
|
|
||||||
|
(function_command
|
||||||
|
(function)
|
||||||
|
. (argument) @function
|
||||||
|
(argument)* @parameter
|
||||||
|
)
|
||||||
|
|
||||||
|
(macro_command
|
||||||
|
(macro)
|
||||||
|
. (argument) @function.macro
|
||||||
|
(argument)* @parameter
|
||||||
|
)
|
||||||
|
|
||||||
|
;; (normal_command
|
||||||
|
;; (identifier) @function.builtin
|
||||||
|
;; . (argument) @variable
|
||||||
|
;; (#match? @function.builtin "\\c^(set)$")
|
||||||
|
;; )
|
||||||
|
|
||||||
|
;; (normal_command
|
||||||
|
;; (identifier) @function.builtin
|
||||||
|
;; (#match? @function.builtin "\\c^(set)$")
|
||||||
|
;; (
|
||||||
|
;; (argument) @constant
|
||||||
|
;; (#any-of? @constant "PARENT_SCOPE")
|
||||||
|
;; ) .
|
||||||
|
;; )
|
||||||
|
|
||||||
|
;; (normal_command
|
||||||
|
;; (identifier) @function.builtin
|
||||||
|
;; (#match? @function.builtin "\\c^(set)$")
|
||||||
|
;; . (argument)
|
||||||
|
;; (
|
||||||
|
;; (argument) @_cache @constant
|
||||||
|
;; .
|
||||||
|
;; (argument) @_type @constant
|
||||||
|
;; (#any-of? @_cache "CACHE")
|
||||||
|
;; (#any-of? @_type "BOOL" "FILEPATH" "PATH" "STRING" "INTERNAL")
|
||||||
|
;; )
|
||||||
|
;; )
|
||||||
|
;; (normal_command
|
||||||
|
;; (identifier) @function.builtin
|
||||||
|
;; (#match? @function.builtin "\\c^(set)$")
|
||||||
|
;; . (argument)
|
||||||
|
;; (argument) @_cache
|
||||||
|
;; (#any-of? @_cache "CACHE")
|
||||||
|
;; (
|
||||||
|
;; (argument) @_force @constant
|
||||||
|
;; (#any-of? @_force "FORCE")
|
||||||
|
;; ) .
|
||||||
|
;; )
|
||||||
|
|
||||||
|
;; ((argument) @boolean
|
||||||
|
;; (#match? @boolean "\\c^(1|on|yes|true|y|0|off|no|false|n|ignore|notfound|.*-notfound)$")
|
||||||
|
;; )
|
||||||
|
|
||||||
|
(if_command
|
||||||
|
(if)
|
||||||
|
(argument) @keyword.operator
|
||||||
|
(#any-of? @keyword.operator "NOT" "AND" "OR"
|
||||||
|
"COMMAND" "POLICY" "TARGET" "TEST" "DEFINED" "IN_LIST"
|
||||||
|
"EXISTS" "IS_NEWER_THAN" "IS_DIRECTORY" "IS_SYMLINK" "IS_ABSOLUTE"
|
||||||
|
"MATCHES"
|
||||||
|
"LESS" "GREATER" "EQUAL" "LESS_EQUAL" "GREATER_EQUAL"
|
||||||
|
"STRLESS" "STRGREATER" "STREQUAL" "STRLESS_EQUAL" "STRGREATER_EQUAL"
|
||||||
|
"VERSION_LESS" "VERSION_GREATER" "VERSION_EQUAL" "VERSION_LESS_EQUAL" "VERSION_GREATER_EQUAL"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
;; (normal_command
|
||||||
|
;; (identifier) @function.builtin
|
||||||
|
;; . (argument)
|
||||||
|
;; (argument) @constant
|
||||||
|
;; (#any-of? @constant "ALL" "COMMAND" "DEPENDS" "BYPRODUCTS" "WORKING_DIRECTORY" "COMMENT"
|
||||||
|
;; "JOB_POOL" "VERBATIM" "USES_TERMINAL" "COMMAND_EXPAND_LISTS" "SOURCES")
|
||||||
|
;; (#match? @function.builtin "\\c^(add_custom_target)$")
|
||||||
|
;; )
|
||||||
|
|
||||||
|
;; (normal_command
|
||||||
|
;; (identifier) @function.builtin
|
||||||
|
;; (argument) @constant
|
||||||
|
;; (#any-of? @constant "OUTPUT" "COMMAND" "MAIN_DEPENDENCY" "DEPENDS" "BYPRODUCTS" "IMPLICIT_DEPENDS" "WORKING_DIRECTORY"
|
||||||
|
;; "COMMENT" "DEPFILE" "JOB_POOL" "VERBATIM" "APPEND" "USES_TERMINAL" "COMMAND_EXPAND_LISTS")
|
||||||
|
;; (#match? @function.builtin "\\c^(add_custom_command)$")
|
||||||
|
;; )
|
||||||
|
|
||||||
@ -0,0 +1 @@
|
|||||||
|
tree-sitter-cmake/src
|
||||||
@ -0,0 +1,129 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# Snowpack dependency directory (https://snowpack.dev/)
|
||||||
|
web_modules/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Microbundle cache
|
||||||
|
.rpt2_cache/
|
||||||
|
.rts2_cache_cjs/
|
||||||
|
.rts2_cache_es/
|
||||||
|
.rts2_cache_umd/
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
.parcel-cache
|
||||||
|
|
||||||
|
# Next.js build output
|
||||||
|
.next
|
||||||
|
out
|
||||||
|
|
||||||
|
# Nuxt.js build / generate output
|
||||||
|
.nuxt
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Gatsby files
|
||||||
|
.cache/
|
||||||
|
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||||
|
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||||
|
# public
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# TernJS port file
|
||||||
|
.tern-port
|
||||||
|
|
||||||
|
# Stores VSCode versions used for testing VSCode extensions
|
||||||
|
.vscode-test
|
||||||
|
|
||||||
|
# yarn v2
|
||||||
|
.yarn/cache
|
||||||
|
.yarn/unplugged
|
||||||
|
.yarn/build-state.yml
|
||||||
|
.yarn/install-state.gz
|
||||||
|
.pnp.*
|
||||||
|
|
||||||
|
# Ignore lock file
|
||||||
|
package-lock.json
|
||||||
|
|
||||||
|
# Tree sitter generated files
|
||||||
|
parser.exp
|
||||||
|
parser.lib
|
||||||
|
parser.obj
|
||||||
|
scanner.obj
|
||||||
|
|
||||||
|
# Rust files
|
||||||
|
target/**
|
||||||
|
Cargo.lock
|
||||||
@ -0,0 +1 @@
|
|||||||
|
printWidth = 120
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
[package]
|
||||||
|
name = "tree-sitter-cmake"
|
||||||
|
description = "cmake grammar for the tree-sitter parsing library"
|
||||||
|
version = "0.1.0"
|
||||||
|
keywords = ["incremental", "parsing", "cmake"]
|
||||||
|
categories = ["parsing", "text-editors"]
|
||||||
|
repository = "https://github.com/uyha/tree-sitter-cmake"
|
||||||
|
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.20"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
cc = "1.0"
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2021 Uy Ha
|
||||||
|
|
||||||
|
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.
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
==============================
|
||||||
|
A Tree-sitter parser for CMake
|
||||||
|
==============================
|
||||||
|
|
||||||
|
This project provides a `cmake` parser. Its primary use case is to provide a `cmake` parser for `nvim-treesitter`.
|
||||||
|
|
||||||
|
|
||||||
|
Parsed syntax
|
||||||
|
=============
|
||||||
|
|
||||||
|
- Command
|
||||||
|
|
||||||
|
- General commands
|
||||||
|
- For and while loops
|
||||||
|
- If conditions
|
||||||
|
- Functions and macros
|
||||||
|
|
||||||
|
- Arguments
|
||||||
|
|
||||||
|
- Quoted arguments
|
||||||
|
- Bracket arguments
|
||||||
|
- Unquoted arguments
|
||||||
|
- Parentheses
|
||||||
|
|
||||||
|
- Variable refences
|
||||||
|
|
||||||
|
- Environment and cache variables
|
||||||
|
- Normal variables
|
||||||
|
|
||||||
|
- Generator expression
|
||||||
|
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"target_name": "tree_sitter_CMake_binding",
|
||||||
|
"include_dirs": [
|
||||||
|
"<!(node -e \"require('nan')\")",
|
||||||
|
"src"
|
||||||
|
],
|
||||||
|
"sources": [
|
||||||
|
"bindings/node/binding.cc",
|
||||||
|
"src/parser.c",
|
||||||
|
# If your language uses an external scanner, add it here.
|
||||||
|
],
|
||||||
|
"cflags_c": [
|
||||||
|
"-std=c99",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
#include "tree_sitter/parser.h"
|
||||||
|
#include <node.h>
|
||||||
|
#include "nan.h"
|
||||||
|
|
||||||
|
using namespace v8;
|
||||||
|
|
||||||
|
extern "C" TSLanguage * tree_sitter_cmake();
|
||||||
|
|
||||||
|
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_cmake());
|
||||||
|
|
||||||
|
Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("cmake").ToLocalChecked());
|
||||||
|
Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
NODE_MODULE(tree_sitter_cmake_binding, Init)
|
||||||
|
|
||||||
|
} // namespace
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
try {
|
||||||
|
module.exports = require("../../build/Release/tree_sitter_cmake_binding");
|
||||||
|
} catch (error1) {
|
||||||
|
if (error1.code !== 'MODULE_NOT_FOUND') {
|
||||||
|
throw error1;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
module.exports = require("../../build/Debug/tree_sitter_cmake_binding");
|
||||||
|
} catch (error2) {
|
||||||
|
if (error2.code !== 'MODULE_NOT_FOUND') {
|
||||||
|
throw error2;
|
||||||
|
}
|
||||||
|
throw error1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
module.exports.nodeTypeInfo = require("../../src/node-types.json");
|
||||||
|
} catch (_) {}
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
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());
|
||||||
|
}
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
//! This crate provides cmake 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_cmake::language()).expect("Error loading cmake 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_cmake() -> 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_cmake() }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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 cmake language");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,93 @@
|
|||||||
|
=========================================
|
||||||
|
Empty bracket argument [bracket_argument]
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
message([[]])
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (bracket_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
=======================================
|
||||||
|
One bracket argument [bracket_argument]
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
message([[an argument]])
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (bracket_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
========================================
|
||||||
|
Two bracket arguments [bracket_argument]
|
||||||
|
========================================
|
||||||
|
|
||||||
|
message([[first argument]] [[second argument]])
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (bracket_argument))
|
||||||
|
(argument (bracket_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
========================================================
|
||||||
|
Two bracket with two equals arguments [bracket_argument]
|
||||||
|
========================================================
|
||||||
|
|
||||||
|
message(
|
||||||
|
[====[first argument]====]
|
||||||
|
[====[second argument]====]
|
||||||
|
)
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (bracket_argument))
|
||||||
|
(argument (bracket_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
===================================================
|
||||||
|
Bracket argument with line break [bracket_argument]
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
message([[an argument
|
||||||
|
with line break
|
||||||
|
]])
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (bracket_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
=====================================================================================
|
||||||
|
Bracket argument with embedded brackets and equal signs line break [bracket_argument]
|
||||||
|
=====================================================================================
|
||||||
|
|
||||||
|
message([===[an argument
|
||||||
|
with line break ]==]
|
||||||
|
]===])
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (bracket_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
=========================
|
||||||
|
Bracket comment [comment]
|
||||||
|
=========================
|
||||||
|
#[[Some comment]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(bracket_comment)
|
||||||
|
)
|
||||||
|
|
||||||
|
==========================================================
|
||||||
|
Command invocation with embedded bracket comment [comment]
|
||||||
|
==========================================================
|
||||||
|
message(STATUS #[[Some comment]] "comment is next" #[[Some comment]])
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(bracket_comment)
|
||||||
|
(argument (quoted_argument (quoted_element)))
|
||||||
|
(bracket_comment)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
======================
|
||||||
|
Line comment [comment]
|
||||||
|
======================
|
||||||
|
# [[Some comment]] "comment is next" #[[Some comment]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(line_comment)
|
||||||
|
)
|
||||||
|
|
||||||
|
===================================
|
||||||
|
Message with Line comment [comment]
|
||||||
|
===================================
|
||||||
|
message(STATUS #Some line comment
|
||||||
|
|
||||||
|
Second #Some other line comment
|
||||||
|
)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(line_comment)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(line_comment)
|
||||||
|
)
|
||||||
|
)
|
||||||
@ -0,0 +1,147 @@
|
|||||||
|
====================
|
||||||
|
Empty if [condition]
|
||||||
|
====================
|
||||||
|
if ( cond )
|
||||||
|
endif()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(if_condition
|
||||||
|
(if_command
|
||||||
|
(if)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endif_command (endif))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
===========================
|
||||||
|
Empty if elseif [condition]
|
||||||
|
===========================
|
||||||
|
if(cond)
|
||||||
|
elseif(cond)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(if_condition
|
||||||
|
(if_command
|
||||||
|
(if)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(elseif_command
|
||||||
|
(elseif)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endif_command (endif))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
================================
|
||||||
|
Empty if elseif else [condition]
|
||||||
|
================================
|
||||||
|
if(cond)
|
||||||
|
elseif(cond)
|
||||||
|
else()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(if_condition
|
||||||
|
(if_command
|
||||||
|
(if)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(elseif_command
|
||||||
|
(elseif)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(else_command (else))
|
||||||
|
(endif_command (endif))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
==========================================
|
||||||
|
If with one command invocation [condition]
|
||||||
|
==========================================
|
||||||
|
if(cond)
|
||||||
|
message(STATUS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(if_condition
|
||||||
|
(if_command
|
||||||
|
(if)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endif_command (endif))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
======================================
|
||||||
|
Condition with parentheses [condition]
|
||||||
|
======================================
|
||||||
|
if((A AND B) OR C)
|
||||||
|
endif()
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(if_condition
|
||||||
|
(if_command
|
||||||
|
(if)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endif_command (endif))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
==============================================
|
||||||
|
Condition with not and parentheses [condition]
|
||||||
|
==============================================
|
||||||
|
if(NOT (A AND B) OR C)
|
||||||
|
else(NOT (A AND B) OR C)
|
||||||
|
endif(NOT (A AND B) OR C)
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(if_condition
|
||||||
|
(if_command
|
||||||
|
(if)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(else_command
|
||||||
|
(else)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endif_command
|
||||||
|
(endif)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
@ -0,0 +1,117 @@
|
|||||||
|
==================================
|
||||||
|
Empty foreach loop [foreach]
|
||||||
|
==================================
|
||||||
|
|
||||||
|
foreach(var)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(foreach_loop
|
||||||
|
(foreach_command
|
||||||
|
(foreach)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endforeach_command (endforeach))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
===============================================================
|
||||||
|
Empty foreach loop with one argument endforeach [foreach]
|
||||||
|
===============================================================
|
||||||
|
|
||||||
|
foreach(var)
|
||||||
|
endforeach(var)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(foreach_loop
|
||||||
|
(foreach_command
|
||||||
|
(foreach)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endforeach_command
|
||||||
|
(endforeach)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
|
=================================
|
||||||
|
Uppercase foreach [foreach]
|
||||||
|
=================================
|
||||||
|
|
||||||
|
FOREACH(var)
|
||||||
|
ENDFOREACH()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(foreach_loop
|
||||||
|
(foreach_command
|
||||||
|
(foreach)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endforeach_command (endforeach))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Mixed case foreach [foreach]
|
||||||
|
==================================
|
||||||
|
|
||||||
|
forEach(var)
|
||||||
|
endForEach()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(foreach_loop
|
||||||
|
(foreach_command
|
||||||
|
(foreach)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endforeach_command (endforeach))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Empty IN [foreach]
|
||||||
|
==================================
|
||||||
|
|
||||||
|
foreach(var IN)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(foreach_loop
|
||||||
|
(foreach_command
|
||||||
|
(foreach)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endforeach_command (endforeach))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
==================================
|
||||||
|
Empty RANGE [foreach]
|
||||||
|
==================================
|
||||||
|
|
||||||
|
foreach(var RANGE)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(foreach_loop
|
||||||
|
(foreach_command
|
||||||
|
(foreach)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endforeach_command (endforeach))
|
||||||
|
)
|
||||||
|
)
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
===================================================
|
||||||
|
add_custom_target without new line [function_calls]
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
add_custom_target(OUTPUT somefile)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
================================================
|
||||||
|
add_custom_target with new line [function_calls]
|
||||||
|
================================================
|
||||||
|
|
||||||
|
add_custom_target(
|
||||||
|
OUTPUT somefile)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
@ -0,0 +1,98 @@
|
|||||||
|
=======================================
|
||||||
|
Unquoted generator expression [gen_exp]
|
||||||
|
=======================================
|
||||||
|
message($<>)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(unquoted_argument
|
||||||
|
(gen_exp)))))
|
||||||
|
|
||||||
|
=====================================
|
||||||
|
Quoted generator expression [gen_exp]
|
||||||
|
=====================================
|
||||||
|
message("$<>")
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(quoted_argument
|
||||||
|
(quoted_element
|
||||||
|
(gen_exp))))))
|
||||||
|
|
||||||
|
=====================
|
||||||
|
No argument [gen_exp]
|
||||||
|
=====================
|
||||||
|
message($<ANGLE-R>)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(unquoted_argument
|
||||||
|
(gen_exp
|
||||||
|
(argument
|
||||||
|
(unquoted_argument)))))))
|
||||||
|
|
||||||
|
============================================
|
||||||
|
No argument with superfluous colon [gen_exp]
|
||||||
|
============================================
|
||||||
|
message($<ANGLE-R:>)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(unquoted_argument
|
||||||
|
(gen_exp
|
||||||
|
(argument
|
||||||
|
(unquoted_argument)))))))
|
||||||
|
|
||||||
|
======================
|
||||||
|
One argument [gen_exp]
|
||||||
|
======================
|
||||||
|
message($<BOOL:-NOTFOUND>)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(unquoted_argument
|
||||||
|
(gen_exp
|
||||||
|
(argument
|
||||||
|
(unquoted_argument))
|
||||||
|
(argument
|
||||||
|
(unquoted_argument)))))))
|
||||||
|
|
||||||
|
=======================
|
||||||
|
Two arguments [gen_exp]
|
||||||
|
=======================
|
||||||
|
message($<AND:TRUE,FALSE>)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(unquoted_argument
|
||||||
|
(gen_exp
|
||||||
|
(argument
|
||||||
|
(unquoted_argument))
|
||||||
|
(argument
|
||||||
|
(unquoted_argument))
|
||||||
|
(argument
|
||||||
|
(unquoted_argument)))))))
|
||||||
@ -0,0 +1,93 @@
|
|||||||
|
=====================
|
||||||
|
No argument [message]
|
||||||
|
=====================
|
||||||
|
|
||||||
|
message()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
=================================
|
||||||
|
No argument with spaces [message]
|
||||||
|
=================================
|
||||||
|
|
||||||
|
message( )
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
===============================================
|
||||||
|
Message without argument with newline [message]
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
message(
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
==================================================
|
||||||
|
Message with STATUS and bracket argument [message]
|
||||||
|
==================================================
|
||||||
|
|
||||||
|
message(STATUS [=[Some argument ]==] ]=] )
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (bracket_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
==============================================================
|
||||||
|
Message with STATUS and bracket argument and newline [message]
|
||||||
|
==============================================================
|
||||||
|
|
||||||
|
message(STATUS
|
||||||
|
[=[Some argument
|
||||||
|
]==] ]=] )
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (bracket_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
======================================================
|
||||||
|
Message with STATUS and an unquoted argument [message]
|
||||||
|
======================================================
|
||||||
|
|
||||||
|
message(STATUS argument)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
@ -0,0 +1,52 @@
|
|||||||
|
===================================================
|
||||||
|
Parentheses inside command invocation [parentheses]
|
||||||
|
===================================================
|
||||||
|
message(STATUS (TEST))
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
===========================================================
|
||||||
|
Missing parentheses inside command invocation [parentheses]
|
||||||
|
===========================================================
|
||||||
|
message(STATUS (TEST)
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument)) (MISSING ")")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
==================================================================
|
||||||
|
Nested missing parentheses inside command invocation [parentheses]
|
||||||
|
==================================================================
|
||||||
|
message(STATUS ((TEST))
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument)) (MISSING ")")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
===============================================
|
||||||
|
Many arguments inside parentheses [parentheses]
|
||||||
|
===============================================
|
||||||
|
message(STATUS (TEST SECOND_TEST))
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
@ -0,0 +1,176 @@
|
|||||||
|
===========================================
|
||||||
|
One empty quoted argument [quoted_argument]
|
||||||
|
===========================================
|
||||||
|
|
||||||
|
message("")
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (quoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
=====================================
|
||||||
|
One quoted argument [quoted_argument]
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
message("An argument")
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (quoted_argument (quoted_element)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
======================================
|
||||||
|
Two quoted arguments [quoted_argument]
|
||||||
|
======================================
|
||||||
|
|
||||||
|
message("First argument" "Second argument")
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (quoted_argument (quoted_element)))
|
||||||
|
(argument (quoted_argument (quoted_element)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
===================================================
|
||||||
|
A quoted argument with line break [quoted_argument]
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
message("An argument
|
||||||
|
with line break")
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (quoted_argument (quoted_element)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
========================================
|
||||||
|
One variable reference [quoted_argument]
|
||||||
|
========================================
|
||||||
|
|
||||||
|
message("${var}")
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(quoted_argument
|
||||||
|
(quoted_element
|
||||||
|
(variable_ref (normal_var (variable)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
=========================================
|
||||||
|
Two Variable references [quoted_argument]
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
message("${var} ${var}")
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(quoted_argument
|
||||||
|
(quoted_element
|
||||||
|
(variable_ref (normal_var (variable)))
|
||||||
|
(variable_ref (normal_var (variable)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
Variable reference inside another variable reference [quoted_argument]
|
||||||
|
======================================================================
|
||||||
|
|
||||||
|
message("${var_${var}}")
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(quoted_argument
|
||||||
|
(quoted_element
|
||||||
|
(variable_ref (normal_var (variable (variable_ref (normal_var (variable))))))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
Lookalike bracket comment inside quoted argument [quoted_argument]
|
||||||
|
======================================================================
|
||||||
|
|
||||||
|
message("${var_${var}} #[[comment]]")
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(quoted_argument
|
||||||
|
(quoted_element
|
||||||
|
(variable_ref (normal_var (variable (variable_ref (normal_var (variable))))))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
Lookalike line comment inside quoted argument [quoted_argument]
|
||||||
|
======================================================================
|
||||||
|
|
||||||
|
message("${var_${var}} #comment")
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(quoted_argument
|
||||||
|
(quoted_element
|
||||||
|
(variable_ref (normal_var (variable (variable_ref (normal_var (variable))))))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
===========================================================
|
||||||
|
Lookalike variable inside quoted argument [quoted_argument]
|
||||||
|
===========================================================
|
||||||
|
|
||||||
|
message("$var")
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(quoted_argument
|
||||||
|
(quoted_element)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
@ -0,0 +1,119 @@
|
|||||||
|
========================================================
|
||||||
|
Command invocation with one argument [unquoted_argument]
|
||||||
|
========================================================
|
||||||
|
|
||||||
|
message(STATUS)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
=========================================================
|
||||||
|
Command invocation with two arguments [unquoted_argument]
|
||||||
|
=========================================================
|
||||||
|
|
||||||
|
message(STATUS Hello)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
===============================================================
|
||||||
|
Command invocations with leading seperation [unquoted_argument]
|
||||||
|
===============================================================
|
||||||
|
|
||||||
|
message( STATUS)
|
||||||
|
message(
|
||||||
|
STATUS)
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
============================================================
|
||||||
|
Command invocations with escape sequence [unquoted_argument]
|
||||||
|
============================================================
|
||||||
|
|
||||||
|
message( STATUS)
|
||||||
|
message(
|
||||||
|
STATUS)
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
========================================
|
||||||
|
Variable referencing [unquoted_argument]
|
||||||
|
========================================
|
||||||
|
message(${var_ref})
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(unquoted_argument
|
||||||
|
(variable_ref (normal_var (variable)))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
====================================================================
|
||||||
|
Variable referencing inside variable referencing [unquoted_argument]
|
||||||
|
====================================================================
|
||||||
|
message(${var_${var_ref}})
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(unquoted_argument
|
||||||
|
(variable_ref (normal_var (variable (variable_ref (normal_var (variable))))))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
===============================================================
|
||||||
|
Lookalike variable inside unquoted argument [unquoted_argument]
|
||||||
|
===============================================================
|
||||||
|
|
||||||
|
message($var)
|
||||||
|
|
||||||
|
---
|
||||||
|
(source_file
|
||||||
|
(normal_command
|
||||||
|
(identifier)
|
||||||
|
(argument
|
||||||
|
(unquoted_argument)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
@ -0,0 +1,41 @@
|
|||||||
|
===================
|
||||||
|
Empty while [while]
|
||||||
|
===================
|
||||||
|
|
||||||
|
while(cond)
|
||||||
|
endwhile()
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(while_loop
|
||||||
|
(while_command
|
||||||
|
(while)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endwhile_command (endwhile))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
============================================
|
||||||
|
Empty while with argument in endwhile[while]
|
||||||
|
============================================
|
||||||
|
|
||||||
|
while(cond)
|
||||||
|
endwhile(cond)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(source_file
|
||||||
|
(while_loop
|
||||||
|
(while_command
|
||||||
|
(while)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
(endwhile_command
|
||||||
|
(endwhile)
|
||||||
|
(argument (unquoted_argument))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
@ -0,0 +1,104 @@
|
|||||||
|
commands = [
|
||||||
|
"if",
|
||||||
|
"elseif",
|
||||||
|
"else",
|
||||||
|
"endif",
|
||||||
|
"foreach",
|
||||||
|
"endforeach",
|
||||||
|
"while",
|
||||||
|
"endwhile",
|
||||||
|
"function",
|
||||||
|
"endfunction",
|
||||||
|
"macro",
|
||||||
|
"endmacro",
|
||||||
|
];
|
||||||
|
|
||||||
|
module.exports = grammar({
|
||||||
|
name: "cmake",
|
||||||
|
|
||||||
|
externals: ($) => [$.bracket_argument, $.bracket_comment, $.line_comment],
|
||||||
|
extras: (_) => [],
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
source_file: ($) => repeat($._untrimmed_command_invocation),
|
||||||
|
|
||||||
|
escape_sequence: ($) => choice($._escape_identity, $._escape_encoded, $._escape_semicolon),
|
||||||
|
_escape_identity: (_) => /\\[^A-Za-z0-9;]/,
|
||||||
|
_escape_encoded: (_) => choice("\\t", "\\r", "\\n"),
|
||||||
|
_escape_semicolon: (_) => ";",
|
||||||
|
|
||||||
|
variable: ($) => prec.left(repeat1(choice(/[a-zA-Z0-9/_.+-]/, $.escape_sequence, $.variable_ref))),
|
||||||
|
variable_ref: ($) => choice($.normal_var, $.env_var, $.cache_var),
|
||||||
|
normal_var: ($) => seq("$", "{", $.variable, "}"),
|
||||||
|
env_var: ($) => seq("$", "ENV", "{", $.variable, "}"),
|
||||||
|
cache_var: ($) => seq("$", "CACHE", "{", $.variable, "}"),
|
||||||
|
|
||||||
|
gen_exp: ($) => seq("$", "<", optional($._gen_exp_content), ">"),
|
||||||
|
_gen_exp_content: ($) => seq($.argument, optional($._gen_exp_arguments)),
|
||||||
|
_gen_exp_arguments: ($) => seq(":", repeat(seq($.argument, optional(/[,;]/)))),
|
||||||
|
|
||||||
|
argument: ($) => choice($.bracket_argument, $.quoted_argument, $.unquoted_argument),
|
||||||
|
_untrimmed_argument: ($) => choice(/\s/, $.bracket_comment, $.line_comment, $.argument, $._paren_argument),
|
||||||
|
_paren_argument: ($) => seq("(", repeat($._untrimmed_argument), ")"),
|
||||||
|
|
||||||
|
quoted_argument: ($) => seq('"', optional($.quoted_element), '"'),
|
||||||
|
quoted_element: ($) => repeat1(choice($.variable_ref, $.gen_exp, $._quoted_text, $.escape_sequence)),
|
||||||
|
_quoted_text: ($) => prec.left(repeat1(choice('$', /[^\\"]/))),
|
||||||
|
|
||||||
|
unquoted_argument: ($) => prec.right(repeat1(choice($.variable_ref, $.gen_exp, $._unquoted_text, $.escape_sequence))),
|
||||||
|
_unquoted_text: ($) => prec.left(repeat1(choice('$', /[^()#"\\']/))),
|
||||||
|
|
||||||
|
if_command: ($) => command($.if, repeat($._untrimmed_argument)),
|
||||||
|
elseif_command: ($) => command($.elseif, repeat($._untrimmed_argument)),
|
||||||
|
else_command: ($) => command($.else, repeat($._untrimmed_argument)),
|
||||||
|
endif_command: ($) => command($.endif, repeat($._untrimmed_argument)),
|
||||||
|
if_condition: ($) =>
|
||||||
|
seq(
|
||||||
|
$.if_command,
|
||||||
|
repeat(choice($._untrimmed_command_invocation, $.elseif_command, $.else_command)),
|
||||||
|
$.endif_command
|
||||||
|
),
|
||||||
|
|
||||||
|
foreach_command: ($) => command($.foreach, repeat($._untrimmed_argument)),
|
||||||
|
endforeach_command: ($) => command($.endforeach, optional($.argument)),
|
||||||
|
foreach_loop: ($) => seq($.foreach_command, repeat($._untrimmed_command_invocation), $.endforeach_command),
|
||||||
|
|
||||||
|
while_command: ($) => command($.while, repeat($._untrimmed_argument)),
|
||||||
|
endwhile_command: ($) => command($.endwhile, optional(seq(/\s*/, $.argument, /\s*/))),
|
||||||
|
while_loop: ($) => seq($.while_command, repeat($._untrimmed_command_invocation), $.endwhile_command),
|
||||||
|
|
||||||
|
function_command: ($) => command($.function, repeat($._untrimmed_argument)),
|
||||||
|
endfunction_command: ($) => command($.endfunction, repeat($._untrimmed_argument)),
|
||||||
|
function_def: ($) => seq($.function_command, repeat($._untrimmed_command_invocation), $.endfunction_command),
|
||||||
|
|
||||||
|
macro_command: ($) => command($.macro, repeat($._untrimmed_argument)),
|
||||||
|
endmacro_command: ($) => command($.endmacro, repeat($._untrimmed_argument)),
|
||||||
|
macro_def: ($) => seq($.macro_command, repeat($._untrimmed_command_invocation), $.endmacro_command),
|
||||||
|
|
||||||
|
normal_command: ($) => command($.identifier, repeat($._untrimmed_argument)),
|
||||||
|
|
||||||
|
_command_invocation: ($) =>
|
||||||
|
choice($.normal_command, $.if_condition, $.foreach_loop, $.while_loop, $.function_def, $.macro_def),
|
||||||
|
_untrimmed_command_invocation: ($) => choice(/\s/, $.bracket_comment, $.line_comment, $._command_invocation),
|
||||||
|
|
||||||
|
...commandNames(...commands),
|
||||||
|
identifier: (_) => /[A-Za-z_][A-Za-z0-9_]*/,
|
||||||
|
integer: (_) => /[+-]*\d+/,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function iregex(s) {
|
||||||
|
return new RegExp(Array.from(s).reduce((acc, value) => acc + `[${value.toLowerCase()}${value.toUpperCase()}]`, ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
function commandName(name) {
|
||||||
|
return { [name]: (_) => iregex(name) };
|
||||||
|
}
|
||||||
|
|
||||||
|
function commandNames(...names) {
|
||||||
|
return Object.assign({}, ...names.map(commandName));
|
||||||
|
}
|
||||||
|
|
||||||
|
function command(name_rule, arg_rule) {
|
||||||
|
return seq(name_rule, repeat(/[\t ]/), "(", arg_rule, ")");
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "tree-sitter-cmake",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "CMake grammar for tree-sitter",
|
||||||
|
"main": "bindings/node",
|
||||||
|
"author": "Uy Ha",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"nan": "^2.16.0"
|
||||||
|
},
|
||||||
|
"tree-sitter": [
|
||||||
|
{
|
||||||
|
"scope": "source.cmake",
|
||||||
|
"file-types": [
|
||||||
|
"cmake",
|
||||||
|
"CMakeLists.txt"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"devDependencies": {
|
||||||
|
"tree-sitter-cli": "^0.20.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,954 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": false,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "bracket_argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quoted_argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "unquoted_argument",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "cache_var",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": false,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "variable",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "else_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "elseif_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "elseif",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endforeach_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endforeach",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endfunction_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endfunction",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endif_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endif",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endmacro_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endmacro",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endwhile_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endwhile",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "env_var",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": false,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "variable",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "escape_sequence",
|
||||||
|
"named": true,
|
||||||
|
"fields": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach_loop",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endforeach_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach_loop",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if_condition",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "normal_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while_loop",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function_def",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endfunction_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach_loop",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if_condition",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "normal_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while_loop",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "gen_exp",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if_condition",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "else_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "elseif_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endif_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach_loop",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if_condition",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "normal_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while_loop",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro_def",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endmacro_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach_loop",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if_condition",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "normal_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while_loop",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "normal_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "identifier",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "normal_var",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": false,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "variable",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quoted_argument",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": false,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "quoted_element",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quoted_element",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "escape_sequence",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "gen_exp",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "variable_ref",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "source_file",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach_loop",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if_condition",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "normal_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while_loop",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "unquoted_argument",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "escape_sequence",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "gen_exp",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "variable_ref",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "variable",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": false,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "escape_sequence",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "variable_ref",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "variable_ref",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": false,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "cache_var",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "env_var",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "normal_var",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while_command",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while_loop",
|
||||||
|
"named": true,
|
||||||
|
"fields": {},
|
||||||
|
"children": {
|
||||||
|
"multiple": true,
|
||||||
|
"required": true,
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endwhile_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach_loop",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if_condition",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro_def",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "normal_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while_command",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while_loop",
|
||||||
|
"named": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "\"",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "$",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "(",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": ")",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": ":",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "<",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": ">",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "CACHE",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "ENV",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "\\n",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "\\r",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "\\t",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_argument",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "bracket_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "else",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "elseif",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endforeach",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endfunction",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endif",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endmacro",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "endwhile",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "foreach",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "identifier",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "if",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "line_comment",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "macro",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "while",
|
||||||
|
"named": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "{",
|
||||||
|
"named": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "}",
|
||||||
|
"named": false
|
||||||
|
}
|
||||||
|
]
|
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,90 @@
|
|||||||
|
#include <cwctype>
|
||||||
|
#include <tree_sitter/parser.h>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
enum TokenType { BRACKET_ARGUMENT, BRACKET_COMMENT, LINE_COMMENT };
|
||||||
|
void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
|
||||||
|
void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
|
||||||
|
void skip_wspace(TSLexer *lexer) {
|
||||||
|
while (std::iswspace(lexer->lookahead)) {
|
||||||
|
skip(lexer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool is_bracket_argument(TSLexer *lexer) {
|
||||||
|
if (lexer->lookahead != '[') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
advance(lexer);
|
||||||
|
|
||||||
|
int open_level = 0;
|
||||||
|
while (lexer->lookahead == '=') {
|
||||||
|
++open_level;
|
||||||
|
advance(lexer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lexer->lookahead != '[') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (lexer->lookahead != '\0') {
|
||||||
|
advance(lexer);
|
||||||
|
if (lexer->lookahead == ']') {
|
||||||
|
advance(lexer);
|
||||||
|
|
||||||
|
int close_level = 0;
|
||||||
|
while (lexer->lookahead == '=') {
|
||||||
|
++close_level;
|
||||||
|
advance(lexer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lexer->lookahead == ']' && close_level == open_level) {
|
||||||
|
advance(lexer);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool scan(void *payload, TSLexer *lexer, bool const *valid_symbols) {
|
||||||
|
skip_wspace(lexer);
|
||||||
|
|
||||||
|
if (lexer->lookahead != '#' && valid_symbols[BRACKET_ARGUMENT]) {
|
||||||
|
if (is_bracket_argument(lexer)) {
|
||||||
|
lexer->result_symbol = BRACKET_ARGUMENT;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lexer->lookahead == '#' &&
|
||||||
|
(valid_symbols[BRACKET_COMMENT] || valid_symbols[LINE_COMMENT])) {
|
||||||
|
advance(lexer);
|
||||||
|
if (is_bracket_argument(lexer)) {
|
||||||
|
lexer->result_symbol = BRACKET_COMMENT;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
while (lexer->lookahead != '\n' && lexer->lookahead != '\0') {
|
||||||
|
advance(lexer);
|
||||||
|
}
|
||||||
|
lexer->result_symbol = LINE_COMMENT;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
extern "C" {
|
||||||
|
void *tree_sitter_cmake_external_scanner_create() { return NULL; }
|
||||||
|
void tree_sitter_cmake_external_scanner_destroy(void *payload) {}
|
||||||
|
unsigned tree_sitter_cmake_external_scanner_serialize(void *payload,
|
||||||
|
char *buffer) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
void tree_sitter_cmake_external_scanner_deserialize(void *payload,
|
||||||
|
char const *buffer,
|
||||||
|
unsigned length) {}
|
||||||
|
bool tree_sitter_cmake_external_scanner_scan(void *payload, TSLexer *lexer,
|
||||||
|
bool const *valid_symbols) {
|
||||||
|
return scan(payload, lexer, valid_symbols);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,224 @@
|
|||||||
|
#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_
|
||||||
Loading…
Reference in New Issue