Identify fragile reductions at compile time

This commit is contained in:
Max Brunsfeld 2015-02-21 10:41:23 -08:00
parent a92067702d
commit 2d436cf141
13 changed files with 4843 additions and 4790 deletions

View file

@ -45,6 +45,7 @@ typedef enum {
TSParseActionTypeShiftExtra,
TSParseActionTypeReduce,
TSParseActionTypeReduceExtra,
TSParseActionTypeReduceFragile,
TSParseActionTypeAccept,
} TSParseActionType;
@ -116,6 +117,12 @@ struct TSLanguage {
.data = { .symbol = symbol_val, .child_count = child_count_val } \
}
#define REDUCE_FRAGILE(symbol_val, child_count_val) \
{ \
.type = TSParseActionTypeReduceFragile, \
.data = { .symbol = symbol_val, .child_count = child_count_val } \
}
#define ACCEPT_INPUT() \
{ .type = TSParseActionTypeAccept }

View file

@ -87,7 +87,7 @@ describe("action_takes_precedence", []() {
describe("shift/reduce conflicts", [&]() {
describe("when the shift has higher precedence", [&]() {
ParseAction shift = ParseAction::Shift(2, { 3 });
ParseAction reduce = ParseAction::Reduce(sym2, 1, 1);
ParseAction reduce = ParseAction::Reduce(sym2, 1, 1, 0);
it("is not a conflict", [&]() {
result = action_takes_precedence(shift, reduce, sym1);
@ -108,7 +108,7 @@ describe("action_takes_precedence", []() {
describe("when the reduce has higher precedence", [&]() {
ParseAction shift = ParseAction::Shift(2, { 1 });
ParseAction reduce = ParseAction::Reduce(sym2, 1, 3);
ParseAction reduce = ParseAction::Reduce(sym2, 1, 3, 0);
it("is not a conflict", [&]() {
result = action_takes_precedence(shift, reduce, sym1);
@ -129,7 +129,7 @@ describe("action_takes_precedence", []() {
describe("when the precedences are equal", [&]() {
ParseAction shift = ParseAction::Shift(2, { 0 });
ParseAction reduce = ParseAction::Reduce(sym2, 1, 0);
ParseAction reduce = ParseAction::Reduce(sym2, 1, 0, 0);
it("is a conflict", [&]() {
result = action_takes_precedence(reduce, shift, sym1);
@ -150,7 +150,7 @@ describe("action_takes_precedence", []() {
describe("when the shift has conflicting precedences compared to the reduce", [&]() {
ParseAction shift = ParseAction::Shift(2, { 0, 1, 3 });
ParseAction reduce = ParseAction::Reduce(sym2, 1, 2);
ParseAction reduce = ParseAction::Reduce(sym2, 1, 2, 0);
it("is a conflict", [&]() {
result = action_takes_precedence(reduce, shift, sym1);
@ -172,8 +172,8 @@ describe("action_takes_precedence", []() {
describe("reduce/reduce conflicts", [&]() {
describe("when one action has higher precedence", [&]() {
ParseAction left = ParseAction::Reduce(sym2, 1, 0);
ParseAction right = ParseAction::Reduce(sym2, 1, 3);
ParseAction left = ParseAction::Reduce(sym2, 1, 0, 0);
ParseAction right = ParseAction::Reduce(sym2, 1, 3, 0);
it("favors that action", [&]() {
result = action_takes_precedence(left, right, sym1);
@ -193,8 +193,8 @@ describe("action_takes_precedence", []() {
});
describe("when the actions have the same precedence", [&]() {
ParseAction left = ParseAction::Reduce(sym1, 1, 0);
ParseAction right = ParseAction::Reduce(sym2, 1, 0);
ParseAction left = ParseAction::Reduce(sym1, 1, 0, 0);
ParseAction right = ParseAction::Reduce(sym2, 1, 0, 0);
it("favors the symbol listed earlier in the grammar", [&]() {
result = action_takes_precedence(left, right, sym1);

View file

@ -27,7 +27,7 @@ describe("build_conflict", []() {
it("uses the given item-set to determine which symbols are involved in the shift", [&]() {
conflict = build_conflict(
ParseAction::Shift(2, set<int>()),
ParseAction::Reduce(Symbol(2), 1, 0), // reduced_rule
ParseAction::Reduce(Symbol(2), 1, 0, 0), // reduced_rule
ParseItemSet({
{
ParseItem(Symbol(0), blank(), { Symbol(101) }), // in_progress_rule1
@ -54,7 +54,7 @@ describe("build_conflict", []() {
it("always puts shift actions before reduce actions", [&]() {
conflict = build_conflict(
ParseAction::Reduce(Symbol(2), 1, 0), // reduced_rule
ParseAction::Reduce(Symbol(2), 1, 0, 0), // reduced_rule
ParseAction::Shift(2, set<int>()),
ParseItemSet({
{

View file

@ -60,7 +60,7 @@ describe("build_parse_table", []() {
auto result = build_parse_table(parse_grammar, lex_grammar);
AssertThat(result.first.states[2].actions, Equals(map<Symbol, ParseAction>({
{ END_OF_INPUT(), ParseAction::Reduce(Symbol(0), 1, 0) },
{ END_OF_INPUT(), ParseAction::Reduce(Symbol(0), 1, 0, 0) },
// for the ubiquitous_token 'token2'
{ Symbol(2, SymbolOptionToken), ParseAction::ShiftExtra() },

View file

@ -448,30 +448,30 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
},
[16] = {
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_PLUS] = REDUCE(sym_exponent, 3),
[aux_sym_STR_DASH] = REDUCE(sym_exponent, 3),
[aux_sym_STR_STAR] = REDUCE(sym_exponent, 3),
[aux_sym_STR_SLASH] = REDUCE(sym_exponent, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_exponent, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_exponent, 3),
[aux_sym_STR_STAR] = REDUCE_FRAGILE(sym_exponent, 3),
[aux_sym_STR_SLASH] = REDUCE_FRAGILE(sym_exponent, 3),
[aux_sym_STR_CARET] = SHIFT(15),
[aux_sym_STR_RPAREN] = REDUCE(sym_exponent, 3),
[aux_sym_STR_RPAREN] = REDUCE_FRAGILE(sym_exponent, 3),
},
[17] = {
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_PLUS] = REDUCE(sym_quotient, 3),
[aux_sym_STR_DASH] = REDUCE(sym_quotient, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_quotient, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_quotient, 3),
[aux_sym_STR_STAR] = SHIFT(13),
[aux_sym_STR_SLASH] = SHIFT(14),
[aux_sym_STR_CARET] = SHIFT(15),
[aux_sym_STR_RPAREN] = REDUCE(sym_quotient, 3),
[aux_sym_STR_RPAREN] = REDUCE_FRAGILE(sym_quotient, 3),
},
[18] = {
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_PLUS] = REDUCE(sym_product, 3),
[aux_sym_STR_DASH] = REDUCE(sym_product, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_product, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_product, 3),
[aux_sym_STR_STAR] = SHIFT(13),
[aux_sym_STR_SLASH] = SHIFT(14),
[aux_sym_STR_CARET] = SHIFT(15),
[aux_sym_STR_RPAREN] = REDUCE(sym_product, 3),
[aux_sym_STR_RPAREN] = REDUCE_FRAGILE(sym_product, 3),
},
[19] = {
[sym_comment] = SHIFT_EXTRA(),
@ -480,7 +480,7 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_STAR] = SHIFT(13),
[aux_sym_STR_SLASH] = SHIFT(14),
[aux_sym_STR_CARET] = SHIFT(15),
[aux_sym_STR_RPAREN] = REDUCE(sym_difference, 3),
[aux_sym_STR_RPAREN] = REDUCE_FRAGILE(sym_difference, 3),
},
[20] = {
[sym_comment] = SHIFT_EXTRA(),
@ -489,7 +489,7 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_STAR] = SHIFT(13),
[aux_sym_STR_SLASH] = SHIFT(14),
[aux_sym_STR_CARET] = SHIFT(15),
[aux_sym_STR_RPAREN] = REDUCE(sym_sum, 3),
[aux_sym_STR_RPAREN] = REDUCE_FRAGILE(sym_sum, 3),
},
[21] = {
[ts_builtin_sym_end] = REDUCE(sym_group, 3),
@ -566,34 +566,34 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_LPAREN] = SHIFT(3),
},
[27] = {
[ts_builtin_sym_end] = REDUCE(sym_exponent, 3),
[ts_builtin_sym_end] = REDUCE_FRAGILE(sym_exponent, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_PLUS] = REDUCE(sym_exponent, 3),
[aux_sym_STR_DASH] = REDUCE(sym_exponent, 3),
[aux_sym_STR_STAR] = REDUCE(sym_exponent, 3),
[aux_sym_STR_SLASH] = REDUCE(sym_exponent, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_exponent, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_exponent, 3),
[aux_sym_STR_STAR] = REDUCE_FRAGILE(sym_exponent, 3),
[aux_sym_STR_SLASH] = REDUCE_FRAGILE(sym_exponent, 3),
[aux_sym_STR_CARET] = SHIFT(26),
},
[28] = {
[ts_builtin_sym_end] = REDUCE(sym_quotient, 3),
[ts_builtin_sym_end] = REDUCE_FRAGILE(sym_quotient, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_PLUS] = REDUCE(sym_quotient, 3),
[aux_sym_STR_DASH] = REDUCE(sym_quotient, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_quotient, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_quotient, 3),
[aux_sym_STR_STAR] = SHIFT(24),
[aux_sym_STR_SLASH] = SHIFT(25),
[aux_sym_STR_CARET] = SHIFT(26),
},
[29] = {
[ts_builtin_sym_end] = REDUCE(sym_product, 3),
[ts_builtin_sym_end] = REDUCE_FRAGILE(sym_product, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_PLUS] = REDUCE(sym_product, 3),
[aux_sym_STR_DASH] = REDUCE(sym_product, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_product, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_product, 3),
[aux_sym_STR_STAR] = SHIFT(24),
[aux_sym_STR_SLASH] = SHIFT(25),
[aux_sym_STR_CARET] = SHIFT(26),
},
[30] = {
[ts_builtin_sym_end] = REDUCE(sym_difference, 3),
[ts_builtin_sym_end] = REDUCE_FRAGILE(sym_difference, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_PLUS] = SHIFT(22),
[aux_sym_STR_DASH] = SHIFT(23),
@ -602,7 +602,7 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_CARET] = SHIFT(26),
},
[31] = {
[ts_builtin_sym_end] = REDUCE(sym_sum, 3),
[ts_builtin_sym_end] = REDUCE_FRAGILE(sym_sum, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_PLUS] = SHIFT(22),
[aux_sym_STR_DASH] = SHIFT(23),

View file

@ -2966,13 +2966,13 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_COMMA] = REDUCE(sym_var_name, 1),
},
[21] = {
[sym_block_statement] = REDUCE(sym__func_signature, 2),
[sym_block_statement] = REDUCE_FRAGILE(sym__func_signature, 2),
[sym_type_name] = SHIFT(22),
[sym__line_break] = SHIFT_EXTRA(),
[sym__identifier] = SHIFT(23),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = SHIFT(24),
[aux_sym_STR_LBRACE] = REDUCE(sym__func_signature, 2),
[aux_sym_STR_LBRACE] = REDUCE_FRAGILE(sym__func_signature, 2),
},
[22] = {
[sym_block_statement] = REDUCE(sym__func_signature, 3),
@ -3297,14 +3297,14 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_COMMA] = SHIFT(53),
},
[64] = {
[sym_var_name] = REDUCE(sym__func_signature, 2),
[sym_var_name] = REDUCE_FRAGILE(sym__func_signature, 2),
[sym_type_name] = SHIFT(65),
[sym__line_break] = SHIFT_EXTRA(),
[sym__identifier] = SHIFT(66),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_interface_type_repeat0] = REDUCE(sym__func_signature, 2),
[aux_sym_interface_type_repeat0] = REDUCE_FRAGILE(sym__func_signature, 2),
[aux_sym_STR_LPAREN] = SHIFT(67),
[aux_sym_STR_RBRACE] = REDUCE(sym__func_signature, 2),
[aux_sym_STR_RBRACE] = REDUCE_FRAGILE(sym__func_signature, 2),
},
[65] = {
[sym_var_name] = REDUCE(sym__func_signature, 3),
@ -3420,14 +3420,14 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_RPAREN] = SHIFT(101),
},
[80] = {
[sym_var_name] = REDUCE(sym__func_signature, 5),
[sym_var_name] = REDUCE_FRAGILE(sym__func_signature, 5),
[sym_type_name] = SHIFT(72),
[sym__line_break] = SHIFT_EXTRA(),
[sym__identifier] = SHIFT(66),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_interface_type_repeat0] = REDUCE(sym__func_signature, 5),
[aux_sym_interface_type_repeat0] = REDUCE_FRAGILE(sym__func_signature, 5),
[aux_sym_STR_LPAREN] = SHIFT(92),
[aux_sym_STR_RBRACE] = REDUCE(sym__func_signature, 5),
[aux_sym_STR_RBRACE] = REDUCE_FRAGILE(sym__func_signature, 5),
},
[81] = {
[sym_var_name] = SHIFT(82),
@ -3618,14 +3618,14 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_RBRACE] = REDUCE(sym__func_signature, 10),
},
[101] = {
[sym_var_name] = REDUCE(sym__func_signature, 6),
[sym_var_name] = REDUCE_FRAGILE(sym__func_signature, 6),
[sym_type_name] = SHIFT(75),
[sym__line_break] = SHIFT_EXTRA(),
[sym__identifier] = SHIFT(66),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_interface_type_repeat0] = REDUCE(sym__func_signature, 6),
[aux_sym_interface_type_repeat0] = REDUCE_FRAGILE(sym__func_signature, 6),
[aux_sym_STR_LPAREN] = SHIFT(102),
[aux_sym_STR_RBRACE] = REDUCE(sym__func_signature, 6),
[aux_sym_STR_RBRACE] = REDUCE_FRAGILE(sym__func_signature, 6),
},
[102] = {
[sym_var_name] = SHIFT(103),
@ -3673,14 +3673,14 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_RPAREN] = SHIFT(80),
},
[109] = {
[sym_var_name] = REDUCE(sym__func_signature, 4),
[sym_var_name] = REDUCE_FRAGILE(sym__func_signature, 4),
[sym_type_name] = SHIFT(71),
[sym__line_break] = SHIFT_EXTRA(),
[sym__identifier] = SHIFT(66),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_interface_type_repeat0] = REDUCE(sym__func_signature, 4),
[aux_sym_interface_type_repeat0] = REDUCE_FRAGILE(sym__func_signature, 4),
[aux_sym_STR_LPAREN] = SHIFT(110),
[aux_sym_STR_RBRACE] = REDUCE(sym__func_signature, 4),
[aux_sym_STR_RBRACE] = REDUCE_FRAGILE(sym__func_signature, 4),
},
[110] = {
[sym_var_name] = SHIFT(111),
@ -4238,13 +4238,13 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_RPAREN] = SHIFT(187),
},
[177] = {
[sym_block_statement] = REDUCE(sym__func_signature, 5),
[sym_block_statement] = REDUCE_FRAGILE(sym__func_signature, 5),
[sym_type_name] = SHIFT(34),
[sym__line_break] = SHIFT_EXTRA(),
[sym__identifier] = SHIFT(23),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = SHIFT(178),
[aux_sym_STR_LBRACE] = REDUCE(sym__func_signature, 5),
[aux_sym_STR_LBRACE] = REDUCE_FRAGILE(sym__func_signature, 5),
},
[178] = {
[sym_var_name] = SHIFT(179),
@ -4302,13 +4302,13 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_LBRACE] = REDUCE(sym__func_signature, 10),
},
[187] = {
[sym_block_statement] = REDUCE(sym__func_signature, 6),
[sym_block_statement] = REDUCE_FRAGILE(sym__func_signature, 6),
[sym_type_name] = SHIFT(43),
[sym__line_break] = SHIFT_EXTRA(),
[sym__identifier] = SHIFT(23),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = SHIFT(188),
[aux_sym_STR_LBRACE] = REDUCE(sym__func_signature, 6),
[aux_sym_STR_LBRACE] = REDUCE_FRAGILE(sym__func_signature, 6),
},
[188] = {
[sym_var_name] = SHIFT(189),
@ -4354,13 +4354,13 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_RPAREN] = SHIFT(177),
},
[195] = {
[sym_block_statement] = REDUCE(sym__func_signature, 4),
[sym_block_statement] = REDUCE_FRAGILE(sym__func_signature, 4),
[sym_type_name] = SHIFT(29),
[sym__line_break] = SHIFT_EXTRA(),
[sym__identifier] = SHIFT(23),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = SHIFT(196),
[aux_sym_STR_LBRACE] = REDUCE(sym__func_signature, 4),
[aux_sym_STR_LBRACE] = REDUCE_FRAGILE(sym__func_signature, 4),
},
[196] = {
[sym_var_name] = SHIFT(197),
@ -4945,18 +4945,18 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_BANG] = SHIFT(223),
},
[234] = {
[sym_block_statement] = REDUCE(sym_bool_op, 3),
[sym_block_statement] = REDUCE_FRAGILE(sym_bool_op, 3),
[sym__line_break] = SHIFT_EXTRA(),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LBRACE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_STAR] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_LBRACE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_EQ_EQ] = SHIFT(233),
[aux_sym_STR_LT_EQ] = SHIFT(233),
[aux_sym_STR_LT] = SHIFT(233),
@ -4964,17 +4964,17 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = SHIFT(233),
},
[235] = {
[sym_block_statement] = REDUCE(sym_bool_op, 3),
[sym_block_statement] = REDUCE_FRAGILE(sym_bool_op, 3),
[sym__line_break] = SHIFT_EXTRA(),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LBRACE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_LBRACE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = SHIFT(228),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = SHIFT(228),
[aux_sym_STR_PLUS] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = SHIFT(232),
[aux_sym_STR_EQ_EQ] = SHIFT(233),
[aux_sym_STR_LT_EQ] = SHIFT(233),
@ -4983,13 +4983,13 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = SHIFT(233),
},
[236] = {
[sym_block_statement] = REDUCE(sym_bool_op, 3),
[sym_block_statement] = REDUCE_FRAGILE(sym_bool_op, 3),
[sym__line_break] = SHIFT_EXTRA(),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LBRACE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_LBRACE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = SHIFT(228),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = SHIFT(228),
[aux_sym_STR_PLUS] = SHIFT(230),
[aux_sym_STR_DASH] = SHIFT(230),
@ -5002,13 +5002,13 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = SHIFT(233),
},
[237] = {
[sym_block_statement] = REDUCE(sym_math_op, 3),
[sym_block_statement] = REDUCE_FRAGILE(sym_math_op, 3),
[sym__line_break] = SHIFT_EXTRA(),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = REDUCE(sym_math_op, 3),
[aux_sym_STR_LBRACE] = REDUCE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_LBRACE] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_STAR] = SHIFT(228),
[aux_sym_STR_DOT] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SLASH] = SHIFT(228),
[aux_sym_STR_PLUS] = SHIFT(230),
[aux_sym_STR_DASH] = SHIFT(230),
@ -5040,17 +5040,17 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = REDUCE(sym_selector_expression, 3),
},
[239] = {
[sym_block_statement] = REDUCE(sym_math_op, 3),
[sym_block_statement] = REDUCE_FRAGILE(sym_math_op, 3),
[sym__line_break] = SHIFT_EXTRA(),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = REDUCE(sym_math_op, 3),
[aux_sym_STR_LBRACE] = REDUCE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_LBRACE] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_STAR] = SHIFT(228),
[aux_sym_STR_DOT] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SLASH] = SHIFT(228),
[aux_sym_STR_PLUS] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_math_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_math_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_AMP_AMP] = SHIFT(232),
[aux_sym_STR_EQ_EQ] = SHIFT(233),
[aux_sym_STR_LT_EQ] = SHIFT(233),
@ -5366,17 +5366,17 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[259] = {
[sym__line_break] = SHIFT_EXTRA(),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_call_expression_repeat0] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_RPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_STAR] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_COMMA] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = REDUCE(sym_bool_op, 3),
[aux_sym_call_expression_repeat0] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_RPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_COMMA] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_EQ_EQ] = SHIFT(258),
[aux_sym_STR_LT_EQ] = SHIFT(258),
[aux_sym_STR_LT] = SHIFT(258),
@ -5386,16 +5386,16 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[260] = {
[sym__line_break] = SHIFT_EXTRA(),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_call_expression_repeat0] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_RPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_call_expression_repeat0] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_RPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = SHIFT(252),
[aux_sym_STR_COMMA] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_COMMA] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = SHIFT(252),
[aux_sym_STR_PLUS] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = SHIFT(257),
[aux_sym_STR_EQ_EQ] = SHIFT(258),
[aux_sym_STR_LT_EQ] = SHIFT(258),
@ -5406,12 +5406,12 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[261] = {
[sym__line_break] = SHIFT_EXTRA(),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_call_expression_repeat0] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_RPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_call_expression_repeat0] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_RPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = SHIFT(252),
[aux_sym_STR_COMMA] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_COMMA] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = SHIFT(252),
[aux_sym_STR_PLUS] = SHIFT(255),
[aux_sym_STR_DASH] = SHIFT(255),
@ -5426,12 +5426,12 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[262] = {
[sym__line_break] = SHIFT_EXTRA(),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_call_expression_repeat0] = REDUCE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE(sym_math_op, 3),
[aux_sym_STR_RPAREN] = REDUCE(sym_math_op, 3),
[aux_sym_call_expression_repeat0] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_RPAREN] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_STAR] = SHIFT(252),
[aux_sym_STR_COMMA] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_math_op, 3),
[aux_sym_STR_COMMA] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SLASH] = SHIFT(252),
[aux_sym_STR_PLUS] = SHIFT(255),
[aux_sym_STR_DASH] = SHIFT(255),
@ -5491,16 +5491,16 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[266] = {
[sym__line_break] = SHIFT_EXTRA(),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_call_expression_repeat0] = REDUCE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE(sym_math_op, 3),
[aux_sym_STR_RPAREN] = REDUCE(sym_math_op, 3),
[aux_sym_call_expression_repeat0] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_RPAREN] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_STAR] = SHIFT(252),
[aux_sym_STR_COMMA] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_math_op, 3),
[aux_sym_STR_COMMA] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SLASH] = SHIFT(252),
[aux_sym_STR_PLUS] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_math_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_math_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_AMP_AMP] = SHIFT(257),
[aux_sym_STR_EQ_EQ] = SHIFT(258),
[aux_sym_STR_LT_EQ] = SHIFT(258),
@ -6050,17 +6050,17 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_BANG] = SHIFT(217),
},
[301] = {
[sym__line_break] = REDUCE(sym_bool_op, 3),
[sym__line_break] = REDUCE_FRAGILE(sym_bool_op, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_STAR] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_EQ_EQ] = SHIFT(300),
[aux_sym_STR_LT_EQ] = SHIFT(300),
[aux_sym_STR_LT] = SHIFT(300),
@ -6068,16 +6068,16 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = SHIFT(300),
},
[302] = {
[sym__line_break] = REDUCE(sym_bool_op, 3),
[sym__line_break] = REDUCE_FRAGILE(sym_bool_op, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = SHIFT(295),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = SHIFT(295),
[aux_sym_STR_PLUS] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = SHIFT(299),
[aux_sym_STR_EQ_EQ] = SHIFT(300),
[aux_sym_STR_LT_EQ] = SHIFT(300),
@ -6086,12 +6086,12 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = SHIFT(300),
},
[303] = {
[sym__line_break] = REDUCE(sym_bool_op, 3),
[sym__line_break] = REDUCE_FRAGILE(sym_bool_op, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = SHIFT(295),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = SHIFT(295),
[aux_sym_STR_PLUS] = SHIFT(297),
[aux_sym_STR_DASH] = SHIFT(297),
@ -6104,12 +6104,12 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = SHIFT(300),
},
[304] = {
[sym__line_break] = REDUCE(sym_math_op, 3),
[sym__line_break] = REDUCE_FRAGILE(sym_math_op, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = REDUCE(sym_math_op, 3),
[aux_sym_STR_SEMI] = REDUCE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SEMI] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_STAR] = SHIFT(295),
[aux_sym_STR_DOT] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SLASH] = SHIFT(295),
[aux_sym_STR_PLUS] = SHIFT(297),
[aux_sym_STR_DASH] = SHIFT(297),
@ -6140,16 +6140,16 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = REDUCE(sym_selector_expression, 3),
},
[306] = {
[sym__line_break] = REDUCE(sym_math_op, 3),
[sym__line_break] = REDUCE_FRAGILE(sym_math_op, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_STR_LPAREN] = REDUCE(sym_math_op, 3),
[aux_sym_STR_SEMI] = REDUCE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SEMI] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_STAR] = SHIFT(295),
[aux_sym_STR_DOT] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SLASH] = SHIFT(295),
[aux_sym_STR_PLUS] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_math_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_math_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_AMP_AMP] = SHIFT(299),
[aux_sym_STR_EQ_EQ] = SHIFT(300),
[aux_sym_STR_LT_EQ] = SHIFT(300),
@ -6514,19 +6514,19 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_BANG] = SHIFT(316),
},
[328] = {
[sym__line_break] = REDUCE(sym_bool_op, 3),
[sym__line_break] = REDUCE_FRAGILE(sym_bool_op, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_return_statement_repeat0] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_STAR] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_COMMA] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = REDUCE(sym_bool_op, 3),
[aux_sym_return_statement_repeat0] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_COMMA] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_EQ_EQ] = SHIFT(327),
[aux_sym_STR_LT_EQ] = SHIFT(327),
[aux_sym_STR_LT] = SHIFT(327),
@ -6534,18 +6534,18 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = SHIFT(327),
},
[329] = {
[sym__line_break] = REDUCE(sym_bool_op, 3),
[sym__line_break] = REDUCE_FRAGILE(sym_bool_op, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_return_statement_repeat0] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE(sym_bool_op, 3),
[aux_sym_return_statement_repeat0] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = SHIFT(321),
[aux_sym_STR_COMMA] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_COMMA] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = SHIFT(321),
[aux_sym_STR_PLUS] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_AMP_AMP] = SHIFT(326),
[aux_sym_STR_EQ_EQ] = SHIFT(327),
[aux_sym_STR_LT_EQ] = SHIFT(327),
@ -6554,14 +6554,14 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = SHIFT(327),
},
[330] = {
[sym__line_break] = REDUCE(sym_bool_op, 3),
[sym__line_break] = REDUCE_FRAGILE(sym_bool_op, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_return_statement_repeat0] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE(sym_bool_op, 3),
[aux_sym_return_statement_repeat0] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SEMI] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_STAR] = SHIFT(321),
[aux_sym_STR_COMMA] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_bool_op, 3),
[aux_sym_STR_COMMA] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_bool_op, 3),
[aux_sym_STR_SLASH] = SHIFT(321),
[aux_sym_STR_PLUS] = SHIFT(324),
[aux_sym_STR_DASH] = SHIFT(324),
@ -6574,14 +6574,14 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_GT] = SHIFT(327),
},
[331] = {
[sym__line_break] = REDUCE(sym_math_op, 3),
[sym__line_break] = REDUCE_FRAGILE(sym_math_op, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_return_statement_repeat0] = REDUCE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE(sym_math_op, 3),
[aux_sym_STR_SEMI] = REDUCE(sym_math_op, 3),
[aux_sym_return_statement_repeat0] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SEMI] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_STAR] = SHIFT(321),
[aux_sym_STR_COMMA] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_math_op, 3),
[aux_sym_STR_COMMA] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SLASH] = SHIFT(321),
[aux_sym_STR_PLUS] = SHIFT(324),
[aux_sym_STR_DASH] = SHIFT(324),
@ -6639,18 +6639,18 @@ static const TSParseAction ts_parse_actions[STATE_COUNT][SYMBOL_COUNT] = {
[aux_sym_STR_SEMI] = REDUCE(aux_sym_return_statement_repeat0, 3),
},
[335] = {
[sym__line_break] = REDUCE(sym_math_op, 3),
[sym__line_break] = REDUCE_FRAGILE(sym_math_op, 3),
[sym_comment] = SHIFT_EXTRA(),
[aux_sym_return_statement_repeat0] = REDUCE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE(sym_math_op, 3),
[aux_sym_STR_SEMI] = REDUCE(sym_math_op, 3),
[aux_sym_return_statement_repeat0] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_LPAREN] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SEMI] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_STAR] = SHIFT(321),
[aux_sym_STR_COMMA] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE(sym_math_op, 3),
[aux_sym_STR_COMMA] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_DOT] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_SLASH] = SHIFT(321),
[aux_sym_STR_PLUS] = REDUCE(sym_math_op, 3),
[aux_sym_STR_DASH] = REDUCE(sym_math_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE(sym_math_op, 3),
[aux_sym_STR_PLUS] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_DASH] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_PIPE_PIPE] = REDUCE_FRAGILE(sym_math_op, 3),
[aux_sym_STR_AMP_AMP] = SHIFT(326),
[aux_sym_STR_EQ_EQ] = SHIFT(327),
[aux_sym_STR_LT_EQ] = SHIFT(327),

File diff suppressed because it is too large Load diff

View file

@ -269,7 +269,7 @@ describe("Parser", [&]() {
});
it("re-reads only the changed portion of the input", [&]() {
AssertThat(reader->strings_read, Equals(vector<string>({ "123 + 5 ", " 4", "" })));
AssertThat(reader->strings_read, Equals(vector<string>({ "123 + 5 ", " 4", " ^ (", "" })));
});
});

View file

@ -1,3 +1,4 @@
#include <algorithm>
#include <map>
#include <set>
#include <string>
@ -17,6 +18,7 @@
namespace tree_sitter {
namespace build_tables {
using std::find;
using std::pair;
using std::vector;
using std::set;
@ -30,6 +32,7 @@ class ParseTableBuilder {
const SyntaxGrammar grammar;
const LexicalGrammar lex_grammar;
unordered_map<const ParseItemSet, ParseStateId> parse_state_ids;
vector<vector<Symbol>> productions;
vector<pair<ParseItemSet, ParseStateId>> item_sets_to_process;
ParseTable parse_table;
std::set<Conflict> conflicts;
@ -105,7 +108,7 @@ class ParseTableBuilder {
(item.lhs == rules::START())
? ParseAction::Accept()
: ParseAction::Reduce(item.lhs, item.consumed_symbols.size(),
item.precedence());
item.precedence(), get_production_id(item.consumed_symbols));
for (const auto &lookahead_sym : lookahead_symbols)
if (should_add_action(state_id, lookahead_sym, action, ParseItemSet()))
@ -159,9 +162,15 @@ class ParseTableBuilder {
auto result = action_takes_precedence(action, current_action->second,
symbol);
if (result.second)
if (result.second) {
record_conflict(symbol, current_action->second, action, item_set);
if (action.type == ParseActionTypeReduce)
parse_table.fragile_production_ids.insert(action.production_id);
if (current_action->second.type == ParseActionTypeReduce)
parse_table.fragile_production_ids.insert(current_action->second.production_id);
}
return result.first;
}
@ -175,6 +184,17 @@ class ParseTableBuilder {
return result;
}
int get_production_id(const vector<Symbol> &symbols) {
auto begin = productions.begin();
auto end = productions.end();
auto iter = find(begin, end, symbols);
if (iter == end) {
productions.push_back(symbols);
return productions.size() - 1;
}
return iter - begin;
}
void record_conflict(const Symbol &sym, const ParseAction &left,
const ParseAction &right, const ParseItemSet &item_set) {
conflicts.insert(

View file

@ -290,8 +290,12 @@ class CCodeGenerator {
add("SHIFT_EXTRA()");
break;
case ParseActionTypeReduce:
add("REDUCE(" + symbol_id(action.symbol) + ", " +
to_string(action.consumed_symbol_count) + ")");
if (reduce_action_is_fragile(action))
add("REDUCE_FRAGILE(" + symbol_id(action.symbol) + ", " +
to_string(action.consumed_symbol_count) + ")");
else
add("REDUCE(" + symbol_id(action.symbol) + ", " +
to_string(action.consumed_symbol_count) + ")");
break;
case ParseActionTypeReduceExtra:
add("REDUCE_EXTRA(" + symbol_id(action.symbol) + ")");
@ -339,6 +343,11 @@ class CCodeGenerator {
: syntax_grammar.rule_name(symbol);
}
bool reduce_action_is_fragile(const ParseAction &action) const {
return parse_table.fragile_production_ids.find(action.production_id) !=
parse_table.fragile_production_ids.end();
}
// C-code generation functions
void _switch(string condition, function<void()> body) {

View file

@ -12,12 +12,14 @@ using rules::Symbol;
ParseAction::ParseAction(ParseActionType type, ParseStateId state_index,
Symbol symbol, size_t consumed_symbol_count,
set<int> precedence_values)
set<int> precedence_values,
int production_id)
: type(type),
symbol(symbol),
state_index(state_index),
consumed_symbol_count(consumed_symbol_count),
precedence_values(precedence_values) {}
precedence_values(precedence_values),
production_id(production_id) {}
ParseAction::ParseAction()
: type(ParseActionTypeError),
@ -26,31 +28,31 @@ ParseAction::ParseAction()
consumed_symbol_count(0) {}
ParseAction ParseAction::Error() {
return ParseAction(ParseActionTypeError, -1, Symbol(-1), 0, { 0 });
return ParseAction(ParseActionTypeError, -1, Symbol(-1), 0, { 0 }, 0);
}
ParseAction ParseAction::Accept() {
return ParseAction(ParseActionTypeAccept, -1, Symbol(-1), 0, { 0 });
return ParseAction(ParseActionTypeAccept, -1, Symbol(-1), 0, { 0 }, 0);
}
ParseAction ParseAction::Shift(ParseStateId state_index,
set<int> precedence_values) {
return ParseAction(ParseActionTypeShift, state_index, Symbol(-1), 0,
precedence_values);
precedence_values, 0);
}
ParseAction ParseAction::ShiftExtra() {
return ParseAction(ParseActionTypeShiftExtra, 0, Symbol(-1), 0, { 0 });
return ParseAction(ParseActionTypeShiftExtra, 0, Symbol(-1), 0, { 0 }, 0);
}
ParseAction ParseAction::ReduceExtra(Symbol symbol) {
return ParseAction(ParseActionTypeReduceExtra, 0, symbol, 0, { 0 });
return ParseAction(ParseActionTypeReduceExtra, 0, symbol, 0, { 0 }, 0);
}
ParseAction ParseAction::Reduce(Symbol symbol, size_t consumed_symbol_count,
int precedence) {
int precedence, int production_id) {
return ParseAction(ParseActionTypeReduce, 0, symbol, consumed_symbol_count,
{ precedence });
{ precedence }, production_id);
}
bool ParseAction::operator==(const ParseAction &other) const {

View file

@ -24,7 +24,7 @@ typedef enum {
class ParseAction {
ParseAction(ParseActionType type, ParseStateId state_index,
rules::Symbol symbol, size_t consumed_symbol_count,
std::set<int> precedence_values);
std::set<int> precedence_values, int production_id);
public:
ParseAction();
@ -33,7 +33,7 @@ class ParseAction {
static ParseAction Shift(ParseStateId state_index,
std::set<int> precedence_values);
static ParseAction Reduce(rules::Symbol symbol, size_t consumed_symbol_count,
int precedence);
int precedence, int production_id);
static ParseAction ShiftExtra();
static ParseAction ReduceExtra(rules::Symbol symbol);
bool operator==(const ParseAction &action) const;
@ -43,6 +43,7 @@ class ParseAction {
ParseStateId state_index;
size_t consumed_symbol_count;
std::set<int> precedence_values;
int production_id;
};
std::ostream &operator<<(std::ostream &stream, const ParseAction &item);
@ -57,7 +58,8 @@ struct hash<tree_sitter::ParseAction> {
return (hash<int>()(action.type) ^
hash<tree_sitter::rules::Symbol>()(action.symbol) ^
hash<size_t>()(action.state_index) ^
hash<size_t>()(action.consumed_symbol_count));
hash<size_t>()(action.consumed_symbol_count) ^
hash<size_t>()(action.production_id));
}
};
@ -83,6 +85,7 @@ class ParseTable {
std::vector<ParseState> states;
std::set<rules::Symbol> symbols;
std::set<int> fragile_production_ids;
};
} // namespace tree_sitter

View file

@ -212,6 +212,12 @@ static void reduce_extra(TSParser *parser, TSSymbol symbol) {
ts_tree_set_extra(parser->lookahead);
}
static void reduce_fragile(TSParser *parser, TSSymbol symbol, size_t child_count) {
reduce(parser, symbol, child_count);
ts_tree_set_fragile_left(parser->lookahead);
ts_tree_set_fragile_right(parser->lookahead);
}
static int handle_error(TSParser *parser) {
TSTree *error = parser->lookahead;
ts_tree_retain(error);
@ -374,6 +380,12 @@ const TSTree *ts_parser_parse(TSParser *parser, TSInput input,
reduce_extra(parser, action.data.symbol);
break;
case TSParseActionTypeReduceFragile:
reduce_fragile(parser, action.data.symbol, action.data.child_count);
DEBUG("reduce_fragile sym:%s, count:%u, state:%u", SYM_NAME(action.data.symbol),
action.data.child_count, ts_stack_top_state(&parser->stack));
break;
case TSParseActionTypeAccept:
DEBUG("accept");
return finish(parser);