Initial commit
This commit is contained in:
commit
ab1d553e1d
|
@ -0,0 +1,3 @@
|
||||||
|
node_modules
|
||||||
|
build
|
||||||
|
*.log
|
|
@ -0,0 +1,3 @@
|
||||||
|
corpus
|
||||||
|
build
|
||||||
|
examples
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"target_name": "tree_sitter_bash_binding",
|
||||||
|
"include_dirs": [
|
||||||
|
"<!(node -e \"require('nan')\")",
|
||||||
|
"src"
|
||||||
|
],
|
||||||
|
"sources": [
|
||||||
|
"src/parser.c",
|
||||||
|
"src/binding.cc"
|
||||||
|
],
|
||||||
|
"cflags_c": [
|
||||||
|
"-std=c99",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,79 @@
|
||||||
|
===============================
|
||||||
|
Commands
|
||||||
|
===============================
|
||||||
|
|
||||||
|
whoami
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(program
|
||||||
|
(command (simple_command (command_name))))
|
||||||
|
|
||||||
|
===============================
|
||||||
|
Commands with arguments
|
||||||
|
===============================
|
||||||
|
|
||||||
|
cat file1.txt
|
||||||
|
cat -n file1.txt file2.txt
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(program
|
||||||
|
(command (simple_command (command_name) (argument)))
|
||||||
|
(command (simple_command (command_name) (argument) (argument) (argument))))
|
||||||
|
|
||||||
|
===================================
|
||||||
|
Commands with environment variables
|
||||||
|
===================================
|
||||||
|
|
||||||
|
VAR1=1 ./script/test
|
||||||
|
VAR1=a VAR2="ok" git diff --word-diff=color
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(program
|
||||||
|
(command (simple_command
|
||||||
|
(environment_variable_assignment (variable_name) (argument))
|
||||||
|
(command_name)))
|
||||||
|
(command (simple_command
|
||||||
|
(environment_variable_assignment (variable_name) (argument))
|
||||||
|
(environment_variable_assignment (variable_name) (argument))
|
||||||
|
(command_name)
|
||||||
|
(argument)
|
||||||
|
(argument))))
|
||||||
|
|
||||||
|
===================================
|
||||||
|
Pipelines
|
||||||
|
===================================
|
||||||
|
|
||||||
|
whoami | cat
|
||||||
|
cat foo | grep -v bar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(program
|
||||||
|
(command (pipeline
|
||||||
|
(simple_command (command_name))
|
||||||
|
(simple_command (command_name))))
|
||||||
|
(command (pipeline
|
||||||
|
(simple_command (command_name) (argument))
|
||||||
|
(simple_command (command_name) (argument) (argument)))))
|
||||||
|
|
||||||
|
===================================
|
||||||
|
Lists
|
||||||
|
===================================
|
||||||
|
|
||||||
|
a | b && c; d e f | e g
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
(program
|
||||||
|
(command (list
|
||||||
|
(list
|
||||||
|
(pipeline
|
||||||
|
(simple_command (command_name))
|
||||||
|
(simple_command (command_name)))
|
||||||
|
(simple_command (command_name)))
|
||||||
|
(pipeline
|
||||||
|
(simple_command (command_name) (argument) (argument))
|
||||||
|
(simple_command (command_name) (argument))))))
|
|
@ -0,0 +1,61 @@
|
||||||
|
module.exports = grammar({
|
||||||
|
name: 'bash',
|
||||||
|
|
||||||
|
inline: $ => [$.control_operator],
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
program: $ => repeat($.command),
|
||||||
|
|
||||||
|
command: $ => seq(
|
||||||
|
choice(
|
||||||
|
$.simple_command,
|
||||||
|
$.pipeline,
|
||||||
|
$.list
|
||||||
|
),
|
||||||
|
$.control_operator
|
||||||
|
),
|
||||||
|
|
||||||
|
simple_command: $ => seq(
|
||||||
|
repeat($.environment_variable_assignment),
|
||||||
|
rename($.leading_word, 'command_name'),
|
||||||
|
optional(seq(
|
||||||
|
/\s+/,
|
||||||
|
repeat(rename($.word, 'argument'))
|
||||||
|
))
|
||||||
|
),
|
||||||
|
|
||||||
|
pipeline: $ => prec.left(seq(
|
||||||
|
$.simple_command,
|
||||||
|
choice('|', '|&'),
|
||||||
|
$.simple_command
|
||||||
|
)),
|
||||||
|
|
||||||
|
list: $ => prec.left(seq(
|
||||||
|
choice(
|
||||||
|
$.simple_command,
|
||||||
|
$.list,
|
||||||
|
$.pipeline
|
||||||
|
),
|
||||||
|
choice('&&', ';'),
|
||||||
|
choice(
|
||||||
|
$.simple_command,
|
||||||
|
$.pipeline
|
||||||
|
)
|
||||||
|
)),
|
||||||
|
|
||||||
|
environment_variable_assignment: $ => seq(
|
||||||
|
rename($.leading_word, 'variable_name'),
|
||||||
|
'=',
|
||||||
|
rename($.word, 'argument')
|
||||||
|
),
|
||||||
|
|
||||||
|
leading_word: $ => /[^\s=|;]+/,
|
||||||
|
|
||||||
|
word: $ => /[^\s]+/,
|
||||||
|
|
||||||
|
control_operator: $ => choice(
|
||||||
|
'\n',
|
||||||
|
';;'
|
||||||
|
)
|
||||||
|
}
|
||||||
|
});
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require("./build/Release/tree_sitter_bash_binding");
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"name": "tree-sitter-bash",
|
||||||
|
"version": "0.2.1",
|
||||||
|
"description": "Bash grammar for tree-sitter",
|
||||||
|
"main": "index.js",
|
||||||
|
"keywords": [
|
||||||
|
"parser",
|
||||||
|
"lexer"
|
||||||
|
],
|
||||||
|
"author": "Max Brunsfeld",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"nan": "^2.4.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"tree-sitter-cli": "^0.5.3"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "tree-sitter generate && node-gyp build",
|
||||||
|
"test": "tree-sitter test && tree-sitter parse examples/* --quiet --time"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
#include "tree_sitter/parser.h"
|
||||||
|
#include <node.h>
|
||||||
|
#include "nan.h"
|
||||||
|
|
||||||
|
using namespace v8;
|
||||||
|
|
||||||
|
extern "C" TSLanguage * tree_sitter_bash();
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
NAN_METHOD(New) {}
|
||||||
|
|
||||||
|
void Init(Handle<Object> exports, Handle<Object> module) {
|
||||||
|
Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
|
||||||
|
tpl->SetClassName(Nan::New("Language").ToLocalChecked());
|
||||||
|
tpl->InstanceTemplate()->SetInternalFieldCount(1);
|
||||||
|
|
||||||
|
Local<Function> constructor = tpl->GetFunction();
|
||||||
|
Local<Object> instance = constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked();
|
||||||
|
Nan::SetInternalFieldPointer(instance, 0, tree_sitter_bash());
|
||||||
|
|
||||||
|
instance->Set(Nan::New("name").ToLocalChecked(), Nan::New("bash").ToLocalChecked());
|
||||||
|
module->Set(Nan::New("exports").ToLocalChecked(), instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
NODE_MODULE(tree_sitter_bash_binding, Init)
|
||||||
|
|
||||||
|
} // namespace
|
|
@ -0,0 +1,225 @@
|
||||||
|
{
|
||||||
|
"name": "bash",
|
||||||
|
"rules": {
|
||||||
|
"program": {
|
||||||
|
"type": "REPEAT",
|
||||||
|
"content": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "command"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"command": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "simple_command"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "pipeline"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "list"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "control_operator"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"simple_command": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "REPEAT",
|
||||||
|
"content": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "environment_variable_assignment"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "RENAME",
|
||||||
|
"content": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "leading_word"
|
||||||
|
},
|
||||||
|
"value": "command_name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "\\s+"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "REPEAT",
|
||||||
|
"content": {
|
||||||
|
"type": "RENAME",
|
||||||
|
"content": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "word"
|
||||||
|
},
|
||||||
|
"value": "argument"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "BLANK"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"pipeline": {
|
||||||
|
"type": "PREC_LEFT",
|
||||||
|
"value": 0,
|
||||||
|
"content": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "simple_command"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "|"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "|&"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "simple_command"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"list": {
|
||||||
|
"type": "PREC_LEFT",
|
||||||
|
"value": 0,
|
||||||
|
"content": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "simple_command"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "list"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "pipeline"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "&&"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": ";"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "simple_command"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "pipeline"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"environment_variable_assignment": {
|
||||||
|
"type": "SEQ",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "RENAME",
|
||||||
|
"content": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "leading_word"
|
||||||
|
},
|
||||||
|
"value": "variable_name"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "RENAME",
|
||||||
|
"content": {
|
||||||
|
"type": "SYMBOL",
|
||||||
|
"name": "word"
|
||||||
|
},
|
||||||
|
"value": "argument"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"leading_word": {
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "[^\\s=|;]+"
|
||||||
|
},
|
||||||
|
"word": {
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "[^\\s]+"
|
||||||
|
},
|
||||||
|
"control_operator": {
|
||||||
|
"type": "CHOICE",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": "\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "STRING",
|
||||||
|
"value": ";;"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extras": [
|
||||||
|
{
|
||||||
|
"type": "PATTERN",
|
||||||
|
"value": "\\s"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflicts": [],
|
||||||
|
"externals": [],
|
||||||
|
"inline": [
|
||||||
|
"control_operator"
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,815 @@
|
||||||
|
#include <tree_sitter/parser.h>
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
||||||
|
|
||||||
|
#define LANGUAGE_VERSION 3
|
||||||
|
#define STATE_COUNT 33
|
||||||
|
#define SYMBOL_COUNT 20
|
||||||
|
#define TOKEN_COUNT 11
|
||||||
|
#define EXTERNAL_TOKEN_COUNT 0
|
||||||
|
#define MAX_RENAME_SEQUENCE_LENGTH 4
|
||||||
|
|
||||||
|
enum {
|
||||||
|
aux_sym_SLASH_BSLASHs_PLUS_SLASH = 1,
|
||||||
|
anon_sym_PIPE = 2,
|
||||||
|
anon_sym_PIPE_AMP = 3,
|
||||||
|
anon_sym_AMP_AMP = 4,
|
||||||
|
anon_sym_SEMI = 5,
|
||||||
|
anon_sym_EQ = 6,
|
||||||
|
sym_leading_word = 7,
|
||||||
|
sym_word = 8,
|
||||||
|
anon_sym_LF = 9,
|
||||||
|
anon_sym_SEMI_SEMI = 10,
|
||||||
|
sym_program = 11,
|
||||||
|
sym_command = 12,
|
||||||
|
sym_simple_command = 13,
|
||||||
|
sym_pipeline = 14,
|
||||||
|
sym_list = 15,
|
||||||
|
sym_environment_variable_assignment = 16,
|
||||||
|
aux_sym_program_repeat1 = 17,
|
||||||
|
aux_sym_simple_command_repeat1 = 18,
|
||||||
|
aux_sym_simple_command_repeat2 = 19,
|
||||||
|
rename_sym_1 = 20,
|
||||||
|
rename_sym_argument = 21,
|
||||||
|
rename_sym_command_name = 22,
|
||||||
|
rename_sym_variable_name = 23,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *ts_symbol_names[] = {
|
||||||
|
[ts_builtin_sym_end] = "END",
|
||||||
|
[aux_sym_SLASH_BSLASHs_PLUS_SLASH] = "/\\s+/",
|
||||||
|
[anon_sym_PIPE] = "|",
|
||||||
|
[anon_sym_PIPE_AMP] = "|&",
|
||||||
|
[anon_sym_AMP_AMP] = "&&",
|
||||||
|
[anon_sym_SEMI] = ";",
|
||||||
|
[anon_sym_EQ] = "=",
|
||||||
|
[sym_leading_word] = "leading_word",
|
||||||
|
[sym_word] = "word",
|
||||||
|
[anon_sym_LF] = "\n",
|
||||||
|
[anon_sym_SEMI_SEMI] = ";;",
|
||||||
|
[sym_program] = "program",
|
||||||
|
[sym_command] = "command",
|
||||||
|
[sym_simple_command] = "simple_command",
|
||||||
|
[sym_pipeline] = "pipeline",
|
||||||
|
[sym_list] = "list",
|
||||||
|
[sym_environment_variable_assignment] = "environment_variable_assignment",
|
||||||
|
[aux_sym_program_repeat1] = "program_repeat1",
|
||||||
|
[aux_sym_simple_command_repeat1] = "simple_command_repeat1",
|
||||||
|
[aux_sym_simple_command_repeat2] = "simple_command_repeat2",
|
||||||
|
[rename_sym_1] = "",
|
||||||
|
[rename_sym_argument] = "argument",
|
||||||
|
[rename_sym_command_name] = "command_name",
|
||||||
|
[rename_sym_variable_name] = "variable_name",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const TSSymbolMetadata ts_symbol_metadata[SYMBOL_COUNT] = {
|
||||||
|
[ts_builtin_sym_end] = {
|
||||||
|
.visible = false,
|
||||||
|
.named = true,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[aux_sym_SLASH_BSLASHs_PLUS_SLASH] = {
|
||||||
|
.visible = false,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[anon_sym_PIPE] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[anon_sym_PIPE_AMP] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[anon_sym_AMP_AMP] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[anon_sym_SEMI] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[anon_sym_EQ] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[sym_leading_word] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = true,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[sym_word] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = true,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[anon_sym_LF] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[anon_sym_SEMI_SEMI] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[sym_program] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = true,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[sym_command] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = true,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[sym_simple_command] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = true,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[sym_pipeline] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = true,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[sym_list] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = true,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[sym_environment_variable_assignment] = {
|
||||||
|
.visible = true,
|
||||||
|
.named = true,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[aux_sym_program_repeat1] = {
|
||||||
|
.visible = false,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[aux_sym_simple_command_repeat1] = {
|
||||||
|
.visible = false,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
[aux_sym_simple_command_repeat2] = {
|
||||||
|
.visible = false,
|
||||||
|
.named = false,
|
||||||
|
.structural = true,
|
||||||
|
.extra = false,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static TSSymbol ts_rename_sequences[10][MAX_RENAME_SEQUENCE_LENGTH] = {
|
||||||
|
[1] = {
|
||||||
|
[0] = rename_sym_command_name,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
[0] = rename_sym_command_name,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
[1] = rename_sym_command_name,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
[0] = rename_sym_argument,
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
[0] = rename_sym_command_name,
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
[0] = rename_sym_variable_name,
|
||||||
|
[2] = rename_sym_argument,
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
[1] = rename_sym_command_name,
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
[1] = rename_sym_argument,
|
||||||
|
},
|
||||||
|
[9] = {
|
||||||
|
[1] = rename_sym_command_name,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool ts_lex(TSLexer *lexer, TSStateId state) {
|
||||||
|
START_LEXER();
|
||||||
|
switch (state) {
|
||||||
|
case 0:
|
||||||
|
if (lookahead == 0)
|
||||||
|
ADVANCE(1);
|
||||||
|
if (lookahead == '&')
|
||||||
|
ADVANCE(2);
|
||||||
|
if (lookahead == ';')
|
||||||
|
ADVANCE(4);
|
||||||
|
if (lookahead == '=')
|
||||||
|
ADVANCE(6);
|
||||||
|
if (lookahead == '|')
|
||||||
|
ADVANCE(7);
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\n' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
ADVANCE(8);
|
||||||
|
END_STATE();
|
||||||
|
case 1:
|
||||||
|
ACCEPT_TOKEN(ts_builtin_sym_end);
|
||||||
|
END_STATE();
|
||||||
|
case 2:
|
||||||
|
if (lookahead == '&')
|
||||||
|
ADVANCE(3);
|
||||||
|
END_STATE();
|
||||||
|
case 3:
|
||||||
|
ACCEPT_TOKEN(anon_sym_AMP_AMP);
|
||||||
|
END_STATE();
|
||||||
|
case 4:
|
||||||
|
ACCEPT_TOKEN(anon_sym_SEMI);
|
||||||
|
if (lookahead == ';')
|
||||||
|
ADVANCE(5);
|
||||||
|
END_STATE();
|
||||||
|
case 5:
|
||||||
|
ACCEPT_TOKEN(anon_sym_SEMI_SEMI);
|
||||||
|
END_STATE();
|
||||||
|
case 6:
|
||||||
|
ACCEPT_TOKEN(anon_sym_EQ);
|
||||||
|
END_STATE();
|
||||||
|
case 7:
|
||||||
|
ACCEPT_TOKEN(anon_sym_PIPE);
|
||||||
|
END_STATE();
|
||||||
|
case 8:
|
||||||
|
ACCEPT_TOKEN(aux_sym_SLASH_BSLASHs_PLUS_SLASH);
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\n' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
ADVANCE(8);
|
||||||
|
END_STATE();
|
||||||
|
case 9:
|
||||||
|
if (lookahead == 0)
|
||||||
|
ADVANCE(1);
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\n' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
SKIP(9);
|
||||||
|
if (lookahead != ';' &&
|
||||||
|
lookahead != '=' &&
|
||||||
|
lookahead != '|')
|
||||||
|
ADVANCE(10);
|
||||||
|
END_STATE();
|
||||||
|
case 10:
|
||||||
|
ACCEPT_TOKEN(sym_leading_word);
|
||||||
|
if (lookahead != 0 &&
|
||||||
|
lookahead != '\t' &&
|
||||||
|
lookahead != '\n' &&
|
||||||
|
lookahead != '\r' &&
|
||||||
|
lookahead != ' ' &&
|
||||||
|
lookahead != ';' &&
|
||||||
|
lookahead != '=' &&
|
||||||
|
lookahead != '|')
|
||||||
|
ADVANCE(10);
|
||||||
|
END_STATE();
|
||||||
|
case 11:
|
||||||
|
if (lookahead == '\n')
|
||||||
|
ADVANCE(12);
|
||||||
|
if (lookahead == '&')
|
||||||
|
ADVANCE(2);
|
||||||
|
if (lookahead == ';')
|
||||||
|
ADVANCE(4);
|
||||||
|
if (lookahead == '=')
|
||||||
|
ADVANCE(6);
|
||||||
|
if (lookahead == '|')
|
||||||
|
ADVANCE(14);
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
ADVANCE(13);
|
||||||
|
END_STATE();
|
||||||
|
case 12:
|
||||||
|
ACCEPT_TOKEN(anon_sym_LF);
|
||||||
|
if (lookahead == '\n')
|
||||||
|
ADVANCE(12);
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
ADVANCE(13);
|
||||||
|
END_STATE();
|
||||||
|
case 13:
|
||||||
|
ACCEPT_TOKEN(aux_sym_SLASH_BSLASHs_PLUS_SLASH);
|
||||||
|
if (lookahead == '\n')
|
||||||
|
ADVANCE(12);
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
ADVANCE(13);
|
||||||
|
END_STATE();
|
||||||
|
case 14:
|
||||||
|
ACCEPT_TOKEN(anon_sym_PIPE);
|
||||||
|
if (lookahead == '&')
|
||||||
|
ADVANCE(15);
|
||||||
|
END_STATE();
|
||||||
|
case 15:
|
||||||
|
ACCEPT_TOKEN(anon_sym_PIPE_AMP);
|
||||||
|
END_STATE();
|
||||||
|
case 16:
|
||||||
|
if (lookahead == 0)
|
||||||
|
ADVANCE(1);
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\n' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
SKIP(16);
|
||||||
|
END_STATE();
|
||||||
|
case 17:
|
||||||
|
if (lookahead == '\n')
|
||||||
|
ADVANCE(18);
|
||||||
|
if (lookahead == '&')
|
||||||
|
ADVANCE(2);
|
||||||
|
if (lookahead == ';')
|
||||||
|
ADVANCE(4);
|
||||||
|
if (lookahead == '|')
|
||||||
|
ADVANCE(14);
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
SKIP(17);
|
||||||
|
END_STATE();
|
||||||
|
case 18:
|
||||||
|
ACCEPT_TOKEN(anon_sym_LF);
|
||||||
|
END_STATE();
|
||||||
|
case 19:
|
||||||
|
if (lookahead == '\n')
|
||||||
|
ADVANCE(18);
|
||||||
|
if (lookahead == '&')
|
||||||
|
ADVANCE(2);
|
||||||
|
if (lookahead == ';')
|
||||||
|
ADVANCE(4);
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
SKIP(19);
|
||||||
|
END_STATE();
|
||||||
|
case 20:
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\n' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
SKIP(20);
|
||||||
|
if (lookahead != 0 &&
|
||||||
|
lookahead != ';' &&
|
||||||
|
lookahead != '=' &&
|
||||||
|
lookahead != '|')
|
||||||
|
ADVANCE(10);
|
||||||
|
END_STATE();
|
||||||
|
case 21:
|
||||||
|
if (lookahead == '\n')
|
||||||
|
ADVANCE(18);
|
||||||
|
if (lookahead == '&')
|
||||||
|
ADVANCE(22);
|
||||||
|
if (lookahead == ';')
|
||||||
|
ADVANCE(25);
|
||||||
|
if (lookahead == '|')
|
||||||
|
ADVANCE(27);
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
SKIP(21);
|
||||||
|
if (lookahead != 0)
|
||||||
|
ADVANCE(24);
|
||||||
|
END_STATE();
|
||||||
|
case 22:
|
||||||
|
ACCEPT_TOKEN(sym_word);
|
||||||
|
if (lookahead == '&')
|
||||||
|
ADVANCE(23);
|
||||||
|
if (lookahead != 0 &&
|
||||||
|
lookahead != '\t' &&
|
||||||
|
lookahead != '\n' &&
|
||||||
|
lookahead != '\r' &&
|
||||||
|
lookahead != ' ')
|
||||||
|
ADVANCE(24);
|
||||||
|
END_STATE();
|
||||||
|
case 23:
|
||||||
|
ACCEPT_TOKEN(anon_sym_AMP_AMP);
|
||||||
|
if (lookahead != 0 &&
|
||||||
|
lookahead != '\t' &&
|
||||||
|
lookahead != '\n' &&
|
||||||
|
lookahead != '\r' &&
|
||||||
|
lookahead != ' ')
|
||||||
|
ADVANCE(24);
|
||||||
|
END_STATE();
|
||||||
|
case 24:
|
||||||
|
ACCEPT_TOKEN(sym_word);
|
||||||
|
if (lookahead != 0 &&
|
||||||
|
lookahead != '\t' &&
|
||||||
|
lookahead != '\n' &&
|
||||||
|
lookahead != '\r' &&
|
||||||
|
lookahead != ' ')
|
||||||
|
ADVANCE(24);
|
||||||
|
END_STATE();
|
||||||
|
case 25:
|
||||||
|
ACCEPT_TOKEN(anon_sym_SEMI);
|
||||||
|
if (lookahead == ';')
|
||||||
|
ADVANCE(26);
|
||||||
|
if (lookahead != 0 &&
|
||||||
|
lookahead != '\t' &&
|
||||||
|
lookahead != '\n' &&
|
||||||
|
lookahead != '\r' &&
|
||||||
|
lookahead != ' ')
|
||||||
|
ADVANCE(24);
|
||||||
|
END_STATE();
|
||||||
|
case 26:
|
||||||
|
ACCEPT_TOKEN(anon_sym_SEMI_SEMI);
|
||||||
|
if (lookahead != 0 &&
|
||||||
|
lookahead != '\t' &&
|
||||||
|
lookahead != '\n' &&
|
||||||
|
lookahead != '\r' &&
|
||||||
|
lookahead != ' ')
|
||||||
|
ADVANCE(24);
|
||||||
|
END_STATE();
|
||||||
|
case 27:
|
||||||
|
ACCEPT_TOKEN(anon_sym_PIPE);
|
||||||
|
if (lookahead == '&')
|
||||||
|
ADVANCE(28);
|
||||||
|
if (lookahead != 0 &&
|
||||||
|
lookahead != '\t' &&
|
||||||
|
lookahead != '\n' &&
|
||||||
|
lookahead != '\r' &&
|
||||||
|
lookahead != ' ')
|
||||||
|
ADVANCE(24);
|
||||||
|
END_STATE();
|
||||||
|
case 28:
|
||||||
|
ACCEPT_TOKEN(anon_sym_PIPE_AMP);
|
||||||
|
if (lookahead != 0 &&
|
||||||
|
lookahead != '\t' &&
|
||||||
|
lookahead != '\n' &&
|
||||||
|
lookahead != '\r' &&
|
||||||
|
lookahead != ' ')
|
||||||
|
ADVANCE(24);
|
||||||
|
END_STATE();
|
||||||
|
case 29:
|
||||||
|
if (lookahead == '\t' ||
|
||||||
|
lookahead == '\n' ||
|
||||||
|
lookahead == '\r' ||
|
||||||
|
lookahead == ' ')
|
||||||
|
SKIP(29);
|
||||||
|
if (lookahead != 0)
|
||||||
|
ADVANCE(24);
|
||||||
|
END_STATE();
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static TSLexMode ts_lex_modes[STATE_COUNT] = {
|
||||||
|
[0] = {.lex_state = 0},
|
||||||
|
[1] = {.lex_state = 9},
|
||||||
|
[2] = {.lex_state = 11},
|
||||||
|
[3] = {.lex_state = 16},
|
||||||
|
[4] = {.lex_state = 9},
|
||||||
|
[5] = {.lex_state = 17},
|
||||||
|
[6] = {.lex_state = 19},
|
||||||
|
[7] = {.lex_state = 20},
|
||||||
|
[8] = {.lex_state = 9},
|
||||||
|
[9] = {.lex_state = 20},
|
||||||
|
[10] = {.lex_state = 21},
|
||||||
|
[11] = {.lex_state = 29},
|
||||||
|
[12] = {.lex_state = 20},
|
||||||
|
[13] = {.lex_state = 20},
|
||||||
|
[14] = {.lex_state = 9},
|
||||||
|
[15] = {.lex_state = 9},
|
||||||
|
[16] = {.lex_state = 11},
|
||||||
|
[17] = {.lex_state = 20},
|
||||||
|
[18] = {.lex_state = 21},
|
||||||
|
[19] = {.lex_state = 21},
|
||||||
|
[20] = {.lex_state = 20},
|
||||||
|
[21] = {.lex_state = 19},
|
||||||
|
[22] = {.lex_state = 17},
|
||||||
|
[23] = {.lex_state = 19},
|
||||||
|
[24] = {.lex_state = 21},
|
||||||
|
[25] = {.lex_state = 21},
|
||||||
|
[26] = {.lex_state = 21},
|
||||||
|
[27] = {.lex_state = 21},
|
||||||
|
[28] = {.lex_state = 9},
|
||||||
|
[29] = {.lex_state = 17},
|
||||||
|
[30] = {.lex_state = 19},
|
||||||
|
[31] = {.lex_state = 20},
|
||||||
|
[32] = {.lex_state = 21},
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t ts_parse_table[STATE_COUNT][SYMBOL_COUNT] = {
|
||||||
|
[0] = {
|
||||||
|
[sym_program] = STATE(3),
|
||||||
|
[sym_command] = STATE(28),
|
||||||
|
[sym_simple_command] = STATE(29),
|
||||||
|
[sym_pipeline] = STATE(30),
|
||||||
|
[sym_list] = STATE(6),
|
||||||
|
[sym_environment_variable_assignment] = STATE(31),
|
||||||
|
[aux_sym_program_repeat1] = STATE(8),
|
||||||
|
[aux_sym_simple_command_repeat1] = STATE(9),
|
||||||
|
[aux_sym_simple_command_repeat2] = STATE(32),
|
||||||
|
[ts_builtin_sym_end] = ACTIONS(1),
|
||||||
|
[aux_sym_SLASH_BSLASHs_PLUS_SLASH] = ACTIONS(3),
|
||||||
|
[anon_sym_PIPE] = ACTIONS(5),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(7),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(7),
|
||||||
|
[anon_sym_EQ] = ACTIONS(9),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(11),
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
[sym_program] = STATE(3),
|
||||||
|
[sym_command] = STATE(4),
|
||||||
|
[sym_simple_command] = STATE(5),
|
||||||
|
[sym_pipeline] = STATE(6),
|
||||||
|
[sym_list] = STATE(6),
|
||||||
|
[sym_environment_variable_assignment] = STATE(7),
|
||||||
|
[aux_sym_program_repeat1] = STATE(8),
|
||||||
|
[aux_sym_simple_command_repeat1] = STATE(9),
|
||||||
|
[ts_builtin_sym_end] = ACTIONS(13),
|
||||||
|
[sym_leading_word] = ACTIONS(15),
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
[aux_sym_SLASH_BSLASHs_PLUS_SLASH] = ACTIONS(17),
|
||||||
|
[anon_sym_PIPE] = ACTIONS(19),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(19),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(19),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(19),
|
||||||
|
[anon_sym_EQ] = ACTIONS(21),
|
||||||
|
[anon_sym_LF] = ACTIONS(19),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(19),
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
[ts_builtin_sym_end] = ACTIONS(23),
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
[ts_builtin_sym_end] = ACTIONS(25),
|
||||||
|
[sym_leading_word] = ACTIONS(27),
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
[anon_sym_PIPE] = ACTIONS(29),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(29),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(31),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(31),
|
||||||
|
[anon_sym_LF] = ACTIONS(33),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(33),
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(31),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(31),
|
||||||
|
[anon_sym_LF] = ACTIONS(33),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(33),
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
[sym_leading_word] = ACTIONS(35),
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
[sym_command] = STATE(15),
|
||||||
|
[sym_simple_command] = STATE(5),
|
||||||
|
[sym_pipeline] = STATE(6),
|
||||||
|
[sym_list] = STATE(6),
|
||||||
|
[sym_environment_variable_assignment] = STATE(7),
|
||||||
|
[aux_sym_simple_command_repeat1] = STATE(9),
|
||||||
|
[ts_builtin_sym_end] = ACTIONS(37),
|
||||||
|
[sym_leading_word] = ACTIONS(15),
|
||||||
|
},
|
||||||
|
[9] = {
|
||||||
|
[sym_environment_variable_assignment] = STATE(17),
|
||||||
|
[sym_leading_word] = ACTIONS(39),
|
||||||
|
},
|
||||||
|
[10] = {
|
||||||
|
[aux_sym_simple_command_repeat2] = STATE(19),
|
||||||
|
[anon_sym_PIPE] = ACTIONS(41),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(41),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(41),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(41),
|
||||||
|
[sym_word] = ACTIONS(43),
|
||||||
|
[anon_sym_LF] = ACTIONS(41),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(41),
|
||||||
|
},
|
||||||
|
[11] = {
|
||||||
|
[sym_word] = ACTIONS(45),
|
||||||
|
},
|
||||||
|
[12] = {
|
||||||
|
[sym_simple_command] = STATE(21),
|
||||||
|
[sym_environment_variable_assignment] = STATE(7),
|
||||||
|
[aux_sym_simple_command_repeat1] = STATE(9),
|
||||||
|
[sym_leading_word] = ACTIONS(15),
|
||||||
|
},
|
||||||
|
[13] = {
|
||||||
|
[sym_simple_command] = STATE(22),
|
||||||
|
[sym_pipeline] = STATE(23),
|
||||||
|
[sym_environment_variable_assignment] = STATE(7),
|
||||||
|
[aux_sym_simple_command_repeat1] = STATE(9),
|
||||||
|
[sym_leading_word] = ACTIONS(15),
|
||||||
|
},
|
||||||
|
[14] = {
|
||||||
|
[ts_builtin_sym_end] = ACTIONS(47),
|
||||||
|
[sym_leading_word] = ACTIONS(49),
|
||||||
|
},
|
||||||
|
[15] = {
|
||||||
|
[ts_builtin_sym_end] = ACTIONS(51),
|
||||||
|
[sym_leading_word] = ACTIONS(53),
|
||||||
|
},
|
||||||
|
[16] = {
|
||||||
|
[aux_sym_SLASH_BSLASHs_PLUS_SLASH] = ACTIONS(55),
|
||||||
|
[anon_sym_PIPE] = ACTIONS(57),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(57),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(57),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(57),
|
||||||
|
[anon_sym_EQ] = ACTIONS(21),
|
||||||
|
[anon_sym_LF] = ACTIONS(57),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(57),
|
||||||
|
},
|
||||||
|
[17] = {
|
||||||
|
[sym_leading_word] = ACTIONS(59),
|
||||||
|
},
|
||||||
|
[18] = {
|
||||||
|
[anon_sym_PIPE] = ACTIONS(61),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(61),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(61),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(61),
|
||||||
|
[sym_word] = ACTIONS(61),
|
||||||
|
[anon_sym_LF] = ACTIONS(61),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(61),
|
||||||
|
},
|
||||||
|
[19] = {
|
||||||
|
[anon_sym_PIPE] = ACTIONS(63),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(63),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(63),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(63),
|
||||||
|
[sym_word] = ACTIONS(65),
|
||||||
|
[anon_sym_LF] = ACTIONS(63),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(63),
|
||||||
|
},
|
||||||
|
[20] = {
|
||||||
|
[sym_leading_word] = ACTIONS(67),
|
||||||
|
},
|
||||||
|
[21] = {
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(69),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(69),
|
||||||
|
[anon_sym_LF] = ACTIONS(69),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(69),
|
||||||
|
},
|
||||||
|
[22] = {
|
||||||
|
[anon_sym_PIPE] = ACTIONS(29),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(29),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(71),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(71),
|
||||||
|
[anon_sym_LF] = ACTIONS(71),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(71),
|
||||||
|
},
|
||||||
|
[23] = {
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(71),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(71),
|
||||||
|
[anon_sym_LF] = ACTIONS(71),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(71),
|
||||||
|
},
|
||||||
|
[24] = {
|
||||||
|
[aux_sym_simple_command_repeat2] = STATE(26),
|
||||||
|
[anon_sym_PIPE] = ACTIONS(73),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(73),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(73),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(73),
|
||||||
|
[sym_word] = ACTIONS(43),
|
||||||
|
[anon_sym_LF] = ACTIONS(73),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(73),
|
||||||
|
},
|
||||||
|
[25] = {
|
||||||
|
[anon_sym_PIPE] = ACTIONS(75),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(75),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(75),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(75),
|
||||||
|
[sym_word] = ACTIONS(75),
|
||||||
|
[anon_sym_LF] = ACTIONS(75),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(75),
|
||||||
|
},
|
||||||
|
[26] = {
|
||||||
|
[anon_sym_PIPE] = ACTIONS(77),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(77),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(77),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(77),
|
||||||
|
[sym_word] = ACTIONS(65),
|
||||||
|
[anon_sym_LF] = ACTIONS(77),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(77),
|
||||||
|
},
|
||||||
|
[27] = {
|
||||||
|
[aux_sym_simple_command_repeat2] = STATE(32),
|
||||||
|
[anon_sym_PIPE] = ACTIONS(79),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(79),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(79),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(79),
|
||||||
|
[sym_word] = ACTIONS(43),
|
||||||
|
[anon_sym_LF] = ACTIONS(79),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(79),
|
||||||
|
},
|
||||||
|
[28] = {
|
||||||
|
[ts_builtin_sym_end] = ACTIONS(82),
|
||||||
|
[sym_leading_word] = ACTIONS(85),
|
||||||
|
},
|
||||||
|
[29] = {
|
||||||
|
[anon_sym_PIPE] = ACTIONS(29),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(29),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(88),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(88),
|
||||||
|
[anon_sym_LF] = ACTIONS(92),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(92),
|
||||||
|
},
|
||||||
|
[30] = {
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(96),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(96),
|
||||||
|
[anon_sym_LF] = ACTIONS(99),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(99),
|
||||||
|
},
|
||||||
|
[31] = {
|
||||||
|
[sym_leading_word] = ACTIONS(102),
|
||||||
|
},
|
||||||
|
[32] = {
|
||||||
|
[anon_sym_PIPE] = ACTIONS(105),
|
||||||
|
[anon_sym_PIPE_AMP] = ACTIONS(105),
|
||||||
|
[anon_sym_AMP_AMP] = ACTIONS(105),
|
||||||
|
[anon_sym_SEMI] = ACTIONS(105),
|
||||||
|
[sym_word] = ACTIONS(65),
|
||||||
|
[anon_sym_LF] = ACTIONS(105),
|
||||||
|
[anon_sym_SEMI_SEMI] = ACTIONS(105),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static TSParseActionEntry ts_parse_actions[] = {
|
||||||
|
[0] = {.count = 0, .reusable = false, .depends_on_lookahead = false},
|
||||||
|
[1] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, RECOVER(0),
|
||||||
|
[3] = {.count = 1, .reusable = true, .depends_on_lookahead = true}, RECOVER(27),
|
||||||
|
[5] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, RECOVER(12),
|
||||||
|
[7] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, RECOVER(13),
|
||||||
|
[9] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, RECOVER(11),
|
||||||
|
[11] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, RECOVER(14),
|
||||||
|
[13] = {.count = 1, .reusable = true, .depends_on_lookahead = false}, REDUCE(sym_program, 0),
|
||||||
|
[15] = {.count = 1, .reusable = true, .depends_on_lookahead = true}, SHIFT(2),
|
||||||
|
[17] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, SHIFT(10),
|
||||||
|
[19] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_simple_command, 1, .rename_sequence_id = 1),
|
||||||
|
[21] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, SHIFT(11),
|
||||||
|
[23] = {.count = 1, .reusable = true, .depends_on_lookahead = false}, ACCEPT_INPUT(),
|
||||||
|
[25] = {.count = 1, .reusable = true, .depends_on_lookahead = false}, REDUCE(aux_sym_program_repeat1, 1),
|
||||||
|
[27] = {.count = 1, .reusable = true, .depends_on_lookahead = true}, REDUCE(aux_sym_program_repeat1, 1),
|
||||||
|
[29] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, SHIFT(12),
|
||||||
|
[31] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, SHIFT(13),
|
||||||
|
[33] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, SHIFT(14),
|
||||||
|
[35] = {.count = 1, .reusable = true, .depends_on_lookahead = true}, REDUCE(aux_sym_simple_command_repeat1, 1),
|
||||||
|
[37] = {.count = 1, .reusable = true, .depends_on_lookahead = false}, REDUCE(sym_program, 1),
|
||||||
|
[39] = {.count = 1, .reusable = true, .depends_on_lookahead = true}, SHIFT(16),
|
||||||
|
[41] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_simple_command, 2, .rename_sequence_id = 2),
|
||||||
|
[43] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, SHIFT(18),
|
||||||
|
[45] = {.count = 1, .reusable = true, .depends_on_lookahead = true}, SHIFT(20),
|
||||||
|
[47] = {.count = 1, .reusable = true, .depends_on_lookahead = false}, REDUCE(sym_command, 2),
|
||||||
|
[49] = {.count = 1, .reusable = true, .depends_on_lookahead = true}, REDUCE(sym_command, 2),
|
||||||
|
[51] = {.count = 1, .reusable = true, .depends_on_lookahead = false}, REDUCE(aux_sym_program_repeat1, 2),
|
||||||
|
[53] = {.count = 1, .reusable = true, .depends_on_lookahead = true}, REDUCE(aux_sym_program_repeat1, 2),
|
||||||
|
[55] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, SHIFT(24),
|
||||||
|
[57] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_simple_command, 2, .rename_sequence_id = 3),
|
||||||
|
[59] = {.count = 1, .reusable = true, .depends_on_lookahead = true}, REDUCE(aux_sym_simple_command_repeat1, 2),
|
||||||
|
[61] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, REDUCE(aux_sym_simple_command_repeat2, 1, .rename_sequence_id = 4),
|
||||||
|
[63] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_simple_command, 3, .rename_sequence_id = 5),
|
||||||
|
[65] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, SHIFT(25),
|
||||||
|
[67] = {.count = 1, .reusable = true, .depends_on_lookahead = true}, REDUCE(sym_environment_variable_assignment, 3, .rename_sequence_id = 6),
|
||||||
|
[69] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_pipeline, 3),
|
||||||
|
[71] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_list, 3),
|
||||||
|
[73] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_simple_command, 3, .rename_sequence_id = 7),
|
||||||
|
[75] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, REDUCE(aux_sym_simple_command_repeat2, 2, .rename_sequence_id = 8),
|
||||||
|
[77] = {.count = 1, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_simple_command, 4, .rename_sequence_id = 9),
|
||||||
|
[79] = {.count = 2, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_simple_command, 2, .rename_sequence_id = 2), REDUCE(sym_simple_command, 3, .rename_sequence_id = 7),
|
||||||
|
[82] = {.count = 2, .reusable = true, .depends_on_lookahead = false}, REDUCE(aux_sym_program_repeat1, 1), REDUCE(aux_sym_program_repeat1, 2),
|
||||||
|
[85] = {.count = 2, .reusable = true, .depends_on_lookahead = true}, REDUCE(aux_sym_program_repeat1, 1), REDUCE(aux_sym_program_repeat1, 2),
|
||||||
|
[88] = {.count = 3, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_pipeline, 3), REDUCE(sym_list, 3), SHIFT(13),
|
||||||
|
[92] = {.count = 3, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_pipeline, 3), REDUCE(sym_list, 3), SHIFT(14),
|
||||||
|
[96] = {.count = 2, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_list, 3), SHIFT(13),
|
||||||
|
[99] = {.count = 2, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_list, 3), SHIFT(14),
|
||||||
|
[102] = {.count = 2, .reusable = true, .depends_on_lookahead = true}, REDUCE(aux_sym_simple_command_repeat1, 1), REDUCE(aux_sym_simple_command_repeat1, 2),
|
||||||
|
[105] = {.count = 2, .reusable = false, .depends_on_lookahead = false}, REDUCE(sym_simple_command, 3, .rename_sequence_id = 5), REDUCE(sym_simple_command, 4, .rename_sequence_id = 9),
|
||||||
|
};
|
||||||
|
|
||||||
|
const TSLanguage *tree_sitter_bash() {
|
||||||
|
GET_LANGUAGE();
|
||||||
|
}
|
|
@ -0,0 +1,195 @@
|
||||||
|
#ifndef TREE_SITTER_PARSER_H_
|
||||||
|
#define TREE_SITTER_PARSER_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef uint16_t TSSymbol;
|
||||||
|
typedef uint16_t TSStateId;
|
||||||
|
typedef uint8_t TSExternalTokenState[16];
|
||||||
|
|
||||||
|
#define ts_builtin_sym_error ((TSSymbol)-1)
|
||||||
|
#define ts_builtin_sym_end 0
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool visible : 1;
|
||||||
|
bool named : 1;
|
||||||
|
bool extra : 1;
|
||||||
|
bool structural : 1;
|
||||||
|
} TSSymbolMetadata;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void (*advance)(void *, bool);
|
||||||
|
void (*mark_end)(void *);
|
||||||
|
int32_t lookahead;
|
||||||
|
TSSymbol result_symbol;
|
||||||
|
} TSLexer;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TSParseActionTypeShift,
|
||||||
|
TSParseActionTypeReduce,
|
||||||
|
TSParseActionTypeAccept,
|
||||||
|
TSParseActionTypeRecover,
|
||||||
|
} TSParseActionType;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
TSStateId to_state;
|
||||||
|
bool extra : 1;
|
||||||
|
};
|
||||||
|
struct {
|
||||||
|
TSSymbol symbol;
|
||||||
|
int16_t dynamic_precedence;
|
||||||
|
uint8_t child_count;
|
||||||
|
uint8_t rename_sequence_id : 7;
|
||||||
|
bool fragile : 1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
TSParseActionType type : 4;
|
||||||
|
} TSParseAction;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t lex_state;
|
||||||
|
uint16_t external_lex_state;
|
||||||
|
} TSLexMode;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
TSParseAction action;
|
||||||
|
struct {
|
||||||
|
uint8_t count;
|
||||||
|
bool reusable : 1;
|
||||||
|
bool depends_on_lookahead : 1;
|
||||||
|
};
|
||||||
|
} TSParseActionEntry;
|
||||||
|
|
||||||
|
typedef struct TSLanguage {
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t symbol_count;
|
||||||
|
uint32_t token_count;
|
||||||
|
uint32_t external_token_count;
|
||||||
|
const char **symbol_names;
|
||||||
|
const TSSymbolMetadata *symbol_metadata;
|
||||||
|
const uint16_t *parse_table;
|
||||||
|
const TSParseActionEntry *parse_actions;
|
||||||
|
const TSLexMode *lex_modes;
|
||||||
|
const TSSymbol *rename_sequences;
|
||||||
|
uint16_t max_rename_sequence_length;
|
||||||
|
bool (*lex_fn)(TSLexer *, TSStateId);
|
||||||
|
struct {
|
||||||
|
const bool *states;
|
||||||
|
const TSSymbol *symbol_map;
|
||||||
|
void *(*create)();
|
||||||
|
void (*destroy)(void *);
|
||||||
|
void (*reset)(void *);
|
||||||
|
bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);
|
||||||
|
bool (*serialize)(void *, TSExternalTokenState);
|
||||||
|
void (*deserialize)(void *, const TSExternalTokenState);
|
||||||
|
} external_scanner;
|
||||||
|
} TSLanguage;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lexer Macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define START_LEXER() \
|
||||||
|
bool result = false; \
|
||||||
|
int32_t lookahead; \
|
||||||
|
next_state: \
|
||||||
|
lookahead = lexer->lookahead;
|
||||||
|
|
||||||
|
#define ADVANCE(state_value) \
|
||||||
|
{ \
|
||||||
|
lexer->advance(lexer, false); \
|
||||||
|
state = state_value; \
|
||||||
|
goto next_state; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SKIP(state_value) \
|
||||||
|
{ \
|
||||||
|
lexer->advance(lexer, 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 STATE(id) id
|
||||||
|
#define ACTIONS(id) id
|
||||||
|
|
||||||
|
#define SHIFT(to_state_value) \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
.type = TSParseActionTypeShift, \
|
||||||
|
.to_state = to_state_value, \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define RECOVER(to_state_value) \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
.type = TSParseActionTypeRecover, \
|
||||||
|
.to_state = to_state_value \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SHIFT_EXTRA() \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
.type = TSParseActionTypeShift, \
|
||||||
|
.extra = true \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define REDUCE(symbol_val, child_count_val, ...) \
|
||||||
|
{ \
|
||||||
|
{ \
|
||||||
|
.type = TSParseActionTypeReduce, \
|
||||||
|
.symbol = symbol_val, \
|
||||||
|
.child_count = child_count_val, \
|
||||||
|
__VA_ARGS__ \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ACCEPT_INPUT() \
|
||||||
|
{ \
|
||||||
|
{ .type = TSParseActionTypeAccept } \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GET_LANGUAGE(...) \
|
||||||
|
static TSLanguage language = { \
|
||||||
|
.version = LANGUAGE_VERSION, \
|
||||||
|
.symbol_count = SYMBOL_COUNT, \
|
||||||
|
.token_count = TOKEN_COUNT, \
|
||||||
|
.symbol_metadata = ts_symbol_metadata, \
|
||||||
|
.parse_table = (const unsigned short *)ts_parse_table, \
|
||||||
|
.parse_actions = ts_parse_actions, \
|
||||||
|
.lex_modes = ts_lex_modes, \
|
||||||
|
.symbol_names = ts_symbol_names, \
|
||||||
|
.rename_sequences = (const TSSymbol *)ts_rename_sequences, \
|
||||||
|
.max_rename_sequence_length = MAX_RENAME_SEQUENCE_LENGTH, \
|
||||||
|
.lex_fn = ts_lex, \
|
||||||
|
.external_token_count = EXTERNAL_TOKEN_COUNT, \
|
||||||
|
.external_scanner = {__VA_ARGS__} \
|
||||||
|
}; \
|
||||||
|
return &language \
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // TREE_SITTER_PARSER_H_
|
Loading…
Reference in New Issue