From 969a118ab5493ed3f1060f408d26f7f1b820ac8d Mon Sep 17 00:00:00 2001 From: ydah Date: Sat, 4 May 2024 20:57:51 +0900 Subject: [PATCH 1/2] Add support for Named Reference in parameterizing rules callers --- lib/lrama/parser.rb | 126 +++++++++--------- parser.y | 8 +- .../user_defined_parameterizing_rules.y | 2 +- 3 files changed, 69 insertions(+), 67 deletions(-) diff --git a/lib/lrama/parser.rb b/lib/lrama/parser.rb index ca56b781..47ca7262 100644 --- a/lib/lrama/parser.rb +++ b/lib/lrama/parser.rb @@ -748,16 +748,16 @@ def raise_parse_error(error_message, location) 50, 50, 79, 79, 51, 51, 50, 212, 79, 79, 51, 51, 212, 212, 79, 79, 51, 54, 50, 186, 79, 54, 159, 191, 192, 193, 96, 191, 192, 193, - 96, 223, 227, 235, 224, 224, 224, 51, 51, 50, + 96, 223, 228, 236, 224, 224, 224, 51, 51, 50, 50, 51, 57, 50, 191, 192, 193, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 90, 94, 96, 101, 101, 101, 103, 109, 112, 114, 117, 117, 117, 117, 120, 125, 126, 128, 130, 131, 132, 133, 134, 79, 141, 142, 143, 144, 145, 148, 149, 150, 152, 162, 141, 171, 173, 174, 175, 176, 177, 178, 180, - 181, 148, 188, 196, 197, 204, 162, 208, 211, 178, - 216, 162, 220, 162, 222, 181, 181, 178, 232, 178, - 234, 96, 96, 178 ] + 181, 148, 188, 196, 197, 204, 162, 208, 211, 96, + 216, 162, 220, 162, 222, 178, 181, 181, 96, 233, + 178, 235, 178, 96, 96, 178 ] racc_action_check = [ 49, 147, 49, 147, 39, 147, 161, 187, 161, 187, @@ -780,7 +780,7 @@ def raise_parse_error(error_message, location) 138, 169, 138, 169, 185, 188, 185, 188, 185, 188, 208, 222, 208, 222, 208, 222, 224, 17, 224, 163, 224, 18, 163, 167, 167, 167, 167, 182, 182, 182, - 182, 213, 219, 229, 213, 219, 229, 119, 135, 119, + 182, 213, 219, 230, 213, 219, 230, 119, 135, 119, 135, 139, 19, 139, 214, 214, 214, 20, 23, 25, 26, 27, 28, 29, 30, 31, 32, 40, 45, 46, 53, 55, 56, 57, 68, 72, 73, 80, 85, 86, @@ -788,8 +788,8 @@ def raise_parse_error(error_message, location) 113, 120, 121, 122, 123, 124, 125, 126, 127, 129, 142, 143, 151, 153, 154, 155, 156, 157, 158, 159, 160, 164, 166, 170, 172, 179, 181, 183, 186, 190, - 194, 204, 209, 211, 212, 218, 221, 223, 226, 227, - 228, 232, 234, 236 ] + 194, 204, 209, 211, 212, 215, 218, 221, 223, 227, + 228, 229, 231, 233, 235, 238 ] racc_action_pointer = [ nil, 20, 22, 26, 98, nil, nil, 39, nil, 33, @@ -811,14 +811,15 @@ def raise_parse_error(error_message, location) 225, 3, nil, 148, 225, nil, 232, 145, nil, 166, 253, nil, 254, nil, nil, 71, 77, 83, nil, 233, nil, 230, 149, 237, nil, 171, 236, 4, 172, nil, - 271, nil, nil, nil, 278, nil, nil, nil, 135, nil, + 228, nil, nil, nil, 278, nil, nil, nil, 135, nil, nil, nil, 141, 147, 235, 9, nil, nil, 177, 280, - nil, 237, 244, 160, 166, nil, nil, nil, 240, 161, - nil, 241, 178, 279, 183, nil, 268, 281, 270, 162, - nil, nil, 240, nil, 241, nil, 285, nil, nil ] + nil, 237, 244, 160, 166, 277, nil, nil, 241, 161, + nil, 242, 178, 237, 183, nil, nil, 269, 282, 271, + 162, 284, nil, 242, nil, 243, nil, nil, 287, nil, + nil ] racc_action_default = [ - -2, -139, -8, -139, -139, -3, -4, -139, 239, -139, + -2, -139, -8, -139, -139, -3, -4, -139, 241, -139, -9, -10, -11, -12, -139, -139, -139, -139, -139, -139, -139, -24, -25, -139, -29, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, -139, @@ -837,64 +838,65 @@ def raise_parse_error(error_message, location) -61, -65, -68, -139, -107, -106, -97, -123, -112, -139, -139, -90, -139, -23, -28, -139, -139, -139, -59, -139, -64, -67, -123, -97, -72, -139, -139, -105, -139, -109, - -58, -116, -117, -118, -139, -115, -87, -20, -32, -134, + -123, -116, -117, -118, -139, -115, -87, -20, -32, -134, -136, -137, -35, -38, -67, -66, -69, -70, -139, -139, - -75, -67, -97, -139, -119, -110, -113, -135, -60, -139, - -73, -62, -139, -58, -139, -121, -139, -58, -139, -139, - -111, -120, -123, -71, -123, -122, -58, -74, -114 ] + -75, -67, -97, -139, -119, -58, -113, -135, -60, -139, + -73, -62, -139, -123, -139, -121, -110, -139, -58, -139, + -139, -58, -120, -123, -71, -123, -122, -111, -58, -74, + -114 ] racc_goto_table = [ - 76, 95, 190, 74, 52, 69, 160, 179, 110, 118, - 119, 1, 147, 43, 213, 140, 217, 207, 2, 4, - 217, 217, 72, 42, 84, 84, 84, 84, 80, 85, - 86, 87, 91, 5, 219, 53, 55, 56, 163, 215, - 115, 76, 111, 40, 116, 139, 92, 118, 229, 225, - 110, 187, 198, 202, 203, 123, 10, 11, 72, 72, - 12, 13, 49, 97, 129, 172, 104, 118, 218, 153, - 84, 84, 230, 105, 110, 221, 233, 154, 106, 155, - 76, 135, 115, 138, 107, 238, 156, 108, 157, 68, - 73, 136, 113, 121, 205, 209, 228, 137, 72, 127, - 72, 170, 102, 151, 115, 146, 84, 194, 84, 226, + 76, 52, 95, 179, 74, 69, 110, 147, 160, 119, + 190, 118, 140, 213, 53, 55, 56, 43, 1, 72, + 2, 84, 84, 84, 84, 207, 217, 198, 202, 203, + 217, 217, 4, 219, 42, 163, 80, 85, 86, 87, + 115, 76, 111, 91, 139, 116, 187, 230, 110, 118, + 92, 5, 40, 123, 10, 72, 72, 225, 11, 12, + 226, 13, 49, 97, 129, 172, 104, 84, 84, 118, + 218, 153, 110, 234, 105, 154, 237, 221, 106, 155, + 76, 135, 115, 240, 138, 107, 156, 108, 157, 68, + 73, 136, 113, 121, 205, 72, 209, 72, 229, 137, + 127, 170, 102, 84, 115, 84, 151, 146, 194, 227, 124, nil, nil, 167, nil, nil, nil, nil, nil, nil, - nil, nil, 189, nil, 72, nil, nil, 182, 84, nil, - nil, nil, nil, nil, nil, 195, nil, 206, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 72, nil, 189, nil, 84, nil, 182, nil, nil, + nil, nil, nil, nil, nil, 195, nil, nil, 206, nil, + nil, nil, nil, nil, nil, nil, 215, nil, nil, nil, nil, 210, nil, 167, 214, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, 182, nil, nil, 214, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 236, 214, 237, - 231 ] + nil, 182, nil, nil, 214, nil, nil, nil, nil, 231, + nil, nil, nil, nil, nil, nil, nil, nil, 214, 238, + 232, 239 ] racc_goto_check = [ - 43, 44, 45, 50, 35, 33, 39, 40, 34, 56, - 55, 1, 60, 57, 46, 38, 64, 45, 2, 3, - 64, 64, 35, 4, 35, 35, 35, 35, 32, 32, - 32, 32, 5, 6, 46, 15, 15, 15, 38, 40, - 43, 43, 33, 7, 50, 55, 57, 56, 46, 45, - 34, 60, 21, 21, 21, 8, 9, 10, 35, 35, - 11, 12, 13, 14, 16, 17, 18, 56, 39, 19, - 35, 35, 40, 22, 34, 39, 40, 23, 24, 25, - 43, 33, 43, 50, 26, 40, 27, 28, 29, 30, - 31, 36, 37, 41, 42, 47, 48, 49, 35, 51, - 35, 52, 53, 54, 43, 59, 35, 61, 35, 62, + 43, 35, 44, 40, 50, 33, 34, 60, 39, 55, + 45, 56, 38, 46, 15, 15, 15, 57, 1, 35, + 2, 35, 35, 35, 35, 45, 64, 21, 21, 21, + 64, 64, 3, 46, 4, 38, 32, 32, 32, 32, + 43, 43, 33, 5, 55, 50, 60, 46, 34, 56, + 57, 6, 7, 8, 9, 35, 35, 45, 10, 11, + 40, 12, 13, 14, 16, 17, 18, 35, 35, 56, + 39, 19, 34, 40, 22, 23, 40, 39, 24, 25, + 43, 33, 43, 40, 50, 26, 27, 28, 29, 30, + 31, 36, 37, 41, 42, 35, 47, 35, 48, 49, + 51, 52, 53, 35, 43, 35, 54, 59, 61, 62, 63, nil, nil, 43, nil, nil, nil, nil, nil, nil, - nil, nil, 44, nil, 35, nil, nil, 43, 35, nil, - nil, nil, nil, nil, nil, 43, nil, 44, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 35, nil, 44, nil, 35, nil, 43, nil, nil, + nil, nil, nil, nil, nil, 43, nil, nil, 44, nil, + nil, nil, nil, nil, nil, nil, 44, nil, nil, nil, nil, 43, nil, 43, 43, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, 43, nil, nil, 43, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 44, 43, 44, - 43 ] + nil, 43, nil, nil, 43, nil, nil, nil, nil, 44, + nil, nil, nil, nil, nil, nil, nil, nil, 43, 44, + 43, 44 ] racc_goto_pointer = [ - nil, 11, 18, 17, 14, -10, 31, 37, -35, 52, - 53, 56, 57, 47, 14, 19, -39, -87, 8, -61, - nil, -123, 14, -54, 18, -53, 23, -47, 25, -46, - 56, 56, -7, -28, -61, -11, -22, 20, -105, -136, - -151, 4, -87, -34, -45, -165, -174, -89, -124, -16, - -31, -2, -49, 48, -25, -72, -72, 4, nil, -20, - -113, -61, -107, 17, -182 ] + nil, 18, 20, 30, 25, 1, 49, 46, -37, 50, + 54, 55, 57, 47, 14, -2, -39, -87, 8, -59, + nil, -148, 15, -56, 18, -53, 24, -47, 25, -46, + 56, 56, 1, -28, -63, -14, -22, 20, -108, -134, + -155, 4, -87, -34, -44, -157, -175, -88, -122, -14, + -30, -1, -49, 48, -22, -73, -70, 8, nil, -18, + -118, -60, -107, 17, -172 ] racc_goto_default = [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, @@ -1016,8 +1018,8 @@ def raise_parse_error(error_message, location) 0, 114, :_reduce_107, 1, 114, :_reduce_108, 3, 114, :_reduce_109, - 4, 114, :_reduce_110, - 6, 114, :_reduce_111, + 5, 114, :_reduce_110, + 7, 114, :_reduce_111, 0, 115, :_reduce_112, 0, 116, :_reduce_113, 8, 114, :_reduce_114, @@ -1048,7 +1050,7 @@ def raise_parse_error(error_message, location) racc_reduce_n = 139 -racc_shift_n = 239 +racc_shift_n = 241 racc_token_table = { false => 0, @@ -2059,7 +2061,7 @@ def _reduce_109(val, _values, result) module_eval(<<'.,.,', 'parser.y', 448) def _reduce_110(val, _values, result) - token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], location: @lexer.location, args: [val[1]], lhs_tag: val[3]) + token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], alias_name: val[3], location: @lexer.location, args: [val[1]], lhs_tag: val[4]) builder = val[0] builder.add_rhs(token) builder.line = val[1].first_line @@ -2071,7 +2073,7 @@ def _reduce_110(val, _values, result) module_eval(<<'.,.,', 'parser.y', 456) def _reduce_111(val, _values, result) - token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[3], lhs_tag: val[5]) + token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, alias_name: val[5], location: @lexer.location, args: val[3], lhs_tag: val[6]) builder = val[0] builder.add_rhs(token) builder.line = val[1].first_line diff --git a/parser.y b/parser.y index e0bc3f08..66ebc4fd 100644 --- a/parser.y +++ b/parser.y @@ -444,17 +444,17 @@ rule builder.add_rhs(token) result = builder } - | rhs symbol parameterizing_suffix TAG? + | rhs symbol parameterizing_suffix named_ref_opt TAG? { - token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], location: @lexer.location, args: [val[1]], lhs_tag: val[3]) + token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], alias_name: val[3], location: @lexer.location, args: [val[1]], lhs_tag: val[4]) builder = val[0] builder.add_rhs(token) builder.line = val[1].first_line result = builder } - | rhs IDENTIFIER "(" parameterizing_args ")" TAG? + | rhs IDENTIFIER "(" parameterizing_args ")" named_ref_opt TAG? { - token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[3], lhs_tag: val[5]) + token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, alias_name: val[5], location: @lexer.location, args: val[3], lhs_tag: val[6]) builder = val[0] builder.add_rhs(token) builder.line = val[1].first_line diff --git a/spec/fixtures/integration/user_defined_parameterizing_rules.y b/spec/fixtures/integration/user_defined_parameterizing_rules.y index 308c7e36..b92970df 100644 --- a/spec/fixtures/integration/user_defined_parameterizing_rules.y +++ b/spec/fixtures/integration/user_defined_parameterizing_rules.y @@ -39,7 +39,7 @@ stmts: separated_list(';', stmt) ; stmt: pair(ODD, EVEN) { printf("pair odd even: %d\n", $1); } - | pair(EVEN, ODD) { printf("pair even odd: %d\n", $1); } + | pair(EVEN, ODD)[result] { printf("pair even odd: %d\n", $result); } ; %% From effe94adab3babaa1646d94ae4726cd5246a86fd Mon Sep 17 00:00:00 2001 From: ydah Date: Mon, 27 May 2024 01:55:49 +0900 Subject: [PATCH 2/2] Add test case for parameterizing rules suffix with Named Reference --- spec/fixtures/integration/parameterizing_rules.y | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/fixtures/integration/parameterizing_rules.y b/spec/fixtures/integration/parameterizing_rules.y index 98a47132..3489d6f4 100644 --- a/spec/fixtures/integration/parameterizing_rules.y +++ b/spec/fixtures/integration/parameterizing_rules.y @@ -15,11 +15,13 @@ static int yyerror(YYLTYPE *loc, const char *str); %union { int num; + char* str; } %token ODD EVEN %type stmt +%type opt_nl %% @@ -33,7 +35,7 @@ stmt: ODD opt_nl { printf("odd: %d\n", $1); } | EVEN opt_semicolon { printf("even: %d\n", $1); } ; -opt_nl: '\n'? +opt_nl: '\n'?[nl] { $$ = $nl; } ; opt_semicolon: semicolon?