diff --git a/lib/lrama/grammar.rb b/lib/lrama/grammar.rb index 95a80bb0..53831d46 100644 --- a/lib/lrama/grammar.rb +++ b/lib/lrama/grammar.rb @@ -162,9 +162,9 @@ def add_error_token(ident_or_tags:, token_code:, lineno:) @error_tokens << ErrorToken.new(ident_or_tags: ident_or_tags, token_code: token_code, lineno: lineno) end - # @rbs (id: Lexer::Token::Base, tag: Lexer::Token::Tag) -> Array[Type] - def add_type(id:, tag:) - @types << Type.new(id: id, tag: tag) + # @rbs (id: Lexer::Token::Base, tag: Lexer::Token::Tag?, ?alias_name: String?) -> Array[Type] + def add_type(id:, tag:, alias_name: nil) + @types << Type.new(id: id, tag: tag, alias_name: alias_name) end # @rbs (Grammar::Symbol sym, Integer precedence, String s_value, Integer lineno) -> Precedence diff --git a/lib/lrama/grammar/symbols/resolver.rb b/lib/lrama/grammar/symbols/resolver.rb index 085a835d..55d02c16 100644 --- a/lib/lrama/grammar/symbols/resolver.rb +++ b/lib/lrama/grammar/symbols/resolver.rb @@ -146,6 +146,7 @@ def fill_nterm_type(types) types.each do |type| nterm = find_nterm_by_id!(type.id) nterm.tag = type.tag + nterm.alias_name = type.alias_name if type.alias_name end end diff --git a/lib/lrama/grammar/type.rb b/lib/lrama/grammar/type.rb index c6317694..17c57316 100644 --- a/lib/lrama/grammar/type.rb +++ b/lib/lrama/grammar/type.rb @@ -10,22 +10,26 @@ class Type # # @rbs! # @id: Lexer::Token::Base - # @tag: Lexer::Token::Tag + # @tag: Lexer::Token::Tag? + # @alias_name: String? attr_reader :id #: Lexer::Token::Base - attr_reader :tag #: Lexer::Token::Tag + attr_reader :tag #: Lexer::Token::Tag? + attr_reader :alias_name #: String? - # @rbs (id: Lexer::Token::Base, tag: Lexer::Token::Tag) -> void - def initialize(id:, tag:) + # @rbs (id: Lexer::Token::Base, tag: Lexer::Token::Tag?, ?alias_name: String?) -> void + def initialize(id:, tag:, alias_name: nil) @id = id @tag = tag + @alias_name = alias_name end # @rbs (Grammar::Type other) -> bool def ==(other) self.class == other.class && self.id == other.id && - self.tag == other.tag + self.tag == other.tag && + self.alias_name == other.alias_name end end end diff --git a/lib/lrama/parser.rb b/lib/lrama/parser.rb index 20c3ad34..5e19adf2 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', 504) +module_eval(<<'...end parser.y/module_eval...', 'parser.y', 526) include Lrama::Tracer::Duration @@ -745,13 +745,13 @@ def raise_parse_error(error_message, location) ##### State transition tables begin ### racc_action_table = [ - 98, 98, 99, 99, 87, 53, 53, 52, 178, 110, - 110, 97, 53, 53, 184, 178, 110, 110, 53, 181, - 184, 162, 110, 6, 163, 181, 181, 53, 53, 52, - 52, 181, 79, 79, 53, 53, 52, 52, 43, 79, - 79, 53, 4, 52, 5, 110, 88, 94, 182, 125, - 126, 163, 100, 100, 180, 193, 194, 195, 137, 185, - 188, 180, 4, 44, 5, 185, 188, 94, 24, 25, + 99, 99, 100, 100, 88, 53, 53, 52, 186, 111, + 111, 98, 53, 53, 192, 186, 111, 111, 53, 189, + 192, 170, 111, 6, 171, 189, 189, 53, 53, 52, + 52, 189, 80, 80, 53, 53, 52, 52, 43, 80, + 80, 53, 4, 52, 5, 111, 89, 95, 190, 130, + 131, 171, 101, 101, 188, 201, 202, 203, 142, 193, + 196, 188, 4, 44, 5, 193, 196, 95, 24, 25, 26, 27, 28, 29, 30, 31, 32, 46, 33, 34, 35, 36, 37, 38, 39, 40, 41, 47, 24, 25, 26, 27, 28, 29, 30, 31, 32, 47, 33, 34, @@ -762,32 +762,33 @@ def raise_parse_error(error_message, location) 60, 14, 15, 16, 17, 18, 19, 20, 24, 25, 26, 27, 28, 29, 30, 31, 32, 57, 33, 34, 35, 36, 37, 38, 39, 40, 41, 53, 53, 52, - 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, 52, 110, 110, 53, - 53, 209, 52, 110, 193, 194, 195, 137, 216, 222, - 229, 217, 217, 217, 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, 211, 166, 137, 72, - 176, 218, 176, 72, 72, 227, 137, 72 ] + 52, 111, 106, 53, 53, 52, 52, 111, 106, 53, + 53, 52, 52, 111, 106, 53, 53, 52, 52, 111, + 106, 53, 53, 52, 52, 111, 111, 53, 53, 52, + 217, 111, 111, 53, 53, 217, 52, 111, 111, 53, + 53, 217, 52, 111, 201, 202, 203, 142, 224, 230, + 237, 225, 225, 225, 53, 53, 52, 52, 53, 53, + 52, 52, 53, 57, 52, 201, 202, 203, 57, 57, + 57, 66, 67, 68, 69, 70, 72, 72, 72, 87, + 90, 47, 57, 57, 114, 118, 121, 80, 128, 129, + 136, 47, 138, 142, 144, 148, 154, 157, 158, 159, + 160, 138, 163, 164, 165, 111, 174, 157, 177, 180, + 181, 72, 183, 184, 191, 197, 174, 204, 142, 208, + 210, 142, 174, 219, 174, 142, 72, 184, 226, 184, + 72, 72, 235, 142, 72 ] racc_action_check = [ - 51, 97, 51, 97, 41, 75, 165, 75, 165, 75, - 165, 51, 171, 190, 171, 190, 171, 190, 201, 165, - 201, 148, 201, 1, 148, 171, 190, 36, 37, 36, - 37, 201, 36, 37, 38, 39, 38, 39, 5, 38, - 39, 117, 0, 117, 0, 117, 41, 46, 168, 88, - 88, 168, 51, 97, 165, 177, 177, 177, 177, 171, - 171, 190, 2, 6, 2, 201, 201, 90, 46, 46, + 51, 98, 51, 98, 41, 75, 173, 75, 173, 75, + 173, 51, 179, 198, 179, 198, 179, 198, 209, 173, + 209, 156, 209, 1, 156, 179, 198, 36, 37, 36, + 37, 209, 36, 37, 38, 39, 38, 39, 5, 38, + 39, 118, 0, 118, 0, 118, 41, 46, 176, 89, + 89, 176, 51, 98, 173, 185, 185, 185, 185, 179, + 179, 198, 2, 6, 2, 209, 209, 91, 46, 46, 46, 46, 46, 46, 46, 46, 46, 9, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 10, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 11, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 3, 3, 12, + 46, 46, 46, 46, 46, 46, 46, 10, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 11, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 3, 3, 12, 14, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 15, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 16, @@ -795,130 +796,135 @@ def raise_parse_error(error_message, location) 8, 8, 8, 8, 8, 8, 8, 18, 8, 8, 8, 8, 8, 8, 8, 8, 8, 63, 13, 63, 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, - 113, 218, 113, 218, 186, 186, 186, 186, 208, 213, - 226, 208, 213, 226, 114, 123, 114, 123, 210, 210, - 210, 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, 212, 214, 216, 221, 222, 228 ] + 77, 65, 77, 65, 65, 107, 79, 107, 79, 107, + 107, 119, 188, 119, 188, 119, 188, 196, 204, 196, + 204, 196, 204, 210, 225, 210, 225, 210, 225, 226, + 80, 226, 80, 226, 194, 194, 194, 194, 216, 221, + 234, 216, 221, 234, 114, 115, 114, 115, 121, 122, + 121, 122, 128, 24, 128, 218, 218, 218, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 40, + 42, 47, 55, 60, 71, 74, 76, 81, 82, 88, + 92, 93, 94, 95, 103, 117, 124, 129, 130, 131, + 132, 138, 141, 142, 143, 149, 158, 159, 161, 164, + 166, 170, 171, 172, 178, 182, 184, 186, 187, 190, + 192, 195, 197, 207, 208, 212, 213, 215, 217, 220, + 222, 224, 229, 230, 236 ] 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, 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, - 176, nil, 243, 174, 285, nil, 286, 201, 206, nil, - nil, 278, 241, nil, nil, nil, 175, nil, 289, nil, - nil ] + nil, nil, nil, nil, 217, 222, 223, 224, 236, 237, + 238, 239, 240, 238, 239, 240, 24, 25, 31, 32, + 244, -1, 248, nil, nil, nil, 43, 238, nil, nil, + nil, -5, nil, nil, nil, 236, nil, nil, nil, nil, + 237, nil, nil, 164, 170, 176, nil, nil, nil, nil, + nil, 246, nil, 171, 247, 2, 248, 177, nil, 183, + 207, 249, 250, nil, nil, nil, nil, nil, 215, 45, + nil, 63, 251, 248, 249, 208, nil, nil, -4, nil, + nil, nil, nil, 262, nil, nil, nil, 182, nil, nil, + nil, nil, nil, nil, 221, 222, nil, 259, 38, 188, + nil, 225, 226, nil, 259, nil, nil, nil, 229, 262, + 222, 225, 259, nil, nil, nil, nil, nil, 258, nil, + nil, 226, 268, 257, nil, nil, nil, nil, nil, 268, + nil, nil, nil, nil, nil, nil, -24, nil, 226, 272, + nil, 276, nil, nil, 223, nil, 263, nil, nil, nil, + 273, 277, 234, 3, nil, nil, 3, nil, 235, 9, + nil, nil, 239, nil, 236, 3, 243, 233, 189, nil, + 243, nil, 246, nil, 162, 236, 194, 242, 10, nil, + nil, nil, nil, nil, 195, nil, nil, 291, 244, 15, + 200, nil, 240, 288, nil, 248, 173, 254, 183, nil, + 250, 174, 292, nil, 293, 201, 206, nil, nil, 285, + 248, nil, nil, nil, 175, nil, 296, nil, nil ] racc_action_default = [ - -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, 231, -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, -125, -65, -136, -54, -114, -54, -136, -136, -120, - -121, -136, -72, -112, -77, -122, -136, -126, -54, -123, - -113 ] + -1, -142, -1, -3, -10, -142, -142, -2, -3, -142, + -14, -14, -142, -142, -142, -142, -142, -142, -142, -28, + -29, -34, -35, -36, -142, -142, -142, -142, -142, -142, + -142, -142, -142, -54, -54, -54, -142, -142, -142, -142, + -142, -142, -142, -13, 239, -4, -142, -14, -16, -17, + -20, -137, -106, -107, -136, -18, -23, -95, -24, -25, + -142, -27, -37, -142, -142, -142, -41, -42, -43, -44, + -45, -46, -55, -142, -47, -142, -48, -142, -49, -98, + -142, -101, -103, -104, -50, -51, -52, -53, -142, -142, + -11, -5, -7, -14, -142, -72, -15, -21, -137, -138, + -139, -140, -19, -142, -26, -30, -31, -32, -38, -93, + -94, -141, -39, -40, -142, -56, -58, -60, -142, -83, + -85, -142, -87, -89, -91, -99, -100, -102, -142, -142, + -142, -142, -142, -6, -8, -9, -134, -110, -108, -111, + -73, -142, -142, -142, -96, -33, -59, -57, -61, -80, + -86, -84, -90, -88, -92, -105, -142, -66, -70, -142, + -12, -142, -109, -115, -142, -22, -142, -62, -81, -82, + -54, -142, -64, -68, -71, -74, -142, -135, -112, -113, + -133, -97, -142, -67, -70, -72, -106, -72, -142, -130, + -142, -115, -106, -116, -72, -72, -142, -70, -69, -75, + -76, -122, -123, -124, -142, -78, -79, -142, -70, -114, + -142, -117, -72, -54, -121, -63, -142, -106, -125, -131, + -65, -142, -54, -120, -54, -142, -142, -126, -127, -142, + -72, -118, -77, -128, -142, -132, -54, -129, -119 ] racc_goto_table = [ - 73, 118, 136, 54, 48, 49, 164, 96, 91, 120, - 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, 212, 140, 154, 145, - 146, 101, 130, 116, 42, 127, 103, 208, 78, 78, - 219, 9, 51, 213, 141, 142, 45, 71, 159, 144, - 190, 160, 161, 102, 158, 191, 132, 197, 122, 226, - 170, 177, 220, 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, nil, nil, nil, 186, 210, 174, - 228, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, 225, 210, nil, nil, nil, nil, nil, + 73, 75, 77, 172, 119, 141, 48, 49, 125, 126, + 92, 54, 97, 94, 156, 195, 123, 1, 108, 112, + 113, 120, 139, 179, 134, 135, 116, 216, 56, 58, + 59, 42, 61, 221, 79, 79, 79, 79, 62, 63, + 64, 65, 215, 96, 176, 195, 132, 119, 119, 234, + 3, 209, 7, 220, 200, 133, 51, 155, 94, 143, + 152, 153, 145, 212, 150, 151, 162, 146, 147, 102, + 71, 117, 74, 76, 104, 124, 9, 79, 79, 167, + 149, 45, 78, 84, 85, 86, 198, 227, 168, 137, + 169, 103, 166, 127, 178, 199, 228, 205, 207, 229, + 161, nil, 185, nil, 211, 213, nil, nil, 194, nil, + nil, nil, 117, 117, nil, nil, nil, 206, nil, 124, + 124, nil, 222, nil, nil, 214, 79, 185, nil, nil, + nil, nil, nil, 218, nil, nil, nil, 182, 194, 218, + 236, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 233, 218, 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, 215, nil, nil, nil, nil, nil, nil, nil, - nil, 223, nil, 224, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, 230 ] + 223, nil, nil, nil, nil, nil, nil, nil, nil, 231, + nil, 232, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 238 ] racc_goto_check = [ - 29, 22, 42, 31, 14, 14, 35, 16, 8, 48, - 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, 11, 17, 39, 31, 31, - 38, 7, 15, 39, 30, 30, 7, 25, 32, 33, - 36, 43, 44, 46, 47, 42, 14, 42, 50, 39, - 53, 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, nil, nil, nil, 22, 22, 29, - 42, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, 22, 22, nil, nil, nil, nil, nil, + 30, 30, 30, 36, 22, 43, 14, 14, 51, 51, + 8, 32, 16, 13, 35, 41, 48, 1, 24, 24, + 24, 46, 55, 57, 5, 9, 31, 40, 18, 18, + 18, 10, 17, 40, 32, 32, 32, 32, 17, 17, + 17, 17, 36, 14, 35, 41, 11, 22, 22, 40, + 6, 57, 6, 36, 39, 8, 15, 51, 13, 16, + 48, 48, 24, 39, 46, 46, 55, 31, 31, 18, + 25, 32, 26, 27, 17, 32, 7, 32, 32, 33, + 34, 7, 28, 28, 28, 28, 37, 39, 44, 14, + 45, 49, 50, 53, 56, 43, 58, 43, 59, 60, + 61, nil, 22, nil, 43, 43, nil, nil, 22, nil, + nil, nil, 32, 32, nil, nil, nil, 22, nil, 32, + 32, nil, 43, nil, nil, 22, 32, 22, nil, nil, + nil, nil, nil, 22, nil, nil, nil, 30, 22, 22, + 43, nil, 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, 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, 29, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, 29 ] + 30, nil, nil, nil, nil, nil, nil, nil, nil, 30, + nil, 30, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 30 ] racc_goto_pointer = [ - nil, 38, nil, nil, nil, -52, 23, 68, -38, -29, - 60, -24, nil, -35, -6, 59, -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, -65, -136, -118, -88, -115, -33 ] + nil, 17, nil, nil, nil, -68, 50, 73, -36, -67, + 27, -44, nil, -33, -4, 43, -39, 14, 14, nil, + nil, nil, -71, nil, -45, 37, 38, 38, 46, nil, + -33, -47, -2, -70, -37, -115, -155, -98, nil, -131, + -177, -164, nil, -90, -61, -59, -54, nil, -61, 34, + -52, -71, nil, 12, nil, -72, -69, -140, -122, -91, + -120, -36 ] racc_goto_default = [ - nil, nil, 2, 8, 90, nil, nil, nil, nil, nil, + nil, nil, 2, 8, 91, nil, nil, nil, nil, nil, nil, nil, 10, 11, nil, nil, nil, 55, nil, 21, - 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 ] + 22, 23, 105, 107, nil, nil, nil, nil, nil, 115, + nil, nil, 109, nil, nil, nil, nil, 173, 140, nil, + nil, 187, 175, nil, 110, nil, nil, 122, nil, nil, + nil, 82, 81, 83, 93, nil, nil, nil, nil, nil, + nil, nil ] racc_reduce_table = [ 0, 0, :racc_error, @@ -975,92 +981,98 @@ def raise_parse_error(error_message, location) 2, 77, :_reduce_51, 2, 77, :_reduce_52, 2, 77, :_reduce_53, - 0, 87, :_reduce_none, - 1, 87, :_reduce_none, - 1, 88, :_reduce_56, - 2, 88, :_reduce_57, + 0, 88, :_reduce_none, + 1, 88, :_reduce_none, + 1, 89, :_reduce_56, + 2, 89, :_reduce_57, 2, 83, :_reduce_58, 3, 83, :_reduce_59, - 0, 91, :_reduce_none, - 1, 91, :_reduce_none, - 3, 86, :_reduce_62, + 0, 92, :_reduce_none, + 1, 92, :_reduce_none, + 3, 87, :_reduce_62, 8, 78, :_reduce_63, 5, 79, :_reduce_64, 8, 79, :_reduce_65, - 1, 92, :_reduce_66, - 3, 92, :_reduce_67, - 1, 93, :_reduce_68, - 3, 93, :_reduce_69, - 0, 99, :_reduce_none, - 1, 99, :_reduce_none, + 1, 93, :_reduce_66, + 3, 93, :_reduce_67, + 1, 94, :_reduce_68, + 3, 94, :_reduce_69, 0, 100, :_reduce_none, 1, 100, :_reduce_none, - 1, 94, :_reduce_74, - 3, 94, :_reduce_75, - 3, 94, :_reduce_76, - 6, 94, :_reduce_77, - 3, 94, :_reduce_78, - 3, 94, :_reduce_79, - 0, 102, :_reduce_none, - 1, 102, :_reduce_none, - 1, 90, :_reduce_82, - 1, 103, :_reduce_83, - 2, 103, :_reduce_84, + 0, 101, :_reduce_none, + 1, 101, :_reduce_none, + 1, 95, :_reduce_74, + 3, 95, :_reduce_75, + 3, 95, :_reduce_76, + 6, 95, :_reduce_77, + 3, 95, :_reduce_78, + 3, 95, :_reduce_79, + 0, 103, :_reduce_none, + 1, 103, :_reduce_none, + 1, 91, :_reduce_82, + 1, 104, :_reduce_83, + 2, 104, :_reduce_84, 2, 84, :_reduce_85, 3, 84, :_reduce_86, + 1, 106, :_reduce_87, + 2, 106, :_reduce_88, + 2, 85, :_reduce_89, + 3, 85, :_reduce_90, + 1, 105, :_reduce_91, + 2, 105, :_reduce_92, 1, 80, :_reduce_none, 1, 80, :_reduce_none, - 0, 104, :_reduce_89, - 0, 105, :_reduce_90, - 5, 75, :_reduce_91, - 1, 106, :_reduce_92, - 2, 106, :_reduce_93, - 2, 107, :_reduce_94, - 1, 108, :_reduce_95, - 2, 108, :_reduce_96, - 1, 85, :_reduce_97, - 1, 85, :_reduce_98, - 3, 85, :_reduce_99, - 1, 89, :_reduce_none, - 1, 89, :_reduce_none, - 1, 110, :_reduce_102, - 2, 110, :_reduce_103, + 0, 107, :_reduce_95, + 0, 108, :_reduce_96, + 5, 75, :_reduce_97, + 1, 109, :_reduce_98, + 2, 109, :_reduce_99, + 2, 110, :_reduce_100, + 1, 111, :_reduce_101, + 2, 111, :_reduce_102, + 1, 86, :_reduce_103, + 1, 86, :_reduce_104, + 3, 86, :_reduce_105, + 1, 90, :_reduce_none, + 1, 90, :_reduce_none, + 1, 113, :_reduce_108, + 2, 113, :_reduce_109, 2, 62, :_reduce_none, 2, 62, :_reduce_none, - 4, 109, :_reduce_106, - 1, 111, :_reduce_107, - 3, 111, :_reduce_108, - 0, 112, :_reduce_109, - 2, 112, :_reduce_110, - 3, 112, :_reduce_111, - 5, 112, :_reduce_112, - 7, 112, :_reduce_113, - 4, 112, :_reduce_114, - 3, 112, :_reduce_115, - 1, 96, :_reduce_116, - 1, 96, :_reduce_117, - 1, 96, :_reduce_118, - 0, 113, :_reduce_none, - 1, 113, :_reduce_none, - 2, 97, :_reduce_121, - 3, 97, :_reduce_122, - 4, 97, :_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, + 4, 112, :_reduce_112, + 1, 114, :_reduce_113, + 3, 114, :_reduce_114, + 0, 115, :_reduce_115, + 2, 115, :_reduce_116, + 3, 115, :_reduce_117, + 5, 115, :_reduce_118, + 7, 115, :_reduce_119, + 4, 115, :_reduce_120, + 3, 115, :_reduce_121, + 1, 97, :_reduce_122, + 1, 97, :_reduce_123, + 1, 97, :_reduce_124, + 0, 116, :_reduce_none, + 1, 116, :_reduce_none, + 2, 98, :_reduce_127, + 3, 98, :_reduce_128, + 4, 98, :_reduce_129, + 0, 117, :_reduce_130, + 0, 118, :_reduce_131, + 5, 99, :_reduce_132, + 3, 96, :_reduce_133, + 0, 119, :_reduce_134, + 3, 63, :_reduce_135, 1, 73, :_reduce_none, 0, 74, :_reduce_none, 1, 74, :_reduce_none, 1, 74, :_reduce_none, 1, 74, :_reduce_none, - 1, 101, :_reduce_135 ] + 1, 102, :_reduce_141 ] -racc_reduce_n = 136 +racc_reduce_n = 142 -racc_shift_n = 231 +racc_shift_n = 239 racc_token_table = { false => 0, @@ -1229,6 +1241,7 @@ def raise_parse_error(error_message, location) "\"-many1@-group@symbol|TAG\"", "token_declarations", "symbol_declarations", + "nterm_declarations", "token_declarations_for_precedence", "token_declaration", "\"-option@TAG\"", @@ -1248,6 +1261,8 @@ def raise_parse_error(error_message, location) "string_as_id", "\"-option@string_as_id\"", "\"-many1@symbol\"", + "nterm_declaration", + "\"-many1@nterm_declaration\"", "@3", "@4", "\"-many1@id\"", @@ -1598,11 +1613,13 @@ def _reduce_47(val, _values, result) module_eval(<<'.,.,', 'parser.y', 144) def _reduce_48(val, _values, result) val[1].each {|hash| - hash[:tokens].each {|id| + hash[:tokens].each {|token_info| + id = token_info[:id] + alias_name = token_info[:alias_name] if @grammar.find_term_by_s_value(id.s_value) on_action_error("symbol #{id.s_value} redeclared as a nonterminal", id) else - @grammar.add_type(id: id, tag: hash[:tag]) + @grammar.add_type(id: id, tag: hash[:tag], alias_name: alias_name) end } } @@ -1611,7 +1628,7 @@ def _reduce_48(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 156) +module_eval(<<'.,.,', 'parser.y', 158) def _reduce_49(val, _values, result) val[1].each {|hash| hash[:tokens].each {|id| @@ -1625,7 +1642,7 @@ def _reduce_49(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 166) +module_eval(<<'.,.,', 'parser.y', 168) def _reduce_50(val, _values, result) val[1].each {|hash| hash[:tokens].each {|id| @@ -1639,7 +1656,7 @@ def _reduce_50(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 176) +module_eval(<<'.,.,', 'parser.y', 178) def _reduce_51(val, _values, result) val[1].each {|hash| hash[:tokens].each {|id| @@ -1653,7 +1670,7 @@ def _reduce_51(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 186) +module_eval(<<'.,.,', 'parser.y', 188) def _reduce_52(val, _values, result) val[1].each {|hash| hash[:tokens].each {|id| @@ -1667,7 +1684,7 @@ def _reduce_52(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 196) +module_eval(<<'.,.,', 'parser.y', 198) def _reduce_53(val, _values, result) @grammar.set_start_nterm(val[1]) @@ -1679,21 +1696,21 @@ def _reduce_53(val, _values, result) # reduce 55 omitted -module_eval(<<'.,.,', 'parser.y', 214) +module_eval(<<'.,.,', 'parser.y', 216) def _reduce_56(val, _values, result) result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 214) +module_eval(<<'.,.,', 'parser.y', 216) def _reduce_57(val, _values, result) result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 202) +module_eval(<<'.,.,', 'parser.y', 204) def _reduce_58(val, _values, result) val[1].each {|token_declaration| @grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1]&.s_value, tag: val[0], replace: true) @@ -1703,7 +1720,7 @@ def _reduce_58(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 208) +module_eval(<<'.,.,', 'parser.y', 210) def _reduce_59(val, _values, result) val[2].each {|token_declaration| @grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1]&.s_value, tag: val[1], replace: true) @@ -1717,14 +1734,14 @@ def _reduce_59(val, _values, result) # reduce 61 omitted -module_eval(<<'.,.,', 'parser.y', 213) +module_eval(<<'.,.,', 'parser.y', 215) def _reduce_62(val, _values, result) result = val result end .,., -module_eval(<<'.,.,', 'parser.y', 218) +module_eval(<<'.,.,', 'parser.y', 220) def _reduce_63(val, _values, result) rule = Grammar::Parameterized::Rule.new(val[1].s_value, val[3], val[7], tag: val[5]) @grammar.add_parameterized_rule(rule) @@ -1733,7 +1750,7 @@ def _reduce_63(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 225) +module_eval(<<'.,.,', 'parser.y', 227) def _reduce_64(val, _values, result) rule = Grammar::Parameterized::Rule.new(val[2].s_value, [], val[4], is_inline: true) @grammar.add_parameterized_rule(rule) @@ -1742,7 +1759,7 @@ def _reduce_64(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 230) +module_eval(<<'.,.,', 'parser.y', 232) def _reduce_65(val, _values, result) rule = Grammar::Parameterized::Rule.new(val[2].s_value, val[4], val[7], is_inline: true) @grammar.add_parameterized_rule(rule) @@ -1751,21 +1768,21 @@ def _reduce_65(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 235) +module_eval(<<'.,.,', 'parser.y', 237) def _reduce_66(val, _values, result) result = [val[0]] result end .,., -module_eval(<<'.,.,', 'parser.y', 236) +module_eval(<<'.,.,', 'parser.y', 238) def _reduce_67(val, _values, result) result = val[0].append(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.y', 241) +module_eval(<<'.,.,', 'parser.y', 243) def _reduce_68(val, _values, result) builder = val[0] result = [builder] @@ -1774,7 +1791,7 @@ def _reduce_68(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 246) +module_eval(<<'.,.,', 'parser.y', 248) def _reduce_69(val, _values, result) builder = val[2] result = val[0].append(builder) @@ -1791,7 +1808,7 @@ def _reduce_69(val, _values, result) # reduce 73 omitted -module_eval(<<'.,.,', 'parser.y', 253) +module_eval(<<'.,.,', 'parser.y', 255) def _reduce_74(val, _values, result) reset_precs result = Grammar::Parameterized::Rhs.new @@ -1800,7 +1817,7 @@ def _reduce_74(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 258) +module_eval(<<'.,.,', 'parser.y', 260) def _reduce_75(val, _values, result) on_action_error("intermediate %prec in a rule", val[1]) if @trailing_prec_seen token = val[1] @@ -1813,7 +1830,7 @@ def _reduce_75(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 267) +module_eval(<<'.,.,', 'parser.y', 269) def _reduce_76(val, _values, result) on_action_error("intermediate %prec in a rule", val[1]) if @trailing_prec_seen builder = val[0] @@ -1824,7 +1841,7 @@ def _reduce_76(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 274) +module_eval(<<'.,.,', 'parser.y', 276) def _reduce_77(val, _values, result) on_action_error("intermediate %prec in a rule", val[1]) if @trailing_prec_seen builder = val[0] @@ -1835,7 +1852,7 @@ def _reduce_77(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 281) +module_eval(<<'.,.,', 'parser.y', 283) def _reduce_78(val, _values, result) user_code = val[1] user_code.alias_name = val[2] @@ -1847,7 +1864,7 @@ def _reduce_78(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 289) +module_eval(<<'.,.,', 'parser.y', 291) def _reduce_79(val, _values, result) on_action_error("multiple %prec in a rule", val[0]) if prec_seen? sym = @grammar.find_symbol_by_id!(val[2]) @@ -1868,28 +1885,28 @@ def _reduce_79(val, _values, result) # reduce 81 omitted -module_eval(<<'.,.,', 'parser.y', 301) +module_eval(<<'.,.,', 'parser.y', 303) def _reduce_82(val, _values, result) result = val[0].s_value if val[0] result end .,., -module_eval(<<'.,.,', 'parser.y', 315) +module_eval(<<'.,.,', 'parser.y', 317) def _reduce_83(val, _values, result) result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 315) +module_eval(<<'.,.,', 'parser.y', 317) def _reduce_84(val, _values, result) result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 306) +module_eval(<<'.,.,', 'parser.y', 308) def _reduce_85(val, _values, result) result = if val[0] [{tag: val[0], tokens: val[1]}] @@ -1901,28 +1918,38 @@ def _reduce_85(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 312) +module_eval(<<'.,.,', 'parser.y', 314) def _reduce_86(val, _values, result) result = val[0].append({tag: val[1], tokens: val[2]}) result end .,., -# reduce 87 omitted +module_eval(<<'.,.,', 'parser.y', 327) + def _reduce_87(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val + result + end +.,., -# reduce 88 omitted +module_eval(<<'.,.,', 'parser.y', 327) + def _reduce_88(val, _values, result) + result = val[1] ? val[1].unshift(val[0]) : val + result + end +.,., -module_eval(<<'.,.,', 'parser.y', 321) +module_eval(<<'.,.,', 'parser.y', 319) def _reduce_89(val, _values, result) - begin_c_declaration("}") + result = [{tag: val[0], tokens: val[1]}] result end .,., -module_eval(<<'.,.,', 'parser.y', 325) +module_eval(<<'.,.,', 'parser.y', 323) def _reduce_90(val, _values, result) - end_c_declaration + result = val[0].append({tag: val[1], tokens: val[2]}) result end @@ -1930,92 +1957,128 @@ def _reduce_90(val, _values, result) module_eval(<<'.,.,', 'parser.y', 329) def _reduce_91(val, _values, result) - result = val[2] + result = {id: val[0], alias_name: nil} result end .,., -module_eval(<<'.,.,', 'parser.y', 338) +module_eval(<<'.,.,', 'parser.y', 333) def _reduce_92(val, _values, result) + result = {id: val[0], alias_name: val[1].s_value} + + result + end +.,., + +# reduce 93 omitted + +# reduce 94 omitted + +module_eval(<<'.,.,', 'parser.y', 343) + def _reduce_95(val, _values, result) + begin_c_declaration("}") + + result + end +.,., + +module_eval(<<'.,.,', 'parser.y', 347) + def _reduce_96(val, _values, result) + end_c_declaration + + result + end +.,., + +module_eval(<<'.,.,', 'parser.y', 351) + def _reduce_97(val, _values, result) + result = val[2] + + result + end +.,., + +module_eval(<<'.,.,', 'parser.y', 360) + def _reduce_98(val, _values, result) result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 338) - def _reduce_93(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 360) + def _reduce_99(val, _values, result) result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 338) - def _reduce_94(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 360) + def _reduce_100(val, _values, result) result = val result end .,., -module_eval(<<'.,.,', 'parser.y', 338) - def _reduce_95(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 360) + def _reduce_101(val, _values, result) result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 338) - def _reduce_96(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 360) + def _reduce_102(val, _values, result) result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 333) - def _reduce_97(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 355) + def _reduce_103(val, _values, result) result = [{tag: nil, tokens: val[0]}] result end .,., -module_eval(<<'.,.,', 'parser.y', 334) - def _reduce_98(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 356) + def _reduce_104(val, _values, result) result = val[0].map {|tag, ids| {tag: tag, tokens: ids} } result end .,., -module_eval(<<'.,.,', 'parser.y', 335) - def _reduce_99(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 357) + def _reduce_105(val, _values, result) result = [{tag: nil, tokens: val[0]}, {tag: val[1], tokens: val[2]}] result end .,., -# reduce 100 omitted +# reduce 106 omitted -# reduce 101 omitted +# reduce 107 omitted -module_eval(<<'.,.,', 'parser.y', 346) - def _reduce_102(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 368) + def _reduce_108(val, _values, result) result = val[1] ? val[1].unshift(val[0]) : val result end .,., -module_eval(<<'.,.,', 'parser.y', 346) - def _reduce_103(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 368) + def _reduce_109(val, _values, result) result = val[1] ? val[1].unshift(val[0]) : val result end .,., -# reduce 104 omitted +# reduce 110 omitted -# reduce 105 omitted +# reduce 111 omitted -module_eval(<<'.,.,', 'parser.y', 348) - def _reduce_106(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 370) + def _reduce_112(val, _values, result) lhs = val[0] lhs.alias_name = val[1] val[3].each do |builder| @@ -2028,8 +2091,8 @@ def _reduce_106(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 360) - def _reduce_107(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 382) + def _reduce_113(val, _values, result) if val[0].rhs.count > 1 empties = val[0].rhs.select { |sym| sym.is_a?(Lrama::Lexer::Token::Empty) } empties.each do |empty| @@ -2046,8 +2109,8 @@ def _reduce_107(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 374) - def _reduce_108(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 396) + def _reduce_114(val, _values, result) builder = val[2] if !builder.line builder.line = @lexer.line - 1 @@ -2058,8 +2121,8 @@ def _reduce_108(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 384) - def _reduce_109(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 406) + def _reduce_115(val, _values, result) reset_precs result = @grammar.create_rule_builder(@rule_counter, @midrule_action_counter) @@ -2067,8 +2130,8 @@ def _reduce_109(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 389) - def _reduce_110(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 411) + def _reduce_116(val, _values, result) builder = val[0] builder.add_rhs(Lrama::Lexer::Token::Empty.new(location: @lexer.location)) result = builder @@ -2077,8 +2140,8 @@ def _reduce_110(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 395) - def _reduce_111(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 417) + def _reduce_117(val, _values, result) on_action_error("intermediate %prec in a rule", val[1]) if @trailing_prec_seen token = val[1] token.alias_name = val[2] @@ -2090,8 +2153,8 @@ def _reduce_111(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 404) - def _reduce_112(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 426) + def _reduce_118(val, _values, result) on_action_error("intermediate %prec in a rule", val[1]) if @trailing_prec_seen 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] @@ -2103,8 +2166,8 @@ def _reduce_112(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 413) - def _reduce_113(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 435) + def _reduce_119(val, _values, result) on_action_error("intermediate %prec in a rule", val[1]) if @trailing_prec_seen 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] @@ -2116,8 +2179,8 @@ def _reduce_113(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 422) - def _reduce_114(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 444) + def _reduce_120(val, _values, result) user_code = val[1] user_code.alias_name = val[2] user_code.tag = val[3] @@ -2129,8 +2192,8 @@ def _reduce_114(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 431) - def _reduce_115(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 453) + def _reduce_121(val, _values, result) on_action_error("multiple %prec in a rule", val[0]) if prec_seen? sym = @grammar.find_symbol_by_id!(val[2]) if val[0].rhs.empty? @@ -2146,33 +2209,33 @@ def _reduce_115(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 444) - def _reduce_116(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 466) + def _reduce_122(val, _values, result) result = "option" result end .,., -module_eval(<<'.,.,', 'parser.y', 445) - def _reduce_117(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 467) + def _reduce_123(val, _values, result) result = "nonempty_list" result end .,., -module_eval(<<'.,.,', 'parser.y', 446) - def _reduce_118(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 468) + def _reduce_124(val, _values, result) result = "list" result end .,., -# reduce 119 omitted +# reduce 125 omitted -# reduce 120 omitted +# reduce 126 omitted -module_eval(<<'.,.,', 'parser.y', 451) - def _reduce_121(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 473) + def _reduce_127(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 @@ -2183,22 +2246,22 @@ def _reduce_121(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 457) - def _reduce_122(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 479) + def _reduce_128(val, _values, result) result = val[0].append(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.y', 458) - def _reduce_123(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 480) + def _reduce_129(val, _values, result) result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[0].s_value, location: @lexer.location, args: val[2])] result end .,., -module_eval(<<'.,.,', 'parser.y', 463) - def _reduce_124(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 485) + def _reduce_130(val, _values, result) if prec_seen? on_action_error("multiple User_code after %prec", val[0]) if @code_after_prec @code_after_prec = true @@ -2209,39 +2272,39 @@ def _reduce_124(val, _values, result) end .,., -module_eval(<<'.,.,', 'parser.y', 471) - def _reduce_125(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 493) + def _reduce_131(val, _values, result) end_c_declaration result end .,., -module_eval(<<'.,.,', 'parser.y', 475) - def _reduce_126(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 497) + def _reduce_132(val, _values, result) result = val[2] result end .,., -module_eval(<<'.,.,', 'parser.y', 478) - def _reduce_127(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 500) + def _reduce_133(val, _values, result) result = val[1].s_value result end .,., -module_eval(<<'.,.,', 'parser.y', 483) - def _reduce_128(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 505) + def _reduce_134(val, _values, result) begin_c_declaration('\Z') result end .,., -module_eval(<<'.,.,', 'parser.y', 487) - def _reduce_129(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 509) + def _reduce_135(val, _values, result) end_c_declaration @grammar.epilogue_first_lineno = val[0].first_line + 1 @grammar.epilogue = val[2].s_value @@ -2250,18 +2313,18 @@ def _reduce_129(val, _values, result) end .,., -# reduce 130 omitted +# reduce 136 omitted -# reduce 131 omitted +# reduce 137 omitted -# reduce 132 omitted +# reduce 138 omitted -# reduce 133 omitted +# reduce 139 omitted -# reduce 134 omitted +# reduce 140 omitted -module_eval(<<'.,.,', 'parser.y', 499) - def _reduce_135(val, _values, result) +module_eval(<<'.,.,', 'parser.y', 521) + def _reduce_141(val, _values, result) result = Lrama::Lexer::Token::Ident.new(s_value: val[0].s_value) result end diff --git a/parser.y b/parser.y index 312b5e9d..c7375f79 100644 --- a/parser.y +++ b/parser.y @@ -140,14 +140,16 @@ rule } } } - | "%nterm" symbol_declarations + | "%nterm" nterm_declarations { val[1].each {|hash| - hash[:tokens].each {|id| + hash[:tokens].each {|token_info| + id = token_info[:id] + alias_name = token_info[:alias_name] if @grammar.find_term_by_s_value(id.s_value) on_action_error("symbol #{id.s_value} redeclared as a nonterminal", id) else - @grammar.add_type(id: id, tag: hash[:tag]) + @grammar.add_type(id: id, tag: hash[:tag], alias_name: alias_name) end } } @@ -312,6 +314,26 @@ rule } | symbol_declarations TAG symbol+ { result = val[0].append({tag: val[1], tokens: val[2]}) } + nterm_declarations: + TAG? nterm_declaration+ + { + result = [{tag: val[0], tokens: val[1]}] + } + | nterm_declarations TAG nterm_declaration+ + { + result = val[0].append({tag: val[1], tokens: val[2]}) + } + + nterm_declaration: + id + { + result = {id: val[0], alias_name: nil} + } + | id STRING + { + result = {id: val[0], alias_name: val[1].s_value} + } + symbol: id | string_as_id diff --git a/sig/generated/lrama/grammar.rbs b/sig/generated/lrama/grammar.rbs index faab4f04..a40f5b29 100644 --- a/sig/generated/lrama/grammar.rbs +++ b/sig/generated/lrama/grammar.rbs @@ -154,8 +154,8 @@ module Lrama # @rbs (ident_or_tags: Array[Lexer::Token::Ident|Lexer::Token::Tag], token_code: Lexer::Token::UserCode, lineno: Integer) -> Array[ErrorToken] def add_error_token: (ident_or_tags: Array[Lexer::Token::Ident | Lexer::Token::Tag], token_code: Lexer::Token::UserCode, lineno: Integer) -> Array[ErrorToken] - # @rbs (id: Lexer::Token::Base, tag: Lexer::Token::Tag) -> Array[Type] - def add_type: (id: Lexer::Token::Base, tag: Lexer::Token::Tag) -> Array[Type] + # @rbs (id: Lexer::Token::Base, tag: Lexer::Token::Tag?, ?alias_name: String?) -> Array[Type] + def add_type: (id: Lexer::Token::Base, tag: Lexer::Token::Tag?, ?alias_name: String?) -> Array[Type] # @rbs (Grammar::Symbol sym, Integer precedence, String s_value, Integer lineno) -> Precedence def add_nonassoc: (Grammar::Symbol sym, Integer precedence, String s_value, Integer lineno) -> Precedence diff --git a/sig/generated/lrama/grammar/type.rbs b/sig/generated/lrama/grammar/type.rbs index 563e1095..be41174c 100644 --- a/sig/generated/lrama/grammar/type.rbs +++ b/sig/generated/lrama/grammar/type.rbs @@ -5,14 +5,18 @@ module Lrama class Type @id: Lexer::Token::Base - @tag: Lexer::Token::Tag + @tag: Lexer::Token::Tag? + + @alias_name: String? attr_reader id: Lexer::Token::Base - attr_reader tag: Lexer::Token::Tag + attr_reader tag: Lexer::Token::Tag? + + attr_reader alias_name: String? - # @rbs (id: Lexer::Token::Base, tag: Lexer::Token::Tag) -> void - def initialize: (id: Lexer::Token::Base, tag: Lexer::Token::Tag) -> void + # @rbs (id: Lexer::Token::Base, tag: Lexer::Token::Tag?, ?alias_name: String?) -> void + def initialize: (id: Lexer::Token::Base, tag: Lexer::Token::Tag?, ?alias_name: String?) -> void # @rbs (Grammar::Type other) -> bool def ==: (Grammar::Type other) -> bool diff --git a/spec/lrama/parser_spec.rb b/spec/lrama/parser_spec.rb index 9b2365ab..4e765460 100644 --- a/spec/lrama/parser_spec.rb +++ b/spec/lrama/parser_spec.rb @@ -4221,13 +4221,192 @@ class : keyword_class tSTRING keyword_end { code 1 } end end + context "when %nterm with alias" do + context "basic alias" do + it "stores alias_name for nonterminal" do + y = <<~INPUT + %{ + // Prologue + %} + + %nterm expr "expression" + + %% + + expr: /* empty */ + ; + INPUT + + grammar = Lrama::Parser.new(y, "nterm_alias.y").parse + grammar.prepare + grammar.validate! + + expr = grammar.nterms.find { |n| n.id.s_value == "expr" } + expect(expr.alias_name).to eq("\"expression\"") + end + end + + context "with tag" do + it "stores both tag and alias_name" do + y = <<~INPUT + %{ + // Prologue + %} + + %union { + int i; + } + + %nterm expr "expression" + + %% + + expr: /* empty */ + ; + INPUT + + grammar = Lrama::Parser.new(y, "nterm_alias.y").parse + grammar.prepare + grammar.validate! + + expr = grammar.nterms.find { |n| n.id.s_value == "expr" } + expect(expr.tag.s_value).to eq("") + expect(expr.alias_name).to eq("\"expression\"") + end + end + + context "multiple declarations with aliases" do + it "stores aliases for all symbols" do + y = <<~INPUT + %{ + // Prologue + %} + + %nterm expr "expression" stmt "statement" + + %% + + expr: /* empty */ + ; + + stmt: /* empty */ + ; + INPUT + + grammar = Lrama::Parser.new(y, "nterm_alias.y").parse + grammar.prepare + grammar.validate! + + expr = grammar.nterms.find { |n| n.id.s_value == "expr" } + stmt = grammar.nterms.find { |n| n.id.s_value == "stmt" } + expect(expr.alias_name).to eq("\"expression\"") + expect(stmt.alias_name).to eq("\"statement\"") + end + end + + context "without alias (backward compatibility)" do + it "keeps alias_name as nil" do + y = <<~INPUT + %{ + // Prologue + %} + + %nterm expr + + %% + + expr: /* empty */ + ; + INPUT + + grammar = Lrama::Parser.new(y, "nterm_alias.y").parse + grammar.prepare + grammar.validate! + + expr = grammar.nterms.find { |n| n.id.s_value == "expr" } + expect(expr.alias_name).to be_nil + end + end + + context "mixed declarations with and without aliases" do + it "correctly handles mixed declarations" do + y = <<~INPUT + %{ + // Prologue + %} + + %union { + int i; + } + + %nterm expr "expression" stmt + + %% + + expr: /* empty */ + ; + + stmt: /* empty */ + ; + INPUT + + grammar = Lrama::Parser.new(y, "nterm_alias.y").parse + grammar.prepare + grammar.validate! + + expr = grammar.nterms.find { |n| n.id.s_value == "expr" } + stmt = grammar.nterms.find { |n| n.id.s_value == "stmt" } + expect(expr.alias_name).to eq("\"expression\"") + expect(stmt.alias_name).to be_nil + expect(expr.tag.s_value).to eq("") + expect(stmt.tag.s_value).to eq("") + end + end + + context "multiple tag groups" do + it "handles multiple tag groups with aliases" do + y = <<~INPUT + %{ + // Prologue + %} + + %union { + int i; + char *str; + } + + %nterm expr "expression" name "identifier" + + %% + + expr: /* empty */ + ; + + name: /* empty */ + ; + INPUT + + grammar = Lrama::Parser.new(y, "nterm_alias.y").parse + grammar.prepare + grammar.validate! + + expr = grammar.nterms.find { |n| n.id.s_value == "expr" } + name = grammar.nterms.find { |n| n.id.s_value == "name" } + expect(expr.tag.s_value).to eq("") + expect(expr.alias_name).to eq("\"expression\"") + expect(name.tag.s_value).to eq("") + expect(name.alias_name).to eq("\"identifier\"") + end + end + end + context "when pass the terminal symbol to `%nterm`" do it "raises an error" do y = <<~INPUT %{ // Prologue %} - + %token EOI 0 "EOI" %nterm EOI