fix impatient not found on bootstrap
This commit is contained in:
parent
33c304f627
commit
074b656cbd
|
@ -10,7 +10,7 @@ M.lazy_load = function(tb)
|
|||
callback = function()
|
||||
if tb.condition() then
|
||||
vim.api.nvim_del_augroup_by_name(tb.augroup_name)
|
||||
require "impatient"
|
||||
pcall(require, "impatient")
|
||||
|
||||
-- dont defer for treesitter as it will show slow highlighting
|
||||
-- This deferring only happens only when we do "nvim filename"
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
" perl plugins
|
||||
|
||||
|
||||
" node plugins
|
||||
|
||||
|
||||
" python3 plugins
|
||||
|
||||
|
||||
" ruby plugins
|
||||
|
||||
|
||||
" python plugins
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 9b76787e273567c0e3027304bd16ffedc751c04c
|
|
@ -0,0 +1 @@
|
|||
Subproject commit ac27343b52796a0aa1bb3db824d16e66d1def182
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 62fc67a2b0205136bc3e312664624ba2ab4a9323
|
|
@ -0,0 +1 @@
|
|||
Subproject commit affe808a5c56b71630f17aa7c38e15c59fd648a8
|
|
@ -0,0 +1 @@
|
|||
Subproject commit d276254e7198ab7d00f117e88e223b4bd8c02d21
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 447c87cdd6e6d6a1d2488b1d43108bfa217f56e1
|
|
@ -0,0 +1 @@
|
|||
Subproject commit a9de941bcbda508d0a45d28ae366bb3f08db2e36
|
|
@ -0,0 +1 @@
|
|||
Subproject commit e82d9f5e612ade06202591ed76ecb095e946f7f8
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 7339def34e46237eb7c9a893cb7d42dcb90e05e6
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 9c3ca027661136a618c82275427746e481c84a4e
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 4ccbe749ce439fa25d387d459e8c339131cc5d1f
|
|
@ -0,0 +1 @@
|
|||
Subproject commit c15bbe9f23d88b5c0b4ca45a446e01a0a3913707
|
|
@ -0,0 +1 @@
|
|||
Subproject commit cd1af57253b3ac3652765e4d0f83b56802ec2a5f
|
|
@ -0,0 +1 @@
|
|||
Subproject commit ca89ab9e7e42aa9279f1cdad15398d6e18ccee86
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 706371f1300e7c0acb98b346f80dad2dd9b5f679
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 8fe6ec269c6bcd19a7c2d69cb0bdcf8bb86a85fe
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 6e047f11861bfb6ec28a6ad0138a8f0a62bb8806
|
|
@ -0,0 +1 @@
|
|||
Subproject commit ff6e7966f39a897ac4d1358f4d022cfecdc88ff1
|
|
@ -0,0 +1 @@
|
|||
Subproject commit a9a6493b1eeba458757903352e0d3dc4b54fd4f2
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 2d02a56189e2bde11edd4712fea16f08a6656944
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 1317d6238f089e117e3ed98b3cecc37cc4364675
|
|
@ -0,0 +1 @@
|
|||
Subproject commit afab89594f4f702dc3368769c95b782dbdaeaf0a
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 31807eef4ed574854b8a53ae40ea3292033a78ea
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 4725867ec66b9a0f5e5ad95a1fd94c2f97fa2d2c
|
|
@ -0,0 +1 @@
|
|||
Subproject commit bca1182e872db0ea52d86b2f4cf4ee7cb092de45
|
|
@ -0,0 +1 @@
|
|||
Subproject commit dfdcff9c6b2bd1ad3c364973a2497bf62c6f0f20
|
|
@ -0,0 +1,22 @@
|
|||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v2.1.2
|
||||
with:
|
||||
node-version: '16.x'
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
- name: Test
|
||||
run: npm run test
|
|
@ -0,0 +1,11 @@
|
|||
*.log
|
||||
*.tgz
|
||||
.DS_Store
|
||||
Cargo.lock
|
||||
build
|
||||
node_modules
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
target
|
||||
|
||||
examples/luvit
|
|
@ -0,0 +1,2 @@
|
|||
bindings/
|
||||
src/
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"singleQuote": true
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
[package]
|
||||
name = "tree-sitter-lua"
|
||||
description = "Lua grammar for the tree-sitter parsing library"
|
||||
version = "0.0.12"
|
||||
authors = [
|
||||
"Munif Tanjim <hello@muniftanjim.dev>",
|
||||
]
|
||||
license = "MIT"
|
||||
keywords = ["incremental", "parsing", "lua"]
|
||||
categories = ["parsing", "text-editors"]
|
||||
repository = "https://github.com/MunifTanjim/tree-sitter-lua"
|
||||
edition = "2018"
|
||||
|
||||
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 Munif Tanjim
|
||||
|
||||
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,20 @@
|
|||
![GitHub Workflow Status: CI](https://img.shields.io/github/workflow/status/MunifTanjim/tree-sitter-lua/CI/main?label=CI&style=for-the-badge)
|
||||
|
||||
# tree-sitter-lua
|
||||
|
||||
Lua grammar for tree-sitter.
|
||||
|
||||
## References
|
||||
|
||||
- [Lua Documentation](https://www.lua.org/docs.html)
|
||||
|
||||
## Acknowledgement
|
||||
|
||||
The [external scanner](/src/scanner.c) was based on these repositories:
|
||||
|
||||
- [Azganoth/tree-sitter-lua](https://github.com/Azganoth/tree-sitter-lua)
|
||||
- [euclidianAce/tree-sitter-teal](https://github.com/euclidianAce/tree-sitter-teal)
|
||||
|
||||
## License
|
||||
|
||||
Licensed under the MIT License. Check the [LICENSE](/LICENSE.md) file for details.
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"targets": [
|
||||
{
|
||||
"target_name": "tree_sitter_lua_binding",
|
||||
"include_dirs": [
|
||||
"<!(node -e \"require('nan')\")",
|
||||
"src"
|
||||
],
|
||||
"sources": [
|
||||
"src/parser.c",
|
||||
"src/scanner.c",
|
||||
"bindings/node/binding.cc"
|
||||
],
|
||||
"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_lua();
|
||||
|
||||
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_lua());
|
||||
|
||||
Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("lua").ToLocalChecked());
|
||||
Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance);
|
||||
}
|
||||
|
||||
NODE_MODULE(tree_sitter_lua_binding, Init)
|
||||
|
||||
} // namespace
|
|
@ -0,0 +1,19 @@
|
|||
try {
|
||||
module.exports = require("../../build/Release/tree_sitter_lua_binding");
|
||||
} catch (error1) {
|
||||
if (error1.code !== 'MODULE_NOT_FOUND') {
|
||||
throw error1;
|
||||
}
|
||||
try {
|
||||
module.exports = require("../../build/Debug/tree_sitter_lua_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 lua 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_lua::language()).expect("Error loading lua 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_lua() -> 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_lua() }
|
||||
}
|
||||
|
||||
/// 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 lua language");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/env lua
|
||||
|
||||
return 42
|
|
@ -0,0 +1,504 @@
|
|||
const PREC = {
|
||||
OR: 1, // or
|
||||
AND: 2, // and
|
||||
COMPARE: 3, // < > <= >= ~= ==
|
||||
BIT_OR: 4, // |
|
||||
BIT_NOT: 5, // ~
|
||||
BIT_AND: 6, // &
|
||||
BIT_SHIFT: 7, // << >>
|
||||
CONCAT: 8, // ..
|
||||
PLUS: 9, // + -
|
||||
MULTI: 10, // * / // %
|
||||
UNARY: 11, // not # - ~
|
||||
POWER: 12, // ^
|
||||
};
|
||||
|
||||
const list_seq = (rule, separator, trailing_separator = false) =>
|
||||
trailing_separator
|
||||
? seq(rule, repeat(seq(separator, rule)), optional(separator))
|
||||
: seq(rule, repeat(seq(separator, rule)));
|
||||
|
||||
const optional_block = ($) => alias(optional($._block), $.block);
|
||||
|
||||
// namelist ::= Name {',' Name}
|
||||
const name_list = ($) => list_seq(field('name', $.identifier), ',');
|
||||
|
||||
module.exports = grammar({
|
||||
name: 'lua',
|
||||
|
||||
extras: ($) => [$.comment, /\s/],
|
||||
|
||||
externals: ($) => [
|
||||
$._block_comment_start,
|
||||
$._block_comment_content,
|
||||
$._block_comment_end,
|
||||
|
||||
$._string_start,
|
||||
$._string_content,
|
||||
$._string_end,
|
||||
],
|
||||
|
||||
supertypes: ($) => [$.statement, $.expression, $.declaration, $.variable],
|
||||
|
||||
word: ($) => $.identifier,
|
||||
|
||||
rules: {
|
||||
// chunk ::= block
|
||||
chunk: ($) =>
|
||||
seq(
|
||||
optional($.hash_bang_line),
|
||||
repeat($.statement),
|
||||
optional($.return_statement)
|
||||
),
|
||||
|
||||
hash_bang_line: (_) => /#!.*/,
|
||||
|
||||
// block ::= {stat} [retstat]
|
||||
_block: ($) =>
|
||||
choice(
|
||||
seq(repeat1($.statement), optional($.return_statement)),
|
||||
seq(repeat($.statement), $.return_statement)
|
||||
),
|
||||
|
||||
/*
|
||||
stat ::= ';' |
|
||||
varlist '=' explist |
|
||||
functioncall |
|
||||
label |
|
||||
break |
|
||||
goto Name |
|
||||
do block end |
|
||||
while exp do block end |
|
||||
repeat block until exp |
|
||||
if exp then block {elseif exp then block} [else block] end |
|
||||
for Name '=' exp ',' exp [',' exp] do block end |
|
||||
for namelist in explist do block end |
|
||||
function funcname funcbody |
|
||||
local function Name funcbody |
|
||||
local namelist ['=' explist]
|
||||
*/
|
||||
statement: ($) =>
|
||||
choice(
|
||||
$.empty_statement,
|
||||
$.assignment_statement,
|
||||
$.function_call,
|
||||
$.label_statement,
|
||||
$.break_statement,
|
||||
$.goto_statement,
|
||||
$.do_statement,
|
||||
$.while_statement,
|
||||
$.repeat_statement,
|
||||
$.if_statement,
|
||||
$.for_statement,
|
||||
$.declaration
|
||||
),
|
||||
|
||||
// retstat ::= return [explist] [';']
|
||||
return_statement: ($) =>
|
||||
seq(
|
||||
'return',
|
||||
optional(alias($._expression_list, $.expression_list)),
|
||||
optional(';')
|
||||
),
|
||||
|
||||
// ';'
|
||||
empty_statement: (_) => ';',
|
||||
|
||||
// varlist '=' explist
|
||||
assignment_statement: ($) =>
|
||||
seq(
|
||||
alias($._variable_assignment_varlist, $.variable_list),
|
||||
'=',
|
||||
alias($._variable_assignment_explist, $.expression_list)
|
||||
),
|
||||
// varlist ::= var {',' var}
|
||||
_variable_assignment_varlist: ($) =>
|
||||
list_seq(field('name', $.variable), ','),
|
||||
// explist ::= exp {',' exp}
|
||||
_variable_assignment_explist: ($) =>
|
||||
list_seq(field('value', $.expression), ','),
|
||||
|
||||
// label ::= '::' Name '::'
|
||||
label_statement: ($) => seq('::', $.identifier, '::'),
|
||||
|
||||
// break
|
||||
break_statement: (_) => 'break',
|
||||
|
||||
// goto Name
|
||||
goto_statement: ($) => seq('goto', $.identifier),
|
||||
|
||||
// do block end
|
||||
do_statement: ($) => seq('do', field('body', optional_block($)), 'end'),
|
||||
|
||||
// while exp do block end
|
||||
while_statement: ($) =>
|
||||
seq(
|
||||
'while',
|
||||
field('condition', $.expression),
|
||||
'do',
|
||||
field('body', optional_block($)),
|
||||
'end'
|
||||
),
|
||||
|
||||
// repeat block until exp
|
||||
repeat_statement: ($) =>
|
||||
seq(
|
||||
'repeat',
|
||||
field('body', optional_block($)),
|
||||
'until',
|
||||
field('condition', $.expression)
|
||||
),
|
||||
|
||||
// if exp then block {elseif exp then block} [else block] end
|
||||
if_statement: ($) =>
|
||||
seq(
|
||||
'if',
|
||||
field('condition', $.expression),
|
||||
'then',
|
||||
field('consequence', optional_block($)),
|
||||
repeat(field('alternative', $.elseif_statement)),
|
||||
optional(field('alternative', $.else_statement)),
|
||||
'end'
|
||||
),
|
||||
// elseif exp then block
|
||||
elseif_statement: ($) =>
|
||||
seq(
|
||||
'elseif',
|
||||
field('condition', $.expression),
|
||||
'then',
|
||||
field('consequence', optional_block($))
|
||||
),
|
||||
// else block
|
||||
else_statement: ($) => seq('else', field('body', optional_block($))),
|
||||
|
||||
// for Name '=' exp ',' exp [',' exp] do block end
|
||||
// for namelist in explist do block end
|
||||
for_statement: ($) =>
|
||||
seq(
|
||||
'for',
|
||||
field('clause', choice($.for_generic_clause, $.for_numeric_clause)),
|
||||
'do',
|
||||
field('body', optional_block($)),
|
||||
'end'
|
||||
),
|
||||
// namelist in explist
|
||||
for_generic_clause: ($) =>
|
||||
seq(
|
||||
alias($._name_list, $.variable_list),
|
||||
'in',
|
||||
alias($._expression_list, $.expression_list)
|
||||
),
|
||||
// Name '=' exp ',' exp [',' exp]
|
||||
for_numeric_clause: ($) =>
|
||||
seq(
|
||||
field('name', $.identifier),
|
||||
'=',
|
||||
field('start', $.expression),
|
||||
',',
|
||||
field('end', $.expression),
|
||||
optional(seq(',', field('step', $.expression)))
|
||||
),
|
||||
|
||||
// function funcname funcbody
|
||||
// local function Name funcbody
|
||||
// local namelist ['=' explist]
|
||||
declaration: ($) =>
|
||||
choice(
|
||||
$.function_declaration,
|
||||
field(
|
||||
'local_declaration',
|
||||
alias($._local_function_declaration, $.function_declaration)
|
||||
),
|
||||
field('local_declaration', $.variable_declaration)
|
||||
),
|
||||
// function funcname funcbody
|
||||
function_declaration: ($) =>
|
||||
seq('function', field('name', $._function_name), $._function_body),
|
||||
// local function Name funcbody
|
||||
_local_function_declaration: ($) =>
|
||||
seq('local', 'function', field('name', $.identifier), $._function_body),
|
||||
// funcname ::= Name {'.' Name} [':' Name]
|
||||
_function_name: ($) =>
|
||||
choice(
|
||||
$._function_name_prefix_expression,
|
||||
alias(
|
||||
$._function_name_method_index_expression,
|
||||
$.method_index_expression
|
||||
)
|
||||
),
|
||||
_function_name_prefix_expression: ($) =>
|
||||
choice(
|
||||
$.identifier,
|
||||
alias($._function_name_dot_index_expression, $.dot_index_expression)
|
||||
),
|
||||
_function_name_dot_index_expression: ($) =>
|
||||
seq(
|
||||
field('table', $._function_name_prefix_expression),
|
||||
'.',
|
||||
field('field', $.identifier)
|
||||
),
|
||||
_function_name_method_index_expression: ($) =>
|
||||
seq(
|
||||
field('table', $._function_name_prefix_expression),
|
||||
':',
|
||||
field('method', $.identifier)
|
||||
),
|
||||
|
||||
// local namelist ['=' explist]
|
||||
variable_declaration: ($) =>
|
||||
seq(
|
||||
'local',
|
||||
choice(
|
||||
alias($._name_list, $.variable_list),
|
||||
alias($._local_variable_assignment, $.assignment_statement)
|
||||
)
|
||||
),
|
||||
_local_variable_assignment: ($) =>
|
||||
seq(
|
||||
alias($._name_list, $.variable_list),
|
||||
'=',
|
||||
alias($._variable_assignment_explist, $.expression_list)
|
||||
),
|
||||
// namelist ::= Name {',' Name}
|
||||
_name_list: ($) => name_list($),
|
||||
|
||||
// explist ::= exp {',' exp}
|
||||
_expression_list: ($) => list_seq($.expression, ','),
|
||||
|
||||
/*
|
||||
exp ::= nil | false | true | Numeral | LiteralString | '...' | functiondef |
|
||||
prefixexp | tableconstructor | exp binop exp | unop exp
|
||||
*/
|
||||
expression: ($) =>
|
||||
choice(
|
||||
$.nil,
|
||||
$.false,
|
||||
$.true,
|
||||
$.number,
|
||||
$.string,
|
||||
$.vararg_expression,
|
||||
$.function_definition,
|
||||
$.variable,
|
||||
$.function_call,
|
||||
$.parenthesized_expression,
|
||||
$.table_constructor,
|
||||
$.binary_expression,
|
||||
$.unary_expression
|
||||
),
|
||||
|
||||
// nil
|
||||
nil: (_) => 'nil',
|
||||
|
||||
// false
|
||||
false: (_) => 'false',
|
||||
|
||||
// true
|
||||
true: (_) => 'true',
|
||||
|
||||
// Numeral
|
||||
number: (_) => {
|
||||
const decimal_digits = /[0-9]+/;
|
||||
const signed_integer = seq(optional(choice('-', '+')), decimal_digits);
|
||||
const decimal_exponent_part = seq(choice('e', 'E'), signed_integer);
|
||||
|
||||
const decimal_integer_literal = choice(
|
||||
'0',
|
||||
seq(optional('0'), /[1-9]/, optional(decimal_digits))
|
||||
);
|
||||
|
||||
const hex_digits = /[a-fA-F0-9]+/;
|
||||
const hex_exponent_part = seq(choice('p', 'P'), signed_integer);
|
||||
|
||||
const decimal_literal = choice(
|
||||
seq(
|
||||
decimal_integer_literal,
|
||||
'.',
|
||||
optional(decimal_digits),
|
||||
optional(decimal_exponent_part)
|
||||
),
|
||||
seq('.', decimal_digits, optional(decimal_exponent_part)),
|
||||
seq(decimal_integer_literal, optional(decimal_exponent_part))
|
||||
);
|
||||
|
||||
const hex_literal = seq(
|
||||
choice('0x', '0X'),
|
||||
hex_digits,
|
||||
optional(seq('.', hex_digits)),
|
||||
optional(hex_exponent_part)
|
||||
);
|
||||
|
||||
return token(choice(decimal_literal, hex_literal));
|
||||
},
|
||||
|
||||
// LiteralString
|
||||
string: ($) =>
|
||||
seq(
|
||||
field('start', alias($._string_start, 'string_start')),
|
||||
field('content', optional(alias($._string_content, 'string_content'))),
|
||||
field('end', alias($._string_end, 'string_end'))
|
||||
),
|
||||
|
||||
// '...'
|
||||
vararg_expression: (_) => '...',
|
||||
|
||||
// functiondef ::= function funcbody
|
||||
function_definition: ($) => seq('function', $._function_body),
|
||||
// funcbody ::= '(' [parlist] ')' block end
|
||||
_function_body: ($) =>
|
||||
seq(
|
||||
field('parameters', $.parameters),
|
||||
field('body', optional_block($)),
|
||||
'end'
|
||||
),
|
||||
// '(' [parlist] ')'
|
||||
parameters: ($) => seq('(', optional($._parameter_list), ')'),
|
||||
// parlist ::= namelist [',' '...'] | '...'
|
||||
_parameter_list: ($) =>
|
||||
choice(
|
||||
seq(name_list($), optional(seq(',', $.vararg_expression))),
|
||||
$.vararg_expression
|
||||
),
|
||||
|
||||
// prefixexp ::= var | functioncall | '(' exp ')'
|
||||
_prefix_expression: ($) =>
|
||||
prec(1, choice($.variable, $.function_call, $.parenthesized_expression)),
|
||||
|
||||
// var ::= Name | prefixexp [ exp ] | prefixexp . Name
|
||||
variable: ($) =>
|
||||
choice($.identifier, $.bracket_index_expression, $.dot_index_expression),
|
||||
// prefixexp [ exp ]
|
||||
bracket_index_expression: ($) =>
|
||||
seq(
|
||||
field('table', $._prefix_expression),
|
||||
'[',
|
||||
field('field', $.expression),
|
||||
']'
|
||||
),
|
||||
// prefixexp . Name
|
||||
dot_index_expression: ($) =>
|
||||
seq(
|
||||
field('table', $._prefix_expression),
|
||||
'.',
|
||||
field('field', $.identifier)
|
||||
),
|
||||
|
||||
// functioncall ::= prefixexp args | prefixexp ':' Name args
|
||||
function_call: ($) =>
|
||||
seq(
|
||||
field('name', choice($._prefix_expression, $.method_index_expression)),
|
||||
field('arguments', $.arguments)
|
||||
),
|
||||
// prefixexp ':' Name
|
||||
method_index_expression: ($) =>
|
||||
seq(
|
||||
field('table', $._prefix_expression),
|
||||
':',
|
||||
field('method', $.identifier)
|
||||
),
|
||||
// args ::= '(' [explist] ')' | tableconstructor | LiteralString
|
||||
arguments: ($) =>
|
||||
choice(
|
||||
seq('(', optional(list_seq($.expression, ',')), ')'),
|
||||
$.table_constructor,
|
||||
$.string
|
||||
),
|
||||
|
||||
// '(' exp ')'
|
||||
parenthesized_expression: ($) => seq('(', $.expression, ')'),
|
||||
|
||||
// tableconstructor ::= '{' [fieldlist] '}'
|
||||
table_constructor: ($) => seq('{', optional($._field_list), '}'),
|
||||
// fieldlist ::= field {fieldsep field} [fieldsep]
|
||||
_field_list: ($) => list_seq($.field, $._field_sep, true),
|
||||
// fieldsep ::= ',' | ';'
|
||||
_field_sep: (_) => choice(',', ';'),
|
||||
// field ::= '[' exp ']' '=' exp | Name '=' exp | exp
|
||||
field: ($) =>
|
||||
choice(
|
||||
seq(
|
||||
'[',
|
||||
field('name', $.expression),
|
||||
']',
|
||||
'=',
|
||||
field('value', $.expression)
|
||||
),
|
||||
seq(field('name', $.identifier), '=', field('value', $.expression)),
|
||||
field('value', $.expression)
|
||||
),
|
||||
|
||||
// exp binop exp
|
||||
binary_expression: ($) =>
|
||||
choice(
|
||||
...[
|
||||
['or', PREC.OR],
|
||||
['and', PREC.AND],
|
||||
['<', PREC.COMPARE],
|
||||
['<=', PREC.COMPARE],
|
||||
['==', PREC.COMPARE],
|
||||
['~=', PREC.COMPARE],
|
||||
['>=', PREC.COMPARE],
|
||||
['>', PREC.COMPARE],
|
||||
['|', PREC.BIT_OR],
|
||||
['~', PREC.BIT_NOT],
|
||||
['&', PREC.BIT_AND],
|
||||
['<<', PREC.BIT_SHIFT],
|
||||
['>>', PREC.BIT_SHIFT],
|
||||
['+', PREC.PLUS],
|
||||
['-', PREC.PLUS],
|
||||
['*', PREC.MULTI],
|
||||
['/', PREC.MULTI],
|
||||
['//', PREC.MULTI],
|
||||
['%', PREC.MULTI],
|
||||
].map(([operator, precedence]) =>
|
||||
prec.left(
|
||||
precedence,
|
||||
seq(
|
||||
field('left', $.expression),
|
||||
operator,
|
||||
field('right', $.expression)
|
||||
)
|
||||
)
|
||||
),
|
||||
...[
|
||||
['..', PREC.CONCAT],
|
||||
['^', PREC.POWER],
|
||||
].map(([operator, precedence]) =>
|
||||
prec.right(
|
||||
precedence,
|
||||
seq(
|
||||
field('left', $.expression),
|
||||
operator,
|
||||
field('right', $.expression)
|
||||
)
|
||||
)
|
||||
)
|
||||
),
|
||||
|
||||
// unop exp
|
||||
unary_expression: ($) =>
|
||||
prec.left(
|
||||
PREC.UNARY,
|
||||
seq(choice('not', '#', '-', '~'), field('operand', $.expression))
|
||||
),
|
||||
|
||||
// Name
|
||||
identifier: (_) => /[a-zA-Z_][a-zA-Z0-9_]*/,
|
||||
|
||||
// comment
|
||||
comment: ($) =>
|
||||
choice(
|
||||
seq(
|
||||
field('start', alias('--', 'comment_start')),
|
||||
field('content', alias(/[^\r\n]*/, 'comment_content'))
|
||||
),
|
||||
seq(
|
||||
field('start', alias($._block_comment_start, 'comment_start')),
|
||||
field(
|
||||
'content',
|
||||
optional(alias($._block_comment_content, 'comment_content'))
|
||||
),
|
||||
field('end', alias($._block_comment_end, 'comment_end'))
|
||||
)
|
||||
),
|
||||
},
|
||||
});
|
|
@ -0,0 +1,46 @@
|
|||
{
|
||||
"name": "@muniftanjim/tree-sitter-lua",
|
||||
"version": "0.0.12",
|
||||
"description": "Lua grammar for tree-sitter",
|
||||
"keywords": [
|
||||
"tree-sitter",
|
||||
"parser",
|
||||
"lua"
|
||||
],
|
||||
"homepage": "https://github.com/MunifTanjim/tree-sitter-lua#readme",
|
||||
"bugs": "https://github.com/MunifTanjim/tree-sitter-lua/issues",
|
||||
"license": "MIT",
|
||||
"author": "Munif Tanjim (https://muniftanjim.dev)",
|
||||
"files": [
|
||||
"bindings",
|
||||
"queries",
|
||||
"src",
|
||||
"binding.gyp",
|
||||
"grammar.js"
|
||||
],
|
||||
"main": "bindings/node",
|
||||
"repository": "https://github.com/MunifTanjim/tree-sitter-lua",
|
||||
"scripts": {
|
||||
"build": "tree-sitter generate",
|
||||
"postbuild": "node-gyp build",
|
||||
"test": "tree-sitter test",
|
||||
"posttest": "./script/parse-examples lua"
|
||||
},
|
||||
"dependencies": {
|
||||
"nan": "^2.14.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tree-sitter-cli": "^0.20.0"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"tree-sitter": [
|
||||
{
|
||||
"scope": "source.lua",
|
||||
"file-types": [
|
||||
"lua"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
cd "$(dirname "${0}")/.."
|
||||
|
||||
checkout_repo() {
|
||||
local -r path="${1}"
|
||||
local -r repo="${2}"
|
||||
local -r sha="${3}"
|
||||
|
||||
echo "Checking out github.com/${repo}#${sha} in ${path}"
|
||||
|
||||
mkdir -p "${path}"
|
||||
pushd "${path}" >/dev/null
|
||||
|
||||
if [[ ! -d ".git" ]]; then
|
||||
git init --quiet
|
||||
git remote add origin "https://github.com/${repo}.git"
|
||||
git fetch --quiet --depth 1 origin "${sha}"
|
||||
elif [[ "${sha}" != "$(git rev-parse HEAD)" ]]; then
|
||||
git fetch --quiet --depth 1 origin "${sha}"
|
||||
fi
|
||||
|
||||
git checkout --quiet FETCH_HEAD
|
||||
|
||||
popd >/dev/null
|
||||
|
||||
echo
|
||||
}
|
||||
|
||||
checkout_repo "./examples/luvit" "luvit/luvit" "9841bc17aaab32fa63e11063cf68f82da615eefd"
|
||||
|
||||
parse_examples() {
|
||||
local -r known_failures="$(cat script/known_failures.txt)"
|
||||
|
||||
tree-sitter parse --quiet \
|
||||
"./examples/luvit/**/*.lua" \
|
||||
$(for file in ${known_failures}; do echo "!${file}"; done)
|
||||
|
||||
declare -r example_count=$(find ./examples -name "*.lua" | wc -l)
|
||||
declare -r failure_count=$(wc -w <<< "${known_failures}")
|
||||
declare -r success_count=$(( ${example_count} - ${failure_count} ))
|
||||
declare -r success_percent=$(bc -l <<< "100*${success_count}/${example_count}")
|
||||
|
||||
printf \
|
||||
"[Lua] Successfully parsed %d of %d example files (%.1f%%)\n" \
|
||||
${success_count} ${example_count} ${success_percent}
|
||||
}
|
||||
|
||||
parse_examples
|
|
@ -0,0 +1,33 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -eu
|
||||
|
||||
echo "Running Build..."
|
||||
npm run build
|
||||
echo
|
||||
|
||||
echo "Running Tests..."
|
||||
npm run test
|
||||
echo
|
||||
|
||||
echo "Bumping Version..."
|
||||
declare -r curr_version=$(npx -c 'echo $npm_package_version')
|
||||
npm version --allow-same-version --no-git-tag-version $@
|
||||
declare -r next_version=$(npx -c 'echo $npm_package_version')
|
||||
echo
|
||||
|
||||
if [[ "${curr_version}" = "${next_version}" ]]; then
|
||||
echo "Version did not change!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git add package.json
|
||||
|
||||
echo "crate: tree-sitter-lua"
|
||||
echo "v${next_version}"
|
||||
cargo bump "${next_version}"
|
||||
git add "Cargo.toml"
|
||||
echo
|
||||
|
||||
git commit -m "chore: release v${next_version}"
|
||||
git tag "v${next_version}" -m "v${next_version}"
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,229 @@
|
|||
#include <tree_sitter/parser.h>
|
||||
#include <wctype.h>
|
||||
#include <stdio.h>
|
||||
|
||||
enum TokenType {
|
||||
BLOCK_COMMENT_START,
|
||||
BLOCK_COMMENT_CONTENT,
|
||||
BLOCK_COMMENT_END,
|
||||
|
||||
STRING_START,
|
||||
STRING_CONTENT,
|
||||
STRING_END,
|
||||
};
|
||||
|
||||
static inline void consume(TSLexer *lexer) { lexer->advance(lexer, false); }
|
||||
static inline void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
|
||||
|
||||
static inline bool consume_char(char c, TSLexer *lexer) {
|
||||
if (lexer->lookahead != c) {
|
||||
return false;
|
||||
}
|
||||
|
||||
consume(lexer);
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline uint8_t consume_and_count_char(char c, TSLexer *lexer) {
|
||||
uint8_t count = 0;
|
||||
while (lexer->lookahead == c) {
|
||||
++count;
|
||||
consume(lexer);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static inline void skip_whitespaces(TSLexer *lexer) {
|
||||
while (iswspace(lexer->lookahead)) {
|
||||
skip(lexer);
|
||||
}
|
||||
}
|
||||
|
||||
void *tree_sitter_lua_external_scanner_create() { return NULL; }
|
||||
void tree_sitter_lua_external_scanner_destroy(void *payload) {}
|
||||
|
||||
char ending_char = 0;
|
||||
uint8_t level_count = 0;
|
||||
|
||||
static inline void reset_state() {
|
||||
ending_char = 0;
|
||||
level_count = 0;
|
||||
}
|
||||
|
||||
unsigned tree_sitter_lua_external_scanner_serialize(void *payload, char *buffer) {
|
||||
buffer[0] = ending_char;
|
||||
buffer[1] = level_count;
|
||||
return 2;
|
||||
}
|
||||
|
||||
void tree_sitter_lua_external_scanner_deserialize(void *payload, const char *buffer, unsigned length) {
|
||||
if (length == 0) return;
|
||||
ending_char = buffer[0];
|
||||
if (length == 1) return;
|
||||
level_count = buffer[1];
|
||||
}
|
||||
|
||||
static bool scan_block_start(TSLexer *lexer) {
|
||||
if (consume_char('[', lexer)) {
|
||||
uint8_t level = consume_and_count_char('=', lexer);
|
||||
|
||||
if (consume_char('[', lexer)) {
|
||||
level_count = level;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool scan_block_end(TSLexer *lexer) {
|
||||
if (consume_char(']', lexer)) {
|
||||
uint8_t level = consume_and_count_char('=', lexer);
|
||||
|
||||
if (level_count == level && consume_char(']', lexer)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool scan_block_content(TSLexer *lexer) {
|
||||
while (lexer->lookahead != 0) {
|
||||
if (lexer->lookahead == ']') {
|
||||
lexer->mark_end(lexer);
|
||||
|
||||
if (scan_block_end(lexer)) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
consume(lexer);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool scan_comment_start(TSLexer *lexer) {
|
||||
if (consume_char('-', lexer) && consume_char('-', lexer)) {
|
||||
lexer->mark_end(lexer);
|
||||
|
||||
if (scan_block_start(lexer)) {
|
||||
lexer->mark_end(lexer);
|
||||
lexer->result_symbol = BLOCK_COMMENT_START;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool scan_comment_content(TSLexer *lexer) {
|
||||
if (ending_char == 0) { // block comment
|
||||
if (scan_block_content(lexer)) {
|
||||
lexer->result_symbol = BLOCK_COMMENT_CONTENT;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
while (lexer->lookahead != 0) {
|
||||
if (lexer->lookahead == ending_char) {
|
||||
reset_state();
|
||||
lexer->result_symbol = BLOCK_COMMENT_CONTENT;
|
||||
return true;
|
||||
}
|
||||
|
||||
consume(lexer);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool scan_string_start(TSLexer *lexer) {
|
||||
if (lexer->lookahead == '"' || lexer->lookahead == '\'') {
|
||||
ending_char = lexer->lookahead;
|
||||
consume(lexer);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (scan_block_start(lexer)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool scan_string_end(TSLexer *lexer) {
|
||||
if (ending_char == 0) { // block string
|
||||
return scan_block_end(lexer);
|
||||
}
|
||||
|
||||
if (consume_char(ending_char, lexer)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool scan_string_content(TSLexer *lexer) {
|
||||
if (ending_char == 0) { // block string
|
||||
return scan_block_content(lexer);
|
||||
}
|
||||
|
||||
while (lexer->lookahead != '\n' && lexer->lookahead != 0 && lexer->lookahead != ending_char) {
|
||||
if (consume_char('\\', lexer) && consume_char('z', lexer)) {
|
||||
while (iswspace(lexer->lookahead)) {
|
||||
consume(lexer);
|
||||
}
|
||||
continue;
|
||||
};
|
||||
|
||||
if (lexer->lookahead == 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
consume(lexer);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool tree_sitter_lua_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {
|
||||
if (valid_symbols[STRING_END] && scan_string_end(lexer)) {
|
||||
reset_state();
|
||||
lexer->result_symbol = STRING_END;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (valid_symbols[STRING_CONTENT] && scan_string_content(lexer)) {
|
||||
lexer->result_symbol = STRING_CONTENT;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (valid_symbols[BLOCK_COMMENT_END] && ending_char == 0 && scan_block_end(lexer)) {
|
||||
reset_state();
|
||||
lexer->result_symbol = BLOCK_COMMENT_END;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (valid_symbols[BLOCK_COMMENT_CONTENT] && scan_comment_content(lexer)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
skip_whitespaces(lexer);
|
||||
|
||||
if (valid_symbols[STRING_START] && scan_string_start(lexer)) {
|
||||
lexer->result_symbol = STRING_START;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (valid_symbols[BLOCK_COMMENT_START]) {
|
||||
if (scan_comment_start(lexer)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
|
@ -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_
|
|
@ -0,0 +1,31 @@
|
|||
================================================================================
|
||||
chunk
|
||||
================================================================================
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk)
|
||||
|
||||
================================================================================
|
||||
hash_bang_line
|
||||
================================================================================
|
||||
|
||||
#!/usr/bin/env lua
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(hash_bang_line))
|
||||
|
||||
================================================================================
|
||||
return_statement
|
||||
================================================================================
|
||||
|
||||
return 42
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(return_statement
|
||||
(expression_list
|
||||
(number))))
|
|
@ -0,0 +1,80 @@
|
|||
================================================================================
|
||||
comment
|
||||
================================================================================
|
||||
|
||||
--
|
||||
-- single-line comment, below an empty single-line comment
|
||||
|
||||
--[[
|
||||
print("block comment")
|
||||
--]]
|
||||
|
||||
--[[
|
||||
print("block comment")
|
||||
]]
|
||||
|
||||
-- [[
|
||||
print("not block comment")
|
||||
--]]
|
||||
|
||||
--[=[[print("level 1 block comment")]]=]
|
||||
|
||||
--[=[
|
||||
[print("level 1 block comment")]
|
||||
]=]
|
||||
|
||||
--[=[
|
||||
[print("level 1 block comment")
|
||||
]=]
|
||||
|
||||
--[=[
|
||||
print("level 1 block comment")]
|
||||
]=]
|
||||
|
||||
--[=[
|
||||
[[print("level 1 block comment")
|
||||
]=]
|
||||
|
||||
--[=[
|
||||
print("level 1 block comment")]]
|
||||
]=]
|
||||
|
||||
--[==[
|
||||
print("level 2 block comment")
|
||||
-- ]==]
|
||||
|
||||
--[==[
|
||||
print("level 2 block comment")
|
||||
]==]
|
||||
|
||||
-- [==[
|
||||
print("not level 2 block comment")
|
||||
--]==]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(string)))
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(string)))
|
||||
(comment))
|
|
@ -0,0 +1,591 @@
|
|||
================================================================================
|
||||
nil
|
||||
================================================================================
|
||||
|
||||
exp(nil)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(nil))))
|
||||
|
||||
================================================================================
|
||||
false
|
||||
================================================================================
|
||||
|
||||
exp(false)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(false))))
|
||||
|
||||
================================================================================
|
||||
true
|
||||
================================================================================
|
||||
|
||||
exp(true)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(true))))
|
||||
|
||||
================================================================================
|
||||
number
|
||||
================================================================================
|
||||
|
||||
exp(
|
||||
3,
|
||||
345,
|
||||
0xff,
|
||||
0xBEBADA,
|
||||
3.0,
|
||||
3.1416,
|
||||
314.16e-2,
|
||||
0.31416E1,
|
||||
34e1,
|
||||
0x0.1E,
|
||||
0xA23p-4,
|
||||
0X1.921FB54442D18P+1
|
||||
)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(number)
|
||||
(number)
|
||||
(number)
|
||||
(number)
|
||||
(number)
|
||||
(number)
|
||||
(number)
|
||||
(number)
|
||||
(number)
|
||||
(number)
|
||||
(number)
|
||||
(number))))
|
||||
|
||||
================================================================================
|
||||
string
|
||||
================================================================================
|
||||
|
||||
exp(
|
||||
"string",
|
||||
'string',
|
||||
"a\
|
||||
b",
|
||||
'a\z',
|
||||
'a\z
|
||||
',
|
||||
'a\z
|
||||
b',
|
||||
"'a\z\
|
||||
b'",
|
||||
"c",
|
||||
'c',
|
||||
"0",
|
||||
[[ string ]],
|
||||
[[
|
||||
string
|
||||
string
|
||||
]],
|
||||
[=[
|
||||
string
|
||||
string
|
||||
]=],
|
||||
[=[[string]]=],
|
||||
[=[
|
||||
[string]
|
||||
]=],
|
||||
[=[
|
||||
[string
|
||||
]=],
|
||||
[=[
|
||||
string]
|
||||
]=],
|
||||
[=[
|
||||
[[string
|
||||
]=],
|
||||
[=[
|
||||
string]]
|
||||
]=]
|
||||
)
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string)
|
||||
(string))))
|
||||
|
||||
================================================================================
|
||||
vararg_expression
|
||||
================================================================================
|
||||
|
||||
exp(...)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(vararg_expression))))
|
||||
|
||||
================================================================================
|
||||
function_definition
|
||||
================================================================================
|
||||
|
||||
f1 = function() end
|
||||
|
||||
f2 = function() return end
|
||||
|
||||
f3 = function(...)
|
||||
return ...
|
||||
end
|
||||
|
||||
f4 = function(a1, ...)
|
||||
print(...)
|
||||
return a1
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (function_definition
|
||||
parameters: (parameters))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (function_definition
|
||||
parameters: (parameters)
|
||||
body: (block
|
||||
(return_statement)))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (function_definition
|
||||
parameters: (parameters
|
||||
(vararg_expression))
|
||||
body: (block
|
||||
(return_statement
|
||||
(expression_list
|
||||
(vararg_expression)))))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (function_definition
|
||||
parameters: (parameters
|
||||
name: (identifier)
|
||||
(vararg_expression))
|
||||
body: (block
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(vararg_expression)))
|
||||
(return_statement
|
||||
(expression_list
|
||||
(identifier))))))))
|
||||
|
||||
================================================================================
|
||||
variable ::: identifier
|
||||
================================================================================
|
||||
|
||||
v1 = n1
|
||||
|
||||
v2, v3 = n2, n3
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (identifier)))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier)
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (identifier)
|
||||
value: (identifier))))
|
||||
|
||||
================================================================================
|
||||
variable ::: bracket_index_expression
|
||||
================================================================================
|
||||
|
||||
v1 = tbl[k1]
|
||||
|
||||
v2, v3[v] = tbl[k1]["k2"]
|
||||
|
||||
v4 = tbk[getK1()][getK2()]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (bracket_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier)
|
||||
name: (bracket_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier)))
|
||||
(expression_list
|
||||
value: (bracket_index_expression
|
||||
table: (bracket_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
field: (string))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (bracket_index_expression
|
||||
table: (bracket_index_expression
|
||||
table: (identifier)
|
||||
field: (function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments)))
|
||||
field: (function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments))))))
|
||||
|
||||
================================================================================
|
||||
variable ::: dot_index_expression
|
||||
================================================================================
|
||||
|
||||
v1 = tbl.k1
|
||||
|
||||
v2 = tbl.k1.k2
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (dot_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (dot_index_expression
|
||||
table: (dot_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
field: (identifier)))))
|
||||
|
||||
================================================================================
|
||||
function_call ::: bracket_index_expression | dot_index_expression
|
||||
================================================================================
|
||||
|
||||
v1 = tbl[k1].k2(a1, "a2", a3())
|
||||
|
||||
v2 = tbl[k1] { f1 = true }
|
||||
|
||||
v3 = tbl[k1] "a1"
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (function_call
|
||||
name: (dot_index_expression
|
||||
table: (bracket_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
field: (identifier))
|
||||
arguments: (arguments
|
||||
(identifier)
|
||||
(string)
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments))))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (function_call
|
||||
name: (bracket_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
arguments: (arguments
|
||||
(table_constructor
|
||||
(field
|
||||
name: (identifier)
|
||||
value: (true)))))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (function_call
|
||||
name: (bracket_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
arguments: (arguments
|
||||
(string))))))
|
||||
|
||||
================================================================================
|
||||
function_call ::: method_index_expression
|
||||
================================================================================
|
||||
|
||||
tbl.k1:m1(a1, "a2")
|
||||
|
||||
tbl[k1]:m1 { f1, "f2" }
|
||||
|
||||
tbl:m1 "a1"
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(function_call
|
||||
name: (method_index_expression
|
||||
table: (dot_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
method: (identifier))
|
||||
arguments: (arguments
|
||||
(identifier)
|
||||
(string)))
|
||||
(function_call
|
||||
name: (method_index_expression
|
||||
table: (bracket_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
method: (identifier))
|
||||
arguments: (arguments
|
||||
(table_constructor
|
||||
(field
|
||||
value: (identifier))
|
||||
(field
|
||||
value: (string)))))
|
||||
(function_call
|
||||
name: (method_index_expression
|
||||
table: (identifier)
|
||||
method: (identifier))
|
||||
arguments: (arguments
|
||||
(string))))
|
||||
|
||||
================================================================================
|
||||
parenthesized_expression
|
||||
================================================================================
|
||||
|
||||
v = ( true )
|
||||
|
||||
v = ( ( false ) )
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (parenthesized_expression
|
||||
(true))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (parenthesized_expression
|
||||
(parenthesized_expression
|
||||
(false))))))
|
||||
|
||||
================================================================================
|
||||
table_constructor
|
||||
================================================================================
|
||||
|
||||
tbl1 = {
|
||||
["k1"] = {
|
||||
['k2'] = true,
|
||||
k3 = false
|
||||
}
|
||||
}
|
||||
|
||||
local tbl2 = {
|
||||
k1 = {
|
||||
{ 'v1', "v2" }
|
||||
}
|
||||
}
|
||||
|
||||
local tbl3 = { "v1", k1 = "v2" }
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (table_constructor
|
||||
(field
|
||||
name: (string)
|
||||
value: (table_constructor
|
||||
(field
|
||||
name: (string)
|
||||
value: (true))
|
||||
(field
|
||||
name: (identifier)
|
||||
value: (false)))))))
|
||||
local_declaration: (variable_declaration
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (table_constructor
|
||||
(field
|
||||
name: (identifier)
|
||||
value: (table_constructor
|
||||
(field
|
||||
value: (table_constructor
|
||||
(field
|
||||
value: (string))
|
||||
(field
|
||||
value: (string))))))))))
|
||||
local_declaration: (variable_declaration
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (table_constructor
|
||||
(field
|
||||
value: (string))
|
||||
(field
|
||||
name: (identifier)
|
||||
value: (string)))))))
|
||||
|
||||
================================================================================
|
||||
binary_expression
|
||||
================================================================================
|
||||
|
||||
a = i + j * 3 - k % 5
|
||||
|
||||
b = i + j % 3 ^ 2
|
||||
|
||||
c = i * 2 ^ j
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (binary_expression
|
||||
left: (binary_expression
|
||||
left: (identifier)
|
||||
right: (binary_expression
|
||||
left: (identifier)
|
||||
right: (number)))
|
||||
right: (binary_expression
|
||||
left: (identifier)
|
||||
right: (number)))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (binary_expression
|
||||
left: (identifier)
|
||||
right: (binary_expression
|
||||
left: (identifier)
|
||||
right: (binary_expression
|
||||
left: (number)
|
||||
right: (number))))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (binary_expression
|
||||
left: (identifier)
|
||||
right: (binary_expression
|
||||
left: (number)
|
||||
right: (identifier))))))
|
||||
|
||||
================================================================================
|
||||
unary_expression
|
||||
================================================================================
|
||||
|
||||
v1 = #l
|
||||
|
||||
v2 = -n
|
||||
|
||||
v3 = not c1 and r1 or r2
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (unary_expression
|
||||
operand: (identifier))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (unary_expression
|
||||
operand: (identifier))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (binary_expression
|
||||
left: (binary_expression
|
||||
left: (unary_expression
|
||||
operand: (identifier))
|
||||
right: (identifier))
|
||||
right: (identifier)))))
|
|
@ -0,0 +1,459 @@
|
|||
================================================================================
|
||||
empty_statement
|
||||
================================================================================
|
||||
|
||||
;
|
||||
;;
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(empty_statement)
|
||||
(empty_statement)
|
||||
(empty_statement))
|
||||
|
||||
================================================================================
|
||||
assignment_statement
|
||||
================================================================================
|
||||
|
||||
i = 1
|
||||
j, tbl[k()] = 2, i + 1
|
||||
x, y = y, x
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (number)))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier)
|
||||
name: (bracket_index_expression
|
||||
table: (identifier)
|
||||
field: (function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments))))
|
||||
(expression_list
|
||||
value: (number)
|
||||
value: (binary_expression
|
||||
left: (identifier)
|
||||
right: (number))))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier)
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (identifier)
|
||||
value: (identifier))))
|
||||
|
||||
================================================================================
|
||||
function_call
|
||||
================================================================================
|
||||
|
||||
f1()
|
||||
|
||||
tbl.f2()
|
||||
|
||||
tbl["f2"]()
|
||||
|
||||
tbl.k1:f3()
|
||||
|
||||
f4(a1)("a2") { a3 = "a3" }
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments))
|
||||
(function_call
|
||||
name: (dot_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
arguments: (arguments))
|
||||
(function_call
|
||||
name: (bracket_index_expression
|
||||
table: (identifier)
|
||||
field: (string))
|
||||
arguments: (arguments))
|
||||
(function_call
|
||||
name: (method_index_expression
|
||||
table: (dot_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
method: (identifier))
|
||||
arguments: (arguments))
|
||||
(function_call
|
||||
name: (function_call
|
||||
name: (function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(identifier)))
|
||||
arguments: (arguments
|
||||
(string)))
|
||||
arguments: (arguments
|
||||
(table_constructor
|
||||
(field
|
||||
name: (identifier)
|
||||
value: (string))))))
|
||||
|
||||
================================================================================
|
||||
label_statement
|
||||
================================================================================
|
||||
|
||||
:: label_name ::
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(label_statement
|
||||
(identifier)))
|
||||
|
||||
================================================================================
|
||||
break_statement
|
||||
================================================================================
|
||||
|
||||
for k, v in pairs(kv) do
|
||||
if not v then
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(for_statement
|
||||
clause: (for_generic_clause
|
||||
(variable_list
|
||||
name: (identifier)
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(identifier)))))
|
||||
body: (block
|
||||
(if_statement
|
||||
condition: (unary_expression
|
||||
operand: (identifier))
|
||||
consequence: (block
|
||||
(break_statement))))))
|
||||
|
||||
================================================================================
|
||||
goto_statement
|
||||
================================================================================
|
||||
|
||||
goto label_name
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(goto_statement
|
||||
(identifier)))
|
||||
|
||||
================================================================================
|
||||
do_statement
|
||||
================================================================================
|
||||
|
||||
do
|
||||
f1()
|
||||
return f2()
|
||||
end
|
||||
|
||||
do end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(do_statement
|
||||
body: (block
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments))
|
||||
(return_statement
|
||||
(expression_list
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments))))))
|
||||
(do_statement))
|
||||
|
||||
================================================================================
|
||||
while_statement
|
||||
================================================================================
|
||||
|
||||
while i < 9 do
|
||||
i = i + 1
|
||||
end
|
||||
|
||||
while false do end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(while_statement
|
||||
condition: (binary_expression
|
||||
left: (identifier)
|
||||
right: (number))
|
||||
body: (block
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (binary_expression
|
||||
left: (identifier)
|
||||
right: (number))))))
|
||||
(while_statement
|
||||
condition: (false)))
|
||||
|
||||
================================================================================
|
||||
repeat_statement
|
||||
================================================================================
|
||||
|
||||
repeat
|
||||
f1()
|
||||
i = i - 1
|
||||
until i == 0
|
||||
|
||||
repeat until false
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(repeat_statement
|
||||
body: (block
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments))
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (binary_expression
|
||||
left: (identifier)
|
||||
right: (number)))))
|
||||
condition: (binary_expression
|
||||
left: (identifier)
|
||||
right: (number)))
|
||||
(repeat_statement
|
||||
condition: (false)))
|
||||
|
||||
================================================================================
|
||||
if_statement
|
||||
================================================================================
|
||||
|
||||
if num % 2 == 0 then
|
||||
print("even")
|
||||
elseif num % 2 ~= 0 then
|
||||
print("odd")
|
||||
else
|
||||
error("!")
|
||||
end
|
||||
|
||||
if c1 then end
|
||||
|
||||
if c1 then else end
|
||||
|
||||
if c1 then elseif c2 then else end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(if_statement
|
||||
condition: (binary_expression
|
||||
left: (binary_expression
|
||||
left: (identifier)
|
||||
right: (number))
|
||||
right: (number))
|
||||
consequence: (block
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(string))))
|
||||
alternative: (elseif_statement
|
||||
condition: (binary_expression
|
||||
left: (binary_expression
|
||||
left: (identifier)
|
||||
right: (number))
|
||||
right: (number))
|
||||
consequence: (block
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(string)))))
|
||||
alternative: (else_statement
|
||||
body: (block
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(string))))))
|
||||
(if_statement
|
||||
condition: (identifier))
|
||||
(if_statement
|
||||
condition: (identifier)
|
||||
alternative: (else_statement))
|
||||
(if_statement
|
||||
condition: (identifier)
|
||||
alternative: (elseif_statement
|
||||
condition: (identifier))
|
||||
alternative: (else_statement)))
|
||||
|
||||
================================================================================
|
||||
for_statement ::: for_generic_clause
|
||||
================================================================================
|
||||
|
||||
for k, v in pairs(kv) do
|
||||
print(k, v)
|
||||
end
|
||||
|
||||
for i in ipairs(iv) do end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(for_statement
|
||||
clause: (for_generic_clause
|
||||
(variable_list
|
||||
name: (identifier)
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(identifier)))))
|
||||
body: (block
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(identifier)
|
||||
(identifier)))))
|
||||
(for_statement
|
||||
clause: (for_generic_clause
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(identifier)))))))
|
||||
|
||||
================================================================================
|
||||
for_statement ::: for_numeric_clause
|
||||
================================================================================
|
||||
|
||||
for n = 1, 10 do
|
||||
print(n)
|
||||
end
|
||||
|
||||
for n = 1, 10, 2 do end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(for_statement
|
||||
clause: (for_numeric_clause
|
||||
name: (identifier)
|
||||
start: (number)
|
||||
end: (number))
|
||||
body: (block
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(identifier)))))
|
||||
(for_statement
|
||||
clause: (for_numeric_clause
|
||||
name: (identifier)
|
||||
start: (number)
|
||||
end: (number)
|
||||
step: (number))))
|
||||
|
||||
================================================================================
|
||||
function_declaration
|
||||
================================================================================
|
||||
|
||||
function tbl.f1() end
|
||||
|
||||
function tbl:f2() end
|
||||
|
||||
function tbl.k1:f3() end
|
||||
|
||||
function f4()
|
||||
print('f4')
|
||||
end
|
||||
|
||||
local function f5() end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
(function_declaration
|
||||
name: (dot_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
parameters: (parameters))
|
||||
(function_declaration
|
||||
name: (method_index_expression
|
||||
table: (identifier)
|
||||
method: (identifier))
|
||||
parameters: (parameters))
|
||||
(function_declaration
|
||||
name: (method_index_expression
|
||||
table: (dot_index_expression
|
||||
table: (identifier)
|
||||
field: (identifier))
|
||||
method: (identifier))
|
||||
parameters: (parameters))
|
||||
(function_declaration
|
||||
name: (identifier)
|
||||
parameters: (parameters)
|
||||
body: (block
|
||||
(function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments
|
||||
(string)))))
|
||||
local_declaration: (function_declaration
|
||||
name: (identifier)
|
||||
parameters: (parameters)))
|
||||
|
||||
================================================================================
|
||||
variable_declaration
|
||||
================================================================================
|
||||
|
||||
local v1 = 1
|
||||
local v2, v3 = 2, 3
|
||||
|
||||
local v4, v4 = f1(), tbl:f2()
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(chunk
|
||||
local_declaration: (variable_declaration
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (number))))
|
||||
local_declaration: (variable_declaration
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier)
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (number)
|
||||
value: (number))))
|
||||
local_declaration: (variable_declaration
|
||||
(assignment_statement
|
||||
(variable_list
|
||||
name: (identifier)
|
||||
name: (identifier))
|
||||
(expression_list
|
||||
value: (function_call
|
||||
name: (identifier)
|
||||
arguments: (arguments))
|
||||
value: (function_call
|
||||
name: (method_index_expression
|
||||
table: (identifier)
|
||||
method: (identifier))
|
||||
arguments: (arguments))))))
|
Loading…
Reference in New Issue