diff --git a/lib/lrama/parser.rb b/lib/lrama/parser.rb index fa101d41..571792d7 100644 --- a/lib/lrama/parser.rb +++ b/lib/lrama/parser.rb @@ -655,7 +655,7 @@ def token_to_str(t) module Lrama class Parser < Racc::Parser -module_eval(<<'...end parser.y/module_eval...', 'parser.y', 603) +module_eval(<<'...end parser.y/module_eval...', 'parser.y', 611) include Lrama::Tracer::Duration @@ -784,17 +784,16 @@ def merge_locations(*locations) 52, 110, 105, 53, 53, 52, 52, 110, 105, 53, 53, 52, 52, 110, 105, 53, 53, 52, 52, 110, 105, 53, 53, 52, 52, 110, 110, 53, 53, 52, - 209, 110, 110, 53, 53, 209, 225, 110, 110, 53, - 53, 209, 209, 110, 110, 193, 194, 195, 137, 216, - 222, 232, 217, 217, 217, 235, 57, 53, 217, 52, - 53, 53, 52, 52, 193, 194, 195, 57, 57, 57, - 66, 67, 68, 69, 70, 72, 72, 72, 86, 89, - 47, 57, 57, 113, 117, 117, 79, 123, 124, 131, - 47, 133, 137, 139, 143, 149, 150, 151, 152, 133, - 155, 156, 157, 110, 166, 149, 169, 172, 173, 72, - 175, 176, 183, 189, 166, 196, 137, 200, 202, 137, - 166, 211, 166, 137, 72, 176, 218, 176, 72, 137, - 228, 137, 72, 231, 72 ] + 209, 110, 110, 53, 53, 209, 209, 110, 110, 53, + 53, 209, 52, 110, 193, 194, 195, 137, 217, 222, + 230, 218, 218, 218, 53, 53, 52, 52, 193, 194, + 195, 57, 57, 57, 57, 66, 67, 68, 69, 70, + 72, 72, 72, 86, 89, 47, 57, 57, 113, 117, + 117, 79, 123, 124, 131, 47, 133, 137, 139, 143, + 149, 150, 151, 152, 133, 155, 156, 157, 110, 166, + 149, 169, 172, 173, 72, 175, 176, 183, 189, 166, + 196, 137, 200, 202, 137, 166, 212, 166, 137, 72, + 176, 219, 176, 72, 137, 227, 137, 72, 72 ] racc_action_check = [ 51, 97, 51, 97, 41, 75, 165, 75, 165, 75, @@ -817,121 +816,120 @@ def merge_locations(*locations) 13, 63, 63, 64, 73, 64, 73, 64, 64, 65, 78, 65, 78, 65, 65, 106, 79, 106, 79, 106, 106, 118, 180, 118, 180, 118, 180, 188, 196, 188, - 196, 188, 196, 202, 217, 202, 217, 202, 217, 218, - 231, 218, 231, 218, 231, 186, 186, 186, 186, 208, - 213, 227, 208, 213, 227, 234, 24, 113, 234, 113, - 114, 123, 114, 123, 210, 210, 210, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 40, 42, - 47, 55, 60, 71, 74, 76, 80, 81, 87, 91, - 92, 93, 94, 102, 116, 124, 125, 126, 127, 133, - 136, 137, 138, 144, 150, 151, 153, 156, 158, 162, - 163, 164, 170, 174, 176, 178, 179, 182, 184, 187, - 189, 199, 200, 204, 205, 207, 209, 212, 214, 216, - 221, 222, 224, 225, 229 ] + 196, 188, 196, 202, 218, 202, 218, 202, 218, 219, + 113, 219, 113, 219, 186, 186, 186, 186, 208, 214, + 226, 208, 214, 226, 114, 123, 114, 123, 211, 211, + 211, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 40, 42, 47, 55, 60, 71, 74, + 76, 80, 81, 87, 91, 92, 93, 94, 102, 116, + 124, 125, 126, 127, 133, 136, 137, 138, 144, 150, + 151, 153, 156, 158, 162, 163, 164, 170, 174, 176, + 178, 179, 182, 184, 187, 189, 199, 200, 204, 205, + 207, 209, 213, 215, 217, 221, 222, 224, 228 ] racc_action_pointer = [ 32, 23, 52, 93, nil, 31, 63, nil, 123, 68, 74, 84, 103, 165, 94, 111, 123, 135, 141, nil, - nil, nil, nil, nil, 210, 221, 222, 223, 235, 236, - 237, 238, 239, 237, 238, 239, 24, 25, 31, 32, - 243, -1, 247, nil, nil, nil, 43, 237, nil, nil, - nil, -5, nil, nil, nil, 235, nil, nil, nil, nil, - 236, nil, nil, 164, 170, 176, nil, nil, nil, nil, - nil, 245, nil, 171, 246, 2, 247, nil, 177, 183, - 248, 249, nil, nil, nil, nil, nil, 214, 45, nil, - 63, 250, 247, 248, 207, nil, nil, -4, nil, nil, - nil, nil, 261, nil, nil, nil, 182, nil, nil, nil, - nil, nil, nil, 224, 227, nil, 258, 38, 188, nil, - nil, nil, nil, 228, 260, 220, 223, 257, nil, nil, - nil, nil, nil, 256, nil, nil, 224, 266, 255, nil, - nil, nil, nil, nil, 266, nil, nil, nil, -24, nil, - 224, 270, nil, 274, nil, nil, 221, nil, 261, nil, - nil, nil, 271, 275, 232, 3, nil, nil, 3, nil, - 233, 9, nil, nil, 237, nil, 234, 3, 241, 231, - 189, nil, 241, nil, 244, nil, 163, 234, 194, 240, - 10, nil, nil, nil, nil, nil, 195, nil, nil, 289, - 242, 15, 200, nil, 238, 286, nil, 246, 174, 252, - 182, nil, 248, 175, 290, nil, 244, 201, 206, nil, - nil, 283, 246, nil, 294, 259, nil, 176, nil, 296, - nil, 207, nil, nil, 180, nil ] + nil, nil, nil, nil, 215, 216, 217, 218, 230, 231, + 232, 233, 234, 232, 233, 234, 24, 25, 31, 32, + 238, -1, 242, nil, nil, nil, 43, 232, nil, nil, + nil, -5, nil, nil, nil, 230, nil, nil, nil, nil, + 231, nil, nil, 164, 170, 176, nil, nil, nil, nil, + nil, 240, nil, 171, 241, 2, 242, nil, 177, 183, + 243, 244, nil, nil, nil, nil, nil, 209, 45, nil, + 63, 245, 242, 243, 202, nil, nil, -4, nil, nil, + nil, nil, 256, nil, nil, nil, 182, nil, nil, nil, + nil, nil, nil, 207, 221, nil, 253, 38, 188, nil, + nil, nil, nil, 222, 255, 215, 218, 252, nil, nil, + nil, nil, nil, 251, nil, nil, 219, 261, 250, nil, + nil, nil, nil, nil, 261, nil, nil, nil, -24, nil, + 219, 265, nil, 269, nil, nil, 216, nil, 256, nil, + nil, nil, 266, 270, 227, 3, nil, nil, 3, nil, + 228, 9, nil, nil, 232, nil, 229, 3, 236, 226, + 189, nil, 236, nil, 239, nil, 162, 229, 194, 235, + 10, nil, nil, nil, nil, nil, 195, nil, nil, 284, + 237, 15, 200, nil, 233, 281, nil, 241, 173, 247, + nil, 176, nil, 243, 174, 285, nil, 239, 201, 206, + nil, 278, 241, nil, 289, nil, 175, nil, 290, nil, + nil, nil ] racc_action_default = [ - -1, -137, -1, -3, -10, -137, -137, -2, -3, -137, - -14, -14, -137, -137, -137, -137, -137, -137, -137, -28, - -29, -34, -35, -36, -137, -137, -137, -137, -137, -137, - -137, -137, -137, -54, -54, -54, -137, -137, -137, -137, - -137, -137, -137, -13, 236, -4, -137, -14, -16, -17, - -20, -132, -100, -101, -131, -18, -23, -89, -24, -25, - -137, -27, -37, -137, -137, -137, -41, -42, -43, -44, - -45, -46, -55, -137, -47, -137, -48, -49, -92, -137, - -95, -97, -98, -50, -51, -52, -53, -137, -137, -11, - -5, -7, -14, -137, -72, -15, -21, -132, -133, -134, - -135, -19, -137, -26, -30, -31, -32, -38, -87, -88, - -136, -39, -40, -137, -56, -58, -60, -137, -83, -85, - -93, -94, -96, -137, -137, -137, -137, -137, -6, -8, - -9, -129, -104, -102, -105, -73, -137, -137, -137, -90, - -33, -59, -57, -61, -80, -86, -84, -99, -137, -66, - -70, -137, -12, -137, -103, -109, -137, -22, -137, -62, - -81, -82, -54, -137, -64, -68, -71, -74, -137, -130, - -106, -107, -128, -91, -137, -67, -70, -72, -100, -72, - -137, -125, -137, -109, -100, -110, -72, -72, -137, -70, - -69, -75, -76, -116, -117, -118, -137, -78, -79, -137, - -70, -108, -137, -111, -72, -54, -115, -63, -137, -100, - -119, -126, -65, -137, -54, -114, -72, -137, -137, -120, - -121, -137, -72, -112, -54, -100, -122, -137, -127, -54, - -77, -137, -124, -113, -137, -123 ] + -1, -136, -1, -3, -10, -136, -136, -2, -3, -136, + -14, -14, -136, -136, -136, -136, -136, -136, -136, -28, + -29, -34, -35, -36, -136, -136, -136, -136, -136, -136, + -136, -136, -136, -54, -54, -54, -136, -136, -136, -136, + -136, -136, -136, -13, 232, -4, -136, -14, -16, -17, + -20, -131, -100, -101, -130, -18, -23, -89, -24, -25, + -136, -27, -37, -136, -136, -136, -41, -42, -43, -44, + -45, -46, -55, -136, -47, -136, -48, -49, -92, -136, + -95, -97, -98, -50, -51, -52, -53, -136, -136, -11, + -5, -7, -14, -136, -72, -15, -21, -131, -132, -133, + -134, -19, -136, -26, -30, -31, -32, -38, -87, -88, + -135, -39, -40, -136, -56, -58, -60, -136, -83, -85, + -93, -94, -96, -136, -136, -136, -136, -136, -6, -8, + -9, -128, -104, -102, -105, -73, -136, -136, -136, -90, + -33, -59, -57, -61, -80, -86, -84, -99, -136, -66, + -70, -136, -12, -136, -103, -109, -136, -22, -136, -62, + -81, -82, -54, -136, -64, -68, -71, -74, -136, -129, + -106, -107, -127, -91, -136, -67, -70, -72, -100, -72, + -136, -124, -136, -109, -100, -110, -72, -72, -136, -70, + -69, -75, -76, -116, -117, -118, -136, -78, -79, -136, + -70, -108, -136, -111, -72, -54, -115, -63, -136, -100, + -119, -121, -125, -65, -136, -54, -114, -72, -136, -136, + -122, -136, -72, -112, -54, -120, -136, -126, -54, -77, + -123, -113 ] racc_goto_table = [ 73, 118, 136, 54, 48, 49, 164, 96, 91, 120, - 121, 93, 187, 208, 107, 111, 112, 119, 134, 213, - 56, 58, 59, 171, 61, 1, 78, 78, 78, 78, - 62, 63, 64, 65, 115, 227, 129, 192, 148, 74, - 76, 95, 187, 118, 118, 207, 204, 3, 234, 7, - 130, 201, 128, 138, 147, 93, 212, 140, 154, 145, - 146, 101, 9, 116, 42, 168, 103, 45, 78, 78, - 219, 127, 51, 71, 141, 142, 77, 83, 84, 85, - 159, 144, 190, 160, 161, 191, 132, 197, 102, 158, - 122, 177, 170, 220, 203, 205, 199, 186, 221, 153, + 121, 93, 187, 148, 107, 111, 112, 119, 134, 171, + 56, 58, 59, 3, 61, 7, 78, 78, 78, 78, + 62, 63, 64, 65, 115, 74, 76, 192, 1, 129, + 168, 95, 187, 118, 118, 207, 204, 201, 77, 83, + 84, 85, 128, 138, 147, 93, 213, 140, 154, 145, + 146, 101, 130, 116, 42, 9, 103, 208, 78, 78, + 45, 220, 127, 214, 141, 142, 51, 71, 159, 144, + 190, 160, 161, 102, 158, 191, 132, 197, 122, 170, + 226, 177, 225, 199, 203, 205, 221, 186, 153, nil, nil, nil, nil, 116, 116, nil, 198, nil, nil, nil, - nil, nil, 214, 78, 206, nil, 177, nil, nil, nil, - nil, nil, 210, nil, 224, nil, nil, 186, 210, 174, - 229, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, 226, 210, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 210, nil, nil, + nil, nil, 215, 78, 206, nil, 177, nil, nil, nil, + nil, nil, 211, nil, nil, 224, nil, 186, 211, 174, + 228, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 211, 211, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, 215, nil, nil, nil, nil, nil, nil, nil, - nil, 223, nil, nil, nil, nil, nil, nil, nil, nil, - nil, 230, nil, nil, nil, nil, 233 ] + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 216, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 223, nil, nil, nil, nil, nil, nil, nil, + nil, 229, nil, nil, nil, 231 ] racc_goto_check = [ 29, 22, 42, 31, 14, 14, 35, 16, 8, 48, - 48, 13, 40, 39, 24, 24, 24, 45, 52, 39, - 18, 18, 18, 54, 17, 1, 31, 31, 31, 31, - 17, 17, 17, 17, 30, 39, 5, 38, 34, 26, - 26, 14, 40, 22, 22, 35, 38, 6, 39, 6, - 9, 54, 8, 16, 48, 13, 35, 24, 52, 45, - 45, 18, 7, 31, 10, 34, 17, 7, 31, 31, - 38, 11, 15, 25, 30, 30, 27, 27, 27, 27, - 32, 33, 36, 43, 44, 42, 14, 42, 46, 47, - 50, 22, 53, 55, 42, 42, 56, 22, 57, 58, + 48, 13, 40, 34, 24, 24, 24, 45, 52, 54, + 18, 18, 18, 6, 17, 6, 31, 31, 31, 31, + 17, 17, 17, 17, 30, 26, 26, 38, 1, 5, + 34, 14, 40, 22, 22, 35, 38, 54, 27, 27, + 27, 27, 8, 16, 48, 13, 35, 24, 52, 45, + 45, 18, 9, 31, 10, 7, 17, 39, 31, 31, + 7, 38, 11, 39, 30, 30, 15, 25, 32, 33, + 36, 43, 44, 46, 47, 42, 14, 42, 50, 53, + 39, 22, 55, 56, 42, 42, 57, 22, 58, nil, nil, nil, nil, 31, 31, nil, 22, nil, nil, nil, nil, nil, 42, 31, 22, nil, 22, nil, nil, nil, - nil, nil, 22, nil, 42, nil, nil, 22, 22, 29, + nil, nil, 22, nil, nil, 42, nil, 22, 22, 29, 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, 22, 22, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 22, nil, nil, + nil, nil, nil, nil, 22, 22, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, - nil, 29, nil, nil, nil, nil, nil, nil, nil, nil, - nil, 29, nil, nil, nil, nil, 29 ] + nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, + nil, 29, nil, nil, nil, 29 ] racc_goto_pointer = [ - nil, 25, nil, nil, nil, -55, 47, 59, -38, -41, - 60, -18, nil, -35, -6, 59, -44, 6, 6, nil, - nil, nil, -74, nil, -49, 40, 5, 40, nil, -33, - -39, -10, -64, -35, -86, -144, -94, nil, -140, -183, - -159, nil, -92, -61, -60, -58, 31, -50, -69, nil, - 10, nil, -75, -63, -132, -117, -85, -113, -32 ] + nil, 38, nil, nil, nil, -52, 23, 62, -38, -29, + 60, -17, nil, -35, -6, 63, -44, 6, 6, nil, + nil, nil, -74, nil, -49, 44, 1, 12, nil, -33, + -39, -10, -66, -37, -111, -144, -96, nil, -140, -129, + -159, nil, -92, -63, -62, -58, 26, -55, -69, nil, + 8, nil, -75, -66, -136, -126, -88, -116, -33 ] racc_goto_default = [ nil, nil, 2, 8, 90, nil, nil, nil, nil, nil, @@ -939,7 +937,7 @@ def merge_locations(*locations) 22, 23, 104, 106, nil, nil, nil, nil, 114, 75, nil, 108, nil, nil, nil, nil, 165, 135, nil, nil, 179, 167, nil, 109, nil, nil, nil, nil, 81, 80, - 82, 92, nil, nil, nil, nil, nil, nil, nil ] + 82, 92, nil, nil, nil, 210, nil, nil, nil ] racc_reduce_table = [ 0, 0, :racc_error, @@ -1061,28 +1059,27 @@ def merge_locations(*locations) 1, 96, :_reduce_116, 1, 96, :_reduce_117, 1, 96, :_reduce_118, - 0, 113, :_reduce_none, + 1, 97, :_reduce_119, + 3, 97, :_reduce_120, 1, 113, :_reduce_none, - 2, 97, :_reduce_121, - 3, 97, :_reduce_122, - 6, 97, :_reduce_123, - 4, 97, :_reduce_124, - 0, 114, :_reduce_125, - 0, 115, :_reduce_126, - 5, 98, :_reduce_127, - 3, 95, :_reduce_128, - 0, 116, :_reduce_129, - 3, 63, :_reduce_130, + 2, 113, :_reduce_122, + 4, 113, :_reduce_123, + 0, 114, :_reduce_124, + 0, 115, :_reduce_125, + 5, 98, :_reduce_126, + 3, 95, :_reduce_127, + 0, 116, :_reduce_128, + 3, 63, :_reduce_129, 1, 73, :_reduce_none, 0, 74, :_reduce_none, 1, 74, :_reduce_none, 1, 74, :_reduce_none, 1, 74, :_reduce_none, - 1, 101, :_reduce_136 ] + 1, 101, :_reduce_135 ] -racc_reduce_n = 137 +racc_reduce_n = 136 -racc_shift_n = 236 +racc_shift_n = 232 racc_token_table = { false => 0, @@ -1279,7 +1276,7 @@ def merge_locations(*locations) "\"-many1@;\"", "rhs_list", "rhs", - "\"-option@parameterized_suffix\"", + "parameterized_arg", "@5", "@6", "@7" ] @@ -1896,7 +1893,7 @@ def _reduce_75(val, _values, result) def _reduce_76(val, _values, result) on_action_error("intermediate %prec in a rule", val[1]) if @trailing_prec_seen node = Grammar::Node::RuleRhs::InstantiateRule.new( - s_value: val[2], args: [val[1]], + s_value: val[2].s_value, args: [val[1]], location: val[1].loc ) result.append(node) @@ -2203,7 +2200,7 @@ def _reduce_111(val, _values, result) def _reduce_112(val, _values, result) on_action_error("intermediate %prec in a rule", val[1]) if @trailing_prec_seen node = Grammar::Node::RuleRhs::InstantiateRule.new( - s_value: val[2], args: [val[1]], + s_value: val[2].s_value, args: [val[1]], alias_name: val[3], lhs_tag: val[4], location: merge_locations(val[1].loc, val[4]&.loc) ) @@ -2260,64 +2257,65 @@ def _reduce_115(val, _values, result) module_eval(<<'.,.,', 'parser.y', 543) def _reduce_116(val, _values, result) - result = "option" + result = Lrama::Lexer::Token::Ident.new(s_value: "option", location: val[0].loc) result end .,., module_eval(<<'.,.,', 'parser.y', 544) def _reduce_117(val, _values, result) - result = "nonempty_list" + result = Lrama::Lexer::Token::Ident.new(s_value: "nonempty_list", location: val[0].loc) result end .,., module_eval(<<'.,.,', 'parser.y', 545) def _reduce_118(val, _values, result) - result = "list" + result = Lrama::Lexer::Token::Ident.new(s_value: "list", location: val[0].loc) result end .,., -# reduce 119 omitted - -# reduce 120 omitted - -module_eval(<<'.,.,', 'parser.y', 550) - def _reduce_121(val, _values, result) - result = if val[1] - [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[0])] - else - [val[0]] - end - +module_eval(<<'.,.,', 'parser.y', 548) + def _reduce_119(val, _values, result) + result = [val[0]] result end .,., -module_eval(<<'.,.,', 'parser.y', 556) - def _reduce_122(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 549) + def _reduce_120(val, _values, result) result = val[0].append(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.y', 557) - def _reduce_123(val, _values, result) - result = val[0].append(Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2].s_value, location: @lexer.location, args: val[4])) +# reduce 121 omitted + +module_eval(<<'.,.,', 'parser.y', 555) + def _reduce_122(val, _values, result) + result = Lrama::Lexer::Token::InstantiateRule.new( + s_value: val[1].s_value, args: [val[0]], + location: merge_locations(val[0].loc, val[1].loc) + ) + result end .,., -module_eval(<<'.,.,', 'parser.y', 558) - def _reduce_124(val, _values, result) - result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[0].s_value, location: @lexer.location, args: val[2])] +module_eval(<<'.,.,', 'parser.y', 562) + def _reduce_123(val, _values, result) + result = Lrama::Lexer::Token::InstantiateRule.new( + s_value: val[0].s_value, args: val[2], + location: merge_locations(val[0].loc, val[3].loc) + ) + result end .,., -module_eval(<<'.,.,', 'parser.y', 563) - def _reduce_125(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 571) + def _reduce_124(val, _values, result) if prec_seen? on_action_error("multiple User_code after %prec", val[0]) if @code_after_prec @code_after_prec = true @@ -2328,39 +2326,39 @@ def _reduce_125(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 571) - def _reduce_126(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 579) + def _reduce_125(val, _values, result) end_c_declaration result end .,., -module_eval(<<'.,.,', 'parser.y', 575) - def _reduce_127(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 583) + def _reduce_126(val, _values, result) result = val[2] result end .,., -module_eval(<<'.,.,', 'parser.y', 578) - def _reduce_128(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 586) + def _reduce_127(val, _values, result) result = val[1].s_value result end .,., -module_eval(<<'.,.,', 'parser.y', 583) - def _reduce_129(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 591) + def _reduce_128(val, _values, result) begin_c_declaration('\Z') result end .,., -module_eval(<<'.,.,', 'parser.y', 587) - def _reduce_130(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 595) + def _reduce_129(val, _values, result) end_c_declaration result = Grammar::Node::EpilogueDecl.new(code: val[2], location: merge_locations(val[0].loc, val[2].loc)) @@ -2368,6 +2366,8 @@ def _reduce_130(val, _values, result) end .,., +# reduce 130 omitted + # reduce 131 omitted # reduce 132 omitted @@ -2376,10 +2376,8 @@ def _reduce_130(val, _values, result) # reduce 134 omitted -# reduce 135 omitted - -module_eval(<<'.,.,', 'parser.y', 598) - def _reduce_136(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 606) + def _reduce_135(val, _values, result) result = Lrama::Lexer::Token::Ident.new(s_value: val[0].s_value, location: val[0].location) result end diff --git a/parser.y b/parser.y index ed39c106..528bc44e 100644 --- a/parser.y +++ b/parser.y @@ -320,7 +320,7 @@ rule { on_action_error("intermediate %prec in a rule", val[1]) if @trailing_prec_seen node = Grammar::Node::RuleRhs::InstantiateRule.new( - s_value: val[2], args: [val[1]], + s_value: val[2].s_value, args: [val[1]], location: val[1].loc ) result.append(node) @@ -500,7 +500,7 @@ rule { on_action_error("intermediate %prec in a rule", val[1]) if @trailing_prec_seen node = Grammar::Node::RuleRhs::InstantiateRule.new( - s_value: val[2], args: [val[1]], + s_value: val[2].s_value, args: [val[1]], alias_name: val[3], lhs_tag: val[4], location: merge_locations(val[1].loc, val[4]&.loc) ) @@ -541,22 +541,30 @@ rule } parameterized_suffix: - "?" { result = "option" } - | "+" { result = "nonempty_list" } - | "*" { result = "list" } + "?" { result = Lrama::Lexer::Token::Ident.new(s_value: "option", location: val[0].loc) } + | "+" { result = Lrama::Lexer::Token::Ident.new(s_value: "nonempty_list", location: val[0].loc) } + | "*" { result = Lrama::Lexer::Token::Ident.new(s_value: "list", location: val[0].loc) } parameterized_args: - symbol parameterized_suffix? + parameterized_arg { result = [val[0]] } + | parameterized_args ',' parameterized_arg { result = val[0].append(val[2]) } + + parameterized_arg: + symbol + | symbol parameterized_suffix { - result = if val[1] - [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[0])] - else - [val[0]] - end + result = Lrama::Lexer::Token::InstantiateRule.new( + s_value: val[1].s_value, args: [val[0]], + location: merge_locations(val[0].loc, val[1].loc) + ) + } + | IDENTIFIER "(" parameterized_args ")" + { + result = Lrama::Lexer::Token::InstantiateRule.new( + s_value: val[0].s_value, args: val[2], + location: merge_locations(val[0].loc, val[3].loc) + ) } - | parameterized_args ',' symbol { result = val[0].append(val[2]) } - | parameterized_args ',' IDENTIFIER "(" parameterized_args ")" { result = val[0].append(Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2].s_value, location: @lexer.location, args: val[4])) } - | IDENTIFIER "(" parameterized_args ")" { result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[0].s_value, location: @lexer.location, args: val[2])] } action: "{" diff --git a/spec/lrama/parser_spec.rb b/spec/lrama/parser_spec.rb index 6884ab17..649efefb 100644 --- a/spec/lrama/parser_spec.rb +++ b/spec/lrama/parser_spec.rb @@ -945,6 +945,84 @@ end let(:y) { File.read(fixture_path(path)) } + context "when parameterized arguments have suffixes" do + let(:path) { "parameterized_args.y" } + + { "?" => "option", "+" => "nonempty_list", "*" => "list" }.each do |suffix, name| + context "with #{suffix}" do + let(:y) do + <<~GRAMMAR + %token A B + %rule triple(X, Y, Z): X Y Z; + %rule wrapped(X): triple(X#{suffix}, B#{suffix}, 'c'#{suffix}); + %% + program: triple(A#{suffix}, B#{suffix}, 'c'#{suffix}) wrapped(A); + GRAMMAR + end + + it "expands suffixes in every argument position and in rule definitions" do + triple = "triple_#{name}_A_#{name}_B_#{name}_'c'" + expect(grammar.rules.map { |rule| [rule.lhs.id.s_value, rule.rhs.map { |sym| sym.id.s_value }] }).to include( + [triple, ["#{name}_A", "#{name}_B", "#{name}_'c'"]], + ["wrapped_A", [triple]], + ["program", [triple, "wrapped_A"]] + ) + end + + it "preserves each suffixed argument's source range" do + args = grammar.nodes.last.rhs.first.args + expect(args.map { |arg| [arg.first_line, arg.first_column, arg.last_line, arg.last_column] }).to eq([ + [5, 16, 5, 18], + [5, 20, 5, 22], + [5, 24, 5, 28], + ]) + end + end + end + + context "with a nested optional argument" do + let(:y) { "%token A\n%%\nprogram: list(A?);\n" } + + it "expands list(A?) as list(option(A))" do + expect(grammar.rules.map { |rule| [rule.lhs.id.s_value, rule.rhs.map { |sym| sym.id.s_value }] }).to eq([ + ["$accept", ["program", "YYEOF"]], + ["list_option_A", []], + ["option_A", []], + ["option_A", ["A"]], + ["list_option_A", ["list_option_A", "option_A"]], + ["program", ["list_option_A"]], + ]) + end + end + end + + context "when parameterized arguments contain nested calls" do + let(:path) { "parameterized_args.y" } + let(:y) do + <<~GRAMMAR + %token A B + %rule triple(X, Y, Z): X Y Z; + %% + program: triple( + option(A), + list( + B + ), + option('c') + ); + GRAMMAR + end + + it "preserves each nested call's source range" do + args = grammar.nodes.last.rhs.first.args + expect(args.map { |arg| [arg.first_line, arg.first_column, arg.last_line, arg.last_column] }).to eq([ + [5, 2, 5, 11], + [6, 2, 8, 3], + [9, 2, 9, 13], + ]) + end + end + context "when stdlib" do context "when option" do let(:path) { "parameterized/stdlib/option.y" }