Merge commit 'e348e8ec5efd3aac020020e4af53d2ff18f393a9'

a_star_module
Wilfred Hughes 2021-12-30 10:04:50 +07:00
commit 2325d0027e
9 changed files with 56374 additions and 47223 deletions

@ -1,7 +1,7 @@
[package]
name = "tree-sitter-c"
description = "C grammar for the tree-sitter parsing library"
version = "0.16.0"
version = "0.20.1"
authors = ["Max Brunsfeld <maxbrunsfeld@gmail.com>"]
license = "MIT"
readme = "bindings/rust/README.md"
@ -11,18 +11,13 @@ repository = "https://github.com/tree-sitter/tree-sitter-c"
edition = "2018"
build = "bindings/rust/build.rs"
include = [
"bindings/rust/*",
"grammar.js",
"queries/*",
"src/*",
]
include = ["bindings/rust/*", "grammar.js", "queries/*", "src/*"]
[lib]
path = "bindings/rust/lib.rs"
[dependencies]
tree-sitter = "0.19"
tree-sitter = "0.20"
[build-dependencies]
cc = "1.0"

@ -46,6 +46,8 @@ module.exports = grammar({
[$._type_specifier, $._expression, $.macro_type_specifier],
[$._type_specifier, $.macro_type_specifier],
[$.sized_type_specifier],
[$._declaration_modifiers, $.attributed_statement],
[$._declaration_modifiers, $.attributed_non_case_statement],
],
word: $ => $.identifier,
@ -58,6 +60,7 @@ module.exports = grammar({
$.linkage_specification,
$.declaration,
$._statement,
$.attributed_statement,
$.type_definition,
$._empty_declaration,
$.preproc_if,
@ -207,20 +210,18 @@ module.exports = grammar({
';'
),
_declaration_modifiers: $ => choice(
$.storage_class_specifier,
$.type_qualifier,
$.attribute_specifier,
$.attribute_declaration,
$.ms_declspec_modifier
),
_declaration_specifiers: $ => seq(
repeat(choice(
$.storage_class_specifier,
$.type_qualifier,
$.attribute_specifier,
$.ms_declspec_modifier
)),
repeat($._declaration_modifiers),
field('type', $._type_specifier),
repeat(choice(
$.storage_class_specifier,
$.type_qualifier,
$.attribute_specifier,
$.ms_declspec_modifier
))
repeat($._declaration_modifiers),
),
linkage_specification: $ => seq(
@ -240,6 +241,18 @@ module.exports = grammar({
')'
),
attribute: $ => seq(
optional(seq(field('prefix', $.identifier), '::')),
field('name', $.identifier),
optional($.argument_list)
),
attribute_declaration: $ => seq(
'[[',
commaSep1($.attribute),
']]'
),
ms_declspec_modifier: $ => seq(
'__declspec',
'(',
@ -283,6 +296,7 @@ module.exports = grammar({
),
_declarator: $ => choice(
$.attributed_declarator,
$.pointer_declarator,
$.function_declarator,
$.array_declarator,
@ -291,6 +305,7 @@ module.exports = grammar({
),
_field_declarator: $ => choice(
alias($.attributed_field_declarator, $.attributed_declarator),
alias($.pointer_field_declarator, $.pointer_declarator),
alias($.function_field_declarator, $.function_declarator),
alias($.array_field_declarator, $.array_declarator),
@ -299,6 +314,7 @@ module.exports = grammar({
),
_type_declarator: $ => choice(
alias($.attributed_type_declarator, $.attributed_declarator),
alias($.pointer_type_declarator, $.pointer_declarator),
alias($.function_type_declarator, $.function_declarator),
alias($.array_type_declarator, $.array_declarator),
@ -335,6 +351,18 @@ module.exports = grammar({
)),
attributed_declarator: $ => prec.right(seq(
$._declarator,
repeat1($.attribute_declaration),
)),
attributed_field_declarator: $ => prec.right(seq(
$._field_declarator,
repeat1($.attribute_declaration),
)),
attributed_type_declarator: $ => prec.right(seq(
$._type_declarator,
repeat1($.attribute_declaration),
)),
pointer_declarator: $ => prec.dynamic(1, prec.right(seq(
optional($.ms_based_modifier),
@ -548,9 +576,13 @@ module.exports = grammar({
optional(seq('=', field('value', $._expression)))
),
variadic_parameter: $ => seq(
'...',
),
parameter_list: $ => seq(
'(',
commaSep(choice($.parameter_declaration, '...')),
commaSep(choice($.parameter_declaration, $.variadic_parameter)),
')'
),
@ -564,6 +596,16 @@ module.exports = grammar({
// Statements
attributed_statement: $ => seq(
repeat1($.attribute_declaration),
$._statement
),
attributed_non_case_statement: $ => seq(
repeat1($.attribute_declaration),
$._non_case_statement
),
_statement: $ => choice(
$.case_statement,
$._non_case_statement
@ -621,6 +663,7 @@ module.exports = grammar({
),
':',
repeat(choice(
alias($.attributed_non_case_statement, $.attributed_statement),
$._non_case_statement,
$.declaration,
$.type_definition

@ -1,6 +1,6 @@
{
"name": "tree-sitter-c",
"version": "0.19.0",
"version": "0.20.1",
"description": "C grammar for node-tree-sitter",
"main": "bindings/node",
"keywords": [
@ -17,7 +17,7 @@
"nan": "^2.14.0"
},
"devDependencies": {
"tree-sitter-cli": "^0.19.1"
"tree-sitter-cli": "^0.20.0"
},
"scripts": {
"build": "tree-sitter generate && node-gyp build",

@ -28,6 +28,10 @@
"type": "SYMBOL",
"name": "_statement"
},
{
"type": "SYMBOL",
"name": "attributed_statement"
},
{
"type": "SYMBOL",
"name": "type_definition"
@ -1792,31 +1796,39 @@
}
]
},
"_declaration_modifiers": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "storage_class_specifier"
},
{
"type": "SYMBOL",
"name": "type_qualifier"
},
{
"type": "SYMBOL",
"name": "attribute_specifier"
},
{
"type": "SYMBOL",
"name": "attribute_declaration"
},
{
"type": "SYMBOL",
"name": "ms_declspec_modifier"
}
]
},
"_declaration_specifiers": {
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "storage_class_specifier"
},
{
"type": "SYMBOL",
"name": "type_qualifier"
},
{
"type": "SYMBOL",
"name": "attribute_specifier"
},
{
"type": "SYMBOL",
"name": "ms_declspec_modifier"
}
]
"type": "SYMBOL",
"name": "_declaration_modifiers"
}
},
{
@ -1830,25 +1842,8 @@
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "storage_class_specifier"
},
{
"type": "SYMBOL",
"name": "type_qualifier"
},
{
"type": "SYMBOL",
"name": "attribute_specifier"
},
{
"type": "SYMBOL",
"name": "ms_declspec_modifier"
}
]
"type": "SYMBOL",
"name": "_declaration_modifiers"
}
}
]
@ -1912,6 +1907,94 @@
}
]
},
"attribute": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "prefix",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "STRING",
"value": "::"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "identifier"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "argument_list"
},
{
"type": "BLANK"
}
]
}
]
},
"attribute_declaration": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "[["
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "attribute"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "SYMBOL",
"name": "attribute"
}
]
}
}
]
},
{
"type": "STRING",
"value": "]]"
}
]
},
"ms_declspec_modifier": {
"type": "SEQ",
"members": [
@ -2044,6 +2127,10 @@
"_declarator": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "attributed_declarator"
},
{
"type": "SYMBOL",
"name": "pointer_declarator"
@ -2069,6 +2156,15 @@
"_field_declarator": {
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "attributed_field_declarator"
},
"named": true,
"value": "attributed_declarator"
},
{
"type": "ALIAS",
"content": {
@ -2114,6 +2210,15 @@
"_type_declarator": {
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "attributed_type_declarator"
},
"named": true,
"value": "attributed_declarator"
},
{
"type": "ALIAS",
"content": {
@ -2261,6 +2366,66 @@
]
}
},
"attributed_declarator": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_declarator"
},
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "attribute_declaration"
}
}
]
}
},
"attributed_field_declarator": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_field_declarator"
},
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "attribute_declaration"
}
}
]
}
},
"attributed_type_declarator": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_type_declarator"
},
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "attribute_declaration"
}
}
]
}
},
"pointer_declarator": {
"type": "PREC_DYNAMIC",
"value": 1,
@ -3507,6 +3672,15 @@
}
]
},
"variadic_parameter": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "..."
}
]
},
"parameter_list": {
"type": "SEQ",
"members": [
@ -3528,8 +3702,8 @@
"name": "parameter_declaration"
},
{
"type": "STRING",
"value": "..."
"type": "SYMBOL",
"name": "variadic_parameter"
}
]
},
@ -3550,8 +3724,8 @@
"name": "parameter_declaration"
},
{
"type": "STRING",
"value": "..."
"type": "SYMBOL",
"name": "variadic_parameter"
}
]
}
@ -3605,6 +3779,38 @@
}
]
},
"attributed_statement": {
"type": "SEQ",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "attribute_declaration"
}
},
{
"type": "SYMBOL",
"name": "_statement"
}
]
},
"attributed_non_case_statement": {
"type": "SEQ",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "SYMBOL",
"name": "attribute_declaration"
}
},
{
"type": "SYMBOL",
"name": "_non_case_statement"
}
]
},
"_statement": {
"type": "CHOICE",
"members": [
@ -3842,6 +4048,15 @@
"content": {
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "attributed_non_case_statement"
},
"named": true,
"value": "attributed_statement"
},
{
"type": "SYMBOL",
"name": "_non_case_statement"
@ -6367,6 +6582,14 @@
],
[
"sized_type_specifier"
],
[
"_declaration_modifiers",
"attributed_statement"
],
[
"_declaration_modifiers",
"attributed_non_case_statement"
]
],
"precedences": [],

@ -29,6 +29,10 @@
"type": "array_declarator",
"named": true
},
{
"type": "attributed_declarator",
"named": true
},
{
"type": "function_declarator",
"named": true
@ -145,6 +149,10 @@
"type": "array_declarator",
"named": true
},
{
"type": "attributed_declarator",
"named": true
},
{
"type": "field_identifier",
"named": true
@ -229,6 +237,10 @@
"type": "array_declarator",
"named": true
},
{
"type": "attributed_declarator",
"named": true
},
{
"type": "function_declarator",
"named": true
@ -551,6 +563,57 @@
}
}
},
{
"type": "attribute",
"named": true,
"fields": {
"name": {
"multiple": false,
"required": true,
"types": [
{
"type": "identifier",
"named": true
}
]
},
"prefix": {
"multiple": false,
"required": false,
"types": [
{
"type": "identifier",
"named": true
}
]
}
},
"children": {
"multiple": false,
"required": false,
"types": [
{
"type": "argument_list",
"named": true
}
]
}
},
{
"type": "attribute_declaration",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "attribute",
"named": true
}
]
}
},
{
"type": "attribute_specifier",
"named": true,
@ -566,6 +629,52 @@
]
}
},
{
"type": "attributed_declarator",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "_declarator",
"named": true
},
{
"type": "_field_declarator",
"named": true
},
{
"type": "_type_declarator",
"named": true
},
{
"type": "attribute_declaration",
"named": true
}
]
}
},
{
"type": "attributed_statement",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "_statement",
"named": true
},
{
"type": "attribute_declaration",
"named": true
}
]
}
},
{
"type": "binary_expression",
"named": true,
@ -743,6 +852,10 @@
"multiple": true,
"required": false,
"types": [
{
"type": "attributed_statement",
"named": true
},
{
"type": "break_statement",
"named": true
@ -915,6 +1028,10 @@
"type": "_type_specifier",
"named": true
},
{
"type": "attributed_statement",
"named": true
},
{
"type": "declaration",
"named": true
@ -1047,6 +1164,10 @@
"multiple": true,
"required": false,
"types": [
{
"type": "attribute_declaration",
"named": true
},
{
"type": "attribute_specifier",
"named": true
@ -1082,6 +1203,10 @@
"type": "_type_specifier",
"named": true
},
{
"type": "attributed_statement",
"named": true
},
{
"type": "declaration",
"named": true
@ -1266,6 +1391,10 @@
"multiple": true,
"required": false,
"types": [
{
"type": "attribute_declaration",
"named": true
},
{
"type": "attribute_specifier",
"named": true
@ -1520,6 +1649,10 @@
"multiple": true,
"required": false,
"types": [
{
"type": "attribute_declaration",
"named": true
},
{
"type": "attribute_specifier",
"named": true
@ -1868,6 +2001,10 @@
"multiple": true,
"required": false,
"types": [
{
"type": "attribute_declaration",
"named": true
},
{
"type": "attribute_specifier",
"named": true
@ -1898,6 +2035,10 @@
{
"type": "parameter_declaration",
"named": true
},
{
"type": "variadic_parameter",
"named": true
}
]
}
@ -2156,6 +2297,10 @@
"type": "_type_specifier",
"named": true
},
{
"type": "attributed_statement",
"named": true
},
{
"type": "declaration",
"named": true
@ -2219,6 +2364,10 @@
"type": "_type_specifier",
"named": true
},
{
"type": "attributed_statement",
"named": true
},
{
"type": "declaration",
"named": true
@ -2371,6 +2520,10 @@
"type": "_type_specifier",
"named": true
},
{
"type": "attributed_statement",
"named": true
},
{
"type": "declaration",
"named": true
@ -2459,6 +2612,10 @@
"type": "_type_specifier",
"named": true
},
{
"type": "attributed_statement",
"named": true
},
{
"type": "declaration",
"named": true
@ -2753,6 +2910,10 @@
"type": "_type_specifier",
"named": true
},
{
"type": "attributed_statement",
"named": true
},
{
"type": "declaration",
"named": true
@ -2981,6 +3142,11 @@
}
}
},
{
"type": "variadic_parameter",
"named": true,
"fields": {}
},
{
"type": "while_statement",
"named": true,
@ -3147,6 +3313,10 @@
"type": ":",
"named": false
},
{
"type": "::",
"named": false
},
{
"type": ";",
"named": false
@ -3215,10 +3385,18 @@
"type": "[",
"named": false
},
{
"type": "[[",
"named": false
},
{
"type": "]",
"named": false
},
{
"type": "]]",
"named": false
},
{
"type": "^",
"named": false

File diff suppressed because it is too large Load Diff

@ -102,8 +102,8 @@ struct TSLanguage {
const uint16_t *small_parse_table;
const uint32_t *small_parse_table_map;
const TSParseActionEntry *parse_actions;
const char **symbol_names;
const char **field_names;
const char * const *symbol_names;
const char * const *field_names;
const TSFieldMapSlice *field_map_slices;
const TSFieldMapEntry *field_map_entries;
const TSSymbolMetadata *symbol_metadata;

@ -295,7 +295,7 @@ static baz quux(...);
(declaration
(storage_class_specifier)
(type_identifier)
(function_declarator (identifier) (parameter_list))))
(function_declarator (identifier) (parameter_list (variadic_parameter)))))
============================================
Function definitions
@ -431,6 +431,27 @@ void die(const char *format, ...) __attribute__((noreturn))
__attribute__((format(printf,1,2)));
extern __attribute__((visibility("default"), weak)) int print_status();
int f([[a::b(c), d]] int x) {}
[[gnu::always_inline]] [[gnu::hot]] [[gnu::const]] [[nodiscard]]
int g(void);
[[gnu::always_inline, gnu::hot, gnu::const, nodiscard]]
int g(void);
int i [[maybe_unused]];
void f[[gnu::always_inline]]();
[[nodiscard("reason")]] int foo;
[[fallthrough]];
struct S {
int a [[deprecated]];
};
typedef int MyInt [[deprecated]];
---
(translation_unit
@ -449,7 +470,7 @@ extern __attribute__((visibility("default"), weak)) int print_status();
(declaration
(primitive_type)
(function_declarator (identifier)
(parameter_list (parameter_declaration (type_qualifier) (primitive_type) (pointer_declarator (identifier))))
(parameter_list (parameter_declaration (type_qualifier) (primitive_type) (pointer_declarator (identifier))) (variadic_parameter))
(attribute_specifier (argument_list (identifier)))
(attribute_specifier
(argument_list (call_expression (identifier) (argument_list (identifier) (number_literal) (number_literal)))))))
@ -457,4 +478,53 @@ extern __attribute__((visibility("default"), weak)) int print_status();
(storage_class_specifier)
(attribute_specifier
(argument_list (call_expression (identifier) (argument_list (string_literal))) (identifier)))
(primitive_type) (function_declarator (identifier) (parameter_list))))
(primitive_type) (function_declarator (identifier) (parameter_list)))
(function_definition (primitive_type)
(function_declarator (identifier) (parameter_list (parameter_declaration
(attribute_declaration
(attribute (identifier) (identifier) (argument_list (identifier)))
(attribute (identifier)))
(primitive_type) (identifier)))) (compound_statement))
(declaration
(attribute_declaration (attribute (identifier) (identifier)))
(attribute_declaration (attribute (identifier) (identifier)))
(attribute_declaration (attribute (identifier) (identifier)))
(attribute_declaration (attribute (identifier)))
(primitive_type)
(function_declarator (identifier) (parameter_list (parameter_declaration (primitive_type)))))
(declaration
(attribute_declaration
(attribute (identifier) (identifier))
(attribute (identifier) (identifier))
(attribute (identifier) (identifier))
(attribute (identifier)))
(primitive_type)
(function_declarator (identifier) (parameter_list (parameter_declaration (primitive_type)))))
(declaration
(primitive_type)
(attributed_declarator
(identifier)
(attribute_declaration (attribute (identifier)))))
(declaration
(primitive_type)
(function_declarator
(attributed_declarator
(identifier)
(attribute_declaration (attribute (identifier) (identifier))))
(parameter_list)))
(declaration
(attribute_declaration (attribute (identifier) (argument_list (string_literal))))
(primitive_type) (identifier))
(attributed_statement
(attribute_declaration (attribute (identifier)))
(expression_statement))
(struct_specifier
(type_identifier)
(field_declaration_list (field_declaration (primitive_type)
(attributed_declarator
(field_identifier)
(attribute_declaration (attribute (identifier)))))))
(type_definition (primitive_type)
(attributed_declarator
(type_identifier)
(attribute_declaration (attribute (identifier))))))

@ -259,3 +259,53 @@ int b;
(declaration (primitive_type) (identifier))
(comment)
(declaration (primitive_type) (identifier)))
============================================
Attributes
============================================
void f() {
[[a]] switch (b) {
[[c]] case 1: {}
case 2:
[[fallthrough]];
default:
}
[[a]] while (true) {}
[[a]] if (true) {}
[[a]] for (;;) {}
[[a]] return;
[[a]] a;
[[a]];
[[a]] label: {}
[[a]] goto label;
}
---
(translation_unit
(function_definition (primitive_type)
(function_declarator (identifier) (parameter_list))
(compound_statement
(attributed_statement
(attribute_declaration (attribute (identifier)))
(switch_statement
(parenthesized_expression (identifier))
(compound_statement
(attributed_statement
(attribute_declaration (attribute (identifier)))
(case_statement (number_literal) (compound_statement)))
(case_statement (number_literal)
(attributed_statement
(attribute_declaration (attribute (identifier)))
(expression_statement)))
(case_statement))))
(attributed_statement (attribute_declaration (attribute (identifier))) (while_statement (parenthesized_expression (true)) (compound_statement)))
(attributed_statement (attribute_declaration (attribute (identifier))) (if_statement (parenthesized_expression (true)) (compound_statement)))
(attributed_statement (attribute_declaration (attribute (identifier))) (for_statement (compound_statement)))
(attributed_statement (attribute_declaration (attribute (identifier))) (return_statement))
(attributed_statement (attribute_declaration (attribute (identifier))) (expression_statement (identifier)))
(attributed_statement (attribute_declaration (attribute (identifier))) (expression_statement))
(attributed_statement (attribute_declaration (attribute (identifier))) (labeled_statement (statement_identifier) (compound_statement)))
(attributed_statement (attribute_declaration (attribute (identifier))) (goto_statement (statement_identifier))))))