Updated grammar file (not code)

This commit is contained in:
Maix0 2024-07-02 20:43:02 +02:00
parent c10ce8b165
commit dcdefc2ac3
3 changed files with 1809 additions and 595 deletions

View file

@ -6,7 +6,7 @@
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */ /* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/17 12:41:56 by maiboyer #+# #+# */ /* Created: 2024/06/17 12:41:56 by maiboyer #+# #+# */
/* Updated: 2024/07/01 21:44:49 by maiboyer ### ########.fr */ /* Updated: 2024/07/02 15:49:56 by maiboyer ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -593,13 +593,15 @@ t_error build_sym_program(t_parse_node self, t_const_str input, t_ast_node *out)
t_error build_sym_raw_string(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_raw_string(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_redirected_statement(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_redirected_statement(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_regex(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_regex(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_simple_expansion(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_string_content(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_string_content(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_subshell(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_subshell(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_variable_assignment(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_variable_assignment(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_while_statement(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_while_statement(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_word(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_word(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_simple_expansion(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_expansion(t_parse_node self, t_const_str input, t_ast_node *out);
/* FUNCTION THAT ARE NOT DONE */ /* FUNCTION THAT ARE NOT DONE */
@ -612,7 +614,6 @@ t_error build_sym_arithmetic_unary_expression(t_parse_node self, t_const_str inp
t_error build_sym_arithmetic_expansion(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_arithmetic_expansion(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_command_substitution(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_command_substitution(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_expansion(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_expansion_expression(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_expansion_expression(t_parse_node self, t_const_str input, t_ast_node *out);
t_error build_sym_expansion_regex(t_parse_node self, t_const_str input, t_ast_node *out); t_error build_sym_expansion_regex(t_parse_node self, t_const_str input, t_ast_node *out);

View file

@ -42,12 +42,12 @@ module.exports = grammar({
[$.redirected_statement, $.command], [$.redirected_statement, $.command],
[$.redirected_statement, $.command_substitution], [$.redirected_statement, $.command_substitution],
[$.function_definition, $.command_name], [$.function_definition, $.command_name],
[$._expansion_body, $._expansion_regex],
[$.pipeline], [$.pipeline],
], ],
inline: $ => [ inline: $ => [
$._statement, $._statement,
// $._terminator,
$._literal, $._literal,
$._terminated_statement, $._terminated_statement,
$._primary_expression, $._primary_expression,
@ -100,15 +100,15 @@ module.exports = grammar({
_statements: $ => prec(1, seq( _statements: $ => prec(1, seq(
repeat(seq( repeat(seq(
field('stmt', $._statement), field('stmt', $._statement),
field('terminator', $.terminator), field('term', $.terminator),
)), )),
field('stmt', $._statement), field('stmt', $._statement),
field('terminator', optional($.terminator)), field('term', optional($.terminator)),
)), )),
_terminated_statement: $ => repeat1(seq( _terminated_statement: $ => repeat1(seq(
field('stmt', $._statement), field('stmt', $._statement),
field('terminator', $.terminator) field('term', $.terminator)
)), )),
// Statements // Statements
@ -153,14 +153,14 @@ module.exports = grammar({
redirected_statement: $ => prec.dynamic(-1, prec.right(-1, choice( redirected_statement: $ => prec.dynamic(-1, prec.right(-1, choice(
seq( seq(
field('body', $._statement), field('body', $._statement),
field('redirect', repeat1(choice($.file_redirect, $.heredoc_redirect))), field('redr', repeat1(choice($.file_redirect, $.heredoc_redirect))),
), ),
field('redirect', repeat1($.file_redirect)), field('redr', repeat1($.file_redirect)),
))), ))),
for_statement: $ => seq( for_statement: $ => seq(
'for', 'for',
field('variable', $._simple_variable_name), field('var', $._simple_variable_name),
optional(seq( optional(seq(
'in', 'in',
field('value', repeat1($._literal)), field('value', repeat1($._literal)),
@ -171,7 +171,7 @@ module.exports = grammar({
while_statement: $ => seq( while_statement: $ => seq(
choice('while', 'until'), choice('while', 'until'),
field('condition', $._terminated_statement), field('cond', $._terminated_statement),
field('body', $.do_group), field('body', $.do_group),
), ),
@ -183,7 +183,7 @@ module.exports = grammar({
if_statement: $ => seq( if_statement: $ => seq(
'if', 'if',
field('condition', alias($._terminated_statement, $.statements)), field('cond', alias($._terminated_statement, $.statements)),
'then', 'then',
field('body', alias(optional($._terminated_statement), $.statements)), field('body', alias(optional($._terminated_statement), $.statements)),
field('elif', repeat($.elif_clause)), field('elif', repeat($.elif_clause)),
@ -193,7 +193,7 @@ module.exports = grammar({
elif_clause: $ => seq( elif_clause: $ => seq(
'elif', 'elif',
field('condition', alias($._terminated_statement, $.statements)), field('cond', alias($._terminated_statement, $.statements)),
'then', 'then',
field('body', alias(optional($._terminated_statement), $.statements)), field('body', alias(optional($._terminated_statement), $.statements)),
), ),
@ -270,7 +270,7 @@ module.exports = grammar({
command: $ => prec.left(seq( command: $ => prec.left(seq(
repeat(choice( repeat(choice(
$.variable_assignment, $.variable_assignment,
field('redirect', $.file_redirect), field('redr', $.file_redirect),
)), )),
field('name', $.command_name), field('name', $.command_name),
choice( choice(
@ -311,7 +311,7 @@ module.exports = grammar({
optional(choice( optional(choice(
alias($._heredoc_pipeline, $.pipeline), alias($._heredoc_pipeline, $.pipeline),
seq( seq(
field('redirect', repeat1($.file_redirect)), field('redr', repeat1($.file_redirect)),
optional($._heredoc_expression), optional($._heredoc_expression),
), ),
$._heredoc_expression, $._heredoc_expression,
@ -325,7 +325,7 @@ module.exports = grammar({
_heredoc_expression: $ => seq( _heredoc_expression: $ => seq(
field('op', alias(choice('||', '&&'), $.operator)), field('op', alias(choice('||', '&&'), $.operator)),
field('right', $._statement), field('rhs', $._statement),
), ),
_heredoc_command: $ => repeat1(field('arg', $._literal)), _heredoc_command: $ => repeat1(field('arg', $._literal)),
@ -403,19 +403,19 @@ module.exports = grammar({
return choice(...table.map(([operator, precedence]) => return choice(...table.map(([operator, precedence]) =>
prec.left(precedence, seq( prec.left(precedence, seq(
field('left', $._arithmetic_expression), field('lhs', $._arithmetic_expression),
field('op', alias(operator, $.operator)), field('op', alias(operator, $.operator)),
field('right', $._arithmetic_expression), field('rhs', $._arithmetic_expression),
)) ))
)); ));
}, },
arithmetic_ternary_expression: $ => prec.left(PREC.TERNARY, seq( arithmetic_ternary_expression: $ => prec.left(PREC.TERNARY, seq(
field('condition', $._arithmetic_expression), field('cond', $._arithmetic_expression),
'?', '?',
field('consequence', $._arithmetic_expression), field('then', $._arithmetic_expression),
':', ':',
field('alternative', $._arithmetic_expression), field('else', $._arithmetic_expression),
)), )),
arithmetic_unary_expression: $ => choice( arithmetic_unary_expression: $ => choice(
@ -493,67 +493,67 @@ module.exports = grammar({
optional($._expansion_body), optional($._expansion_body),
'}', '}',
), ),
_expansion_body: $ => seq( _expansion_body: $ => seq(
field('len', optional(alias('#', $.operator))),
field('name', choice($.variable_name, $._simple_variable_name, $._special_variable_name)), field('name', choice($.variable_name, $._simple_variable_name, $._special_variable_name)),
field('op', optional(choice($.expansion_expression, $.expansion_regex))), optional(choice($._expansion_expression, $._expansion_regex)),
), ),
expansion_expression: $ => prec(1, seq( _expansion_expression: $ => prec(1, seq(
field('op', alias(immediateLiterals(':-', '-', ':=', '=', ':?', '?', ':+', '+'), $.operator)), field('op', alias(immediateLiterals(':-', '-', ':=', '=', ':?', '?', ':+', '+'), $.operator)),
optional(seq( field('args', optional(choice(
choice(
alias($._concatenation_in_expansion, $.concatenation), alias($._concatenation_in_expansion, $.concatenation),
$.word, //alias($._expansion_word, $.word1),
alias(prec(10000000, $._word_no_brace), $.word2),
$.expansion, $.expansion,
$.string,
$.raw_string, $.raw_string,
alias($._expansion_word, $.word), $.string,
), ))),
)),
)), )),
expansion_regex: $ => seq( _expansion_regex: $ => seq(
field('op', alias(choice('#', $._immediate_double_hash, '%', '%%'), $.operator)), field('op', alias(choice('#', $._immediate_double_hash, '%', '%%'), $.operator)),
repeat(choice( field('args', repeat(choice(
$.regex,
alias(')', $.regex),
$.string,
$.raw_string, $.raw_string,
$.regex,
$.string,
alias(')', $.regex),
alias(/\s+/, $.regex), alias(/\s+/, $.regex),
)), ))),
), ),
_concatenation_in_expansion: $ => prec(-2, seq( _concatenation_in_expansion: $ => prec(-2, seq(
choice( choice(
$.word, alias($._word_no_brace, $.word),
alias($._expansion_word, $.word),
$.variable_name, $.variable_name,
$.simple_expansion, $.simple_expansion,
$.expansion, $.expansion,
$.string, $.string,
$.raw_string, $.raw_string,
$.command_substitution, $.command_substitution,
alias($._expansion_word, $.word),
), ),
repeat1(seq( repeat1(seq(
choice($._concat, alias(/`\s*`/, '``')), choice($._concat, alias(/`\s*`/, '``')),
choice( choice(
$.word, alias($._word_no_brace, $.word),
alias($._expansion_word, $.word),
$.variable_name, $.variable_name,
$.simple_expansion, $.simple_expansion,
$.expansion, $.expansion,
$.string, $.string,
$.raw_string, $.raw_string,
$.command_substitution, $.command_substitution,
alias($._expansion_word, $.word),
), ),
)), )),
)), )),
command_substitution: $ => choice( command_substitution: $ => choice(
seq('$(', $._statements, ')'), seq('$(', $._statements, ')'),
seq('$(', field('redirect', $.file_redirect), ')'), seq('$(', field('redr', $.file_redirect), ')'),
prec(1, seq('`', $._statements, '`')), prec(1, seq('`', $._statements, '`')),
), ),
@ -599,6 +599,19 @@ module.exports = grammar({
'\\ ', '\\ ',
)), )),
)), )),
_word_no_brace: _ => prec(2, token(seq(
choice(
noneOf('#', '{', '}', ...SPECIAL_CHARACTERS),
seq('\\', noneOf('\\s')),
),
repeat(choice(
noneOf('{', '}', ...SPECIAL_CHARACTERS),
seq('\\', noneOf('\\s')),
'\\ ',
)),
))),
terminator: _ => choice(';', ';;', /\n/, '&'), terminator: _ => choice(';', ';;', /\n/, '&'),
}, },
}); });

1200
tree-sitter-sh/src/scanner.c Normal file

File diff suppressed because it is too large Load diff