diff --git a/lib/lrama/parser.rb b/lib/lrama/parser.rb
index 6a35dba2..ca720631 100644
--- a/lib/lrama/parser.rb
+++ b/lib/lrama/parser.rb
@@ -654,7 +654,7 @@ def token_to_str(t)
 module Lrama
   class Parser < Racc::Parser
 
-module_eval(<<'...end parser.y/module_eval...', 'parser.y', 417)
+module_eval(<<'...end parser.y/module_eval...', 'parser.y', 414)
 
 include Lrama::Report::Duration
 
@@ -731,26 +731,26 @@ def raise_parse_error(error_message, location)
     94,    48,    95,   166,    48,    77,   172,    48,    77,   166,
     48,    77,   172,    48,    77,    47,     6,    85,    69,    48,
     48,    47,    47,    77,    74,    81,    48,    48,    47,    47,
-    40,    81,    81,    48,    41,    47,    92,    48,    81,    47,
-    44,    77,   103,   168,   169,    45,   175,   169,    96,   168,
-   169,    52,   175,   169,    86,    20,    24,    25,    26,    27,
-    28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-    38,    92,    48,     4,    47,     5,    77,   103,    48,    48,
-    47,    47,    77,   103,   116,    48,     4,    47,     5,    77,
-    20,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-    33,    34,    35,    36,    37,    38,    11,    12,    13,    14,
-    15,    16,    17,    18,    19,    52,    20,    24,    25,    26,
-    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
-    37,    38,    11,    12,    13,    14,    15,    16,    17,    18,
-    19,    43,    20,    24,    25,    26,    27,    28,    29,    30,
-    31,    32,    33,    34,    35,    36,    37,    38,    48,    48,
-    47,    47,    77,   103,    48,    48,    47,    47,    77,    77,
-    48,    48,    47,    47,    77,    77,    48,    48,   196,   196,
-    77,    77,    48,    48,    47,   196,    77,    77,   148,   170,
-    52,   149,   149,   180,   181,   182,   131,   180,   181,   182,
-   131,   203,   208,   215,   204,   204,   204,    48,    48,    47,
-    47,    48,    48,    47,    47,    48,    48,    47,    47,   180,
-   181,   182,   119,   120,    55,    52,    52,    52,    52,    52,
+    40,    81,    81,    48,    48,    47,    47,    92,    81,   116,
+   148,   119,   120,   149,   168,   169,    41,   175,   169,    96,
+   168,   169,    44,   175,   169,    86,    20,    24,    25,    26,
+    27,    28,    29,    30,    31,    92,    32,    33,    34,    35,
+    36,    37,    38,    48,     4,    47,     5,    77,   101,    48,
+     4,    47,     5,    77,    20,    24,    25,    26,    27,    28,
+    29,    30,    31,    45,    32,    33,    34,    35,    36,    37,
+    38,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+    52,    20,    24,    25,    26,    27,    28,    29,    30,    31,
+    52,    32,    33,    34,    35,    36,    37,    38,    11,    12,
+    13,    14,    15,    16,    17,    18,    19,    43,    20,    24,
+    25,    26,    27,    28,    29,    30,    31,    52,    32,    33,
+    34,    35,    36,    37,    38,    48,    48,    47,    47,    77,
+   101,    48,    48,    47,    47,    77,   101,    48,    48,    47,
+    47,    77,   101,    48,    48,    47,    47,    77,    77,    48,
+    48,    47,    47,    77,    77,    48,    48,   196,   196,    77,
+    77,    48,    48,    47,   196,    77,    77,   170,    55,    52,
+   149,   180,   181,   182,   131,   180,   181,   182,   131,   203,
+   208,   215,   204,   204,   204,    48,    48,    47,    47,    48,
+    48,    47,    47,   180,   181,   182,    52,    52,    52,    52,
     61,    62,    63,    64,    65,    87,    52,    52,   106,   109,
    111,   118,   125,   126,   128,   131,   132,    77,   140,   141,
    142,   143,   145,   146,   153,   140,   155,   153,   159,   160,
@@ -762,26 +762,26 @@ def raise_parse_error(error_message, location)
     46,   151,    46,   151,   157,   151,   157,   177,   157,   177,
    188,   177,   188,    32,   188,    32,     1,    38,    32,    33,
     34,    33,    34,    33,    33,    34,    35,    36,    35,    36,
-     5,    35,    36,    37,     6,    37,    44,    58,    37,    58,
-     9,    58,    58,   151,   151,    11,   157,   157,    46,   177,
-   177,    13,   188,   188,    38,    44,    44,    44,    44,    44,
-    44,    44,    44,    44,    44,    44,    44,    44,    44,    44,
-    44,    88,    59,     0,    59,     0,    59,    59,    60,    79,
-    60,    79,    60,    60,    79,    72,     2,    72,     2,    72,
-    88,    88,    88,    88,    88,    88,    88,    88,    88,    88,
-    88,    88,    88,    88,    88,    88,     3,     3,     3,     3,
-     3,     3,     3,     3,     3,    14,     3,     3,     3,     3,
-     3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-     3,     3,     8,     8,     8,     8,     8,     8,     8,     8,
+     5,    35,    36,    37,    79,    37,    79,    44,    37,    79,
+   139,    86,    86,   139,   151,   151,     6,   157,   157,    46,
+   177,   177,     9,   188,   188,    38,    44,    44,    44,    44,
+    44,    44,    44,    44,    44,    88,    44,    44,    44,    44,
+    44,    44,    44,    58,     0,    58,     0,    58,    58,    72,
+     2,    72,     2,    72,    88,    88,    88,    88,    88,    88,
+    88,    88,    88,    11,    88,    88,    88,    88,    88,    88,
+    88,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+    13,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+    14,     3,     3,     3,     3,     3,     3,     3,     8,     8,
      8,     8,     8,     8,     8,     8,     8,     8,     8,     8,
-     8,     8,     8,     8,     8,     8,     8,     8,   100,    12,
-   100,    12,   100,   100,    74,   111,    74,   111,    74,   111,
-   168,   175,   168,   175,   168,   175,   183,   189,   183,   189,
-   183,   189,   204,   205,   204,   205,   204,   205,   139,   154,
-    15,   139,   154,   165,   165,   165,   165,   173,   173,   173,
-   173,   195,   200,   212,   195,   200,   212,    67,    69,    67,
-    69,    81,   106,    81,   106,   114,   116,   114,   116,   197,
-   197,   197,    86,    86,    16,    17,    20,    24,    25,    26,
+     8,     8,     8,     8,     8,     8,     8,    15,     8,     8,
+     8,     8,     8,     8,     8,    59,    12,    59,    12,    59,
+    59,    60,    67,    60,    67,    60,    60,   102,    69,   102,
+    69,   102,   102,    74,   111,    74,   111,    74,   111,   168,
+   175,   168,   175,   168,   175,   183,   189,   183,   189,   183,
+   189,   204,   205,   204,   205,   204,   205,   154,    16,    17,
+   154,   165,   165,   165,   165,   173,   173,   173,   173,   195,
+   200,   212,   195,   200,   212,    81,   106,    81,   106,   114,
+   116,   114,   116,   197,   197,   197,    20,    24,    25,    26,
     27,    28,    29,    30,    31,    39,    50,    55,    66,    70,
     71,    85,    89,    90,    91,    92,    98,   110,   118,   119,
    120,   121,   130,   131,   141,   142,   144,   145,   146,   147,
@@ -790,64 +790,64 @@ def raise_parse_error(error_message, location)
    201,   203,   207,   208,   214 ]
 
 racc_action_pointer = [
-    63,    16,    76,    93,   nil,    23,    34,   nil,   119,    31,
-   nil,    39,   156,     5,    69,   144,   219,   179,   nil,   nil,
-   180,   nil,   nil,   nil,   181,   182,   183,   225,   226,   227,
+    64,    16,    70,    88,   nil,    23,    46,   nil,   115,    43,
+   nil,    87,   153,    63,    73,   100,   193,   152,   nil,   nil,
+   179,   nil,   nil,   nil,   180,   181,   182,   225,   226,   227,
    228,   229,    10,    16,    17,    23,    24,    30,    12,   233,
-   nil,   nil,   nil,   nil,    32,   nil,    -5,   nil,   nil,   nil,
-   190,   nil,   nil,   nil,   nil,   191,   nil,   nil,    34,    69,
-    75,   nil,   nil,   nil,   nil,   nil,   230,   204,   nil,   205,
-   233,   232,    82,   nil,   161,   nil,   nil,   nil,   nil,    76,
-   nil,   208,   nil,   nil,   nil,   202,   218,   nil,    67,   233,
-   221,   222,   194,   nil,   nil,   nil,   nil,   nil,   244,   nil,
-   155,   nil,   nil,   nil,   nil,   nil,   209,   nil,   nil,   nil,
-   240,   162,   nil,   nil,   212,   nil,   213,   nil,   243,   208,
-   211,   240,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   211,   248,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   148,
-   nil,   200,   250,   nil,   254,   203,   206,   212,   252,   256,
-   218,    -2,   nil,   nil,   149,   nil,   219,     1,   nil,   nil,
-   nil,   nil,   223,   nil,   211,   145,   227,   216,   167,   nil,
-   227,   215,   231,   149,   220,   168,   218,     4,   nil,   nil,
-   nil,   nil,   nil,   173,   nil,   nil,   271,   220,     7,   174,
-   nil,   224,   268,   nil,   233,   161,   239,   171,   nil,   235,
-   162,   272,   nil,   273,   179,   180,   nil,   235,   232,   nil,
-   nil,   nil,   163,   nil,   276,   nil,   nil ]
+   nil,   nil,   nil,   nil,    33,   nil,    -5,   nil,   nil,   nil,
+   189,   nil,   nil,   nil,   nil,   190,   nil,   nil,    70,   152,
+   158,   nil,   nil,   nil,   nil,   nil,   230,   159,   nil,   165,
+   233,   232,    76,   nil,   170,   nil,   nil,   nil,   nil,    31,
+   nil,   212,   nil,   nil,   nil,   201,    37,   nil,    61,   233,
+   221,   222,   193,   nil,   nil,   nil,   nil,   nil,   244,   nil,
+   nil,   nil,   164,   nil,   nil,   nil,   213,   nil,   nil,   nil,
+   240,   171,   nil,   nil,   216,   nil,   217,   nil,   243,   207,
+   210,   240,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   210,   248,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    -1,
+   nil,   199,   250,   nil,   254,   202,   205,   211,   252,   256,
+   217,    -2,   nil,   nil,   156,   nil,   218,     1,   nil,   nil,
+   nil,   nil,   222,   nil,   210,   152,   226,   215,   176,   nil,
+   226,   214,   230,   156,   219,   177,   217,     4,   nil,   nil,
+   nil,   nil,   nil,   182,   nil,   nil,   271,   219,     7,   183,
+   nil,   223,   268,   nil,   232,   168,   238,   174,   nil,   234,
+   169,   272,   nil,   273,   188,   189,   nil,   234,   231,   nil,
+   nil,   nil,   170,   nil,   276,   nil,   nil ]
 
 racc_action_default = [
     -1,  -127,    -1,    -3,   -10,  -127,  -127,    -2,    -3,  -127,
    -16,  -127,  -127,  -127,  -127,  -127,  -127,  -127,   -24,   -25,
-  -127,   -30,   -31,   -32,  -127,  -127,  -127,  -127,  -127,  -127,
+  -127,   -32,   -33,   -34,  -127,  -127,  -127,  -127,  -127,  -127,
   -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,  -127,
-   -13,   217,    -4,   -26,  -127,   -17,  -118,   -89,   -90,  -117,
-   -14,   -19,   -81,   -20,   -21,  -127,   -23,   -29,  -127,  -127,
-  -127,   -36,   -37,   -38,   -39,   -40,   -41,   -47,   -49,  -127,
-   -52,   -42,   -74,   -76,  -127,   -79,   -80,  -126,   -43,   -84,
-   -86,  -127,   -44,   -45,   -46,  -127,  -127,   -11,    -5,    -7,
-   -91,  -127,   -64,   -18,  -119,  -120,  -121,   -15,  -127,   -22,
-   -27,   -33,  -122,  -123,   -34,   -35,  -127,   -48,   -50,   -53,
-   -72,  -127,   -75,   -77,   -84,   -85,  -127,   -87,  -127,  -127,
-  -127,  -127,    -6,    -8,    -9,  -115,   -92,   -93,   -94,   -65,
-  -127,  -127,   -82,   -28,   -51,   -54,   -73,   -78,   -88,  -127,
-   -60,  -124,  -127,   -12,  -127,  -124,  -127,  -127,   -55,  -127,
-   -58,   -62,   -66,  -125,  -127,  -116,   -95,   -96,   -98,  -114,
-   -83,   -56,  -127,   -61,  -124,   -64,   -89,   -64,  -127,  -111,
-  -127,  -124,   -89,   -64,   -64,  -127,  -124,   -63,   -67,   -68,
-  -104,  -105,  -106,  -127,   -70,   -71,  -127,  -124,   -97,  -127,
-   -99,   -64,   -55,  -103,   -57,  -127,   -89,  -107,  -112,   -59,
-  -127,   -55,  -102,   -55,  -127,  -127,  -109,  -127,   -64,  -100,
-   -69,  -108,  -127,  -113,   -55,  -110,  -101 ]
+   -13,   217,    -4,   -26,  -127,   -17,  -120,   -91,   -92,  -119,
+   -14,   -19,   -83,   -20,   -21,  -127,   -23,   -31,  -127,  -127,
+  -127,   -38,   -39,   -40,   -41,   -42,   -43,   -49,   -51,  -127,
+   -54,   -44,   -76,   -78,  -127,   -81,   -82,  -126,   -45,   -86,
+   -88,  -127,   -46,   -47,   -48,  -127,  -127,   -11,    -5,    -7,
+   -93,  -127,   -66,   -18,  -121,  -122,  -123,   -15,  -127,   -22,
+   -27,   -28,   -29,   -35,   -36,   -37,  -127,   -50,   -52,   -55,
+   -74,  -127,   -77,   -79,   -86,   -87,  -127,   -89,  -127,  -127,
+  -127,  -127,    -6,    -8,    -9,  -117,   -94,   -95,   -96,   -67,
+  -127,  -127,   -84,   -30,   -53,   -56,   -75,   -80,   -90,  -127,
+   -62,  -124,  -127,   -12,  -127,  -124,  -127,  -127,   -57,  -127,
+   -60,   -64,   -68,  -125,  -127,  -118,   -97,   -98,  -100,  -116,
+   -85,   -58,  -127,   -63,  -124,   -66,   -91,   -66,  -127,  -113,
+  -127,  -124,   -91,   -66,   -66,  -127,  -124,   -65,   -69,   -70,
+  -106,  -107,  -108,  -127,   -72,   -73,  -127,  -124,   -99,  -127,
+  -101,   -66,   -57,  -105,   -59,  -127,   -91,  -109,  -114,   -61,
+  -127,   -57,  -104,   -57,  -127,  -127,  -111,  -127,   -66,  -102,
+   -71,  -110,  -127,  -115,   -57,  -112,  -103 ]
 
 racc_goto_table = [
-   102,   102,   102,    49,   130,    73,    68,    89,   162,    91,
-   150,   139,   101,   104,   105,     1,     9,   174,    51,    53,
-    54,    42,   115,    70,   117,    79,    79,    79,    79,    56,
-   123,     3,    57,     7,   124,   154,    58,    59,    60,   179,
-   158,   107,   102,   108,   112,   194,   113,   191,   174,   157,
-    39,   122,   202,    91,   133,    97,   199,   115,    70,   138,
-    70,   209,   195,   210,   121,    46,   158,    99,   200,    93,
-   114,   206,   114,    66,   216,   188,    71,   178,   135,   184,
-   134,   110,   177,   137,   212,   190,   192,    78,    82,    83,
-    84,   136,    98,   165,   147,   127,   156,    70,   186,   173,
+   100,   100,   100,    49,   130,   150,    73,   174,   162,    89,
+    91,    56,     1,    68,    57,   103,   104,   105,    58,    59,
+    60,   123,   139,    70,   124,    79,    79,    79,    79,    51,
+    53,    54,   115,   179,   117,     3,   158,     7,   174,    39,
+   194,   191,   157,   121,   100,   112,   154,   113,   107,    99,
+   108,   199,   202,   122,    91,    46,    93,    66,    70,   133,
+    70,   209,   158,   210,    71,   206,    97,   115,   188,   138,
+   114,   135,   114,     9,   216,   110,   195,   178,    42,   184,
+   177,   136,   200,    98,   137,   190,   192,   134,    78,    82,
+    83,    84,   147,   165,   127,   156,   186,    70,   212,   173,
    207,   144,   nil,   201,   nil,   114,   nil,   114,   nil,   nil,
    185,   nil,   nil,   nil,   nil,   nil,   nil,   193,   nil,   165,
    214,   nil,   nil,   nil,   nil,   197,   nil,   nil,   nil,   nil,
@@ -855,166 +855,166 @@ def raise_parse_error(error_message, location)
    nil,   nil,   nil,   nil,   nil,   nil,   211,   197 ]
 
 racc_goto_check = [
-    35,    35,    35,    27,    40,    42,    26,     8,    32,    12,
-    31,    30,    21,    21,    21,     1,     7,    39,    16,    16,
-    16,     7,    45,    27,    45,    27,    27,    27,    27,    15,
-     5,     6,    15,     6,     9,    30,    15,    15,    15,    37,
-    34,    26,    35,    26,    42,    31,    42,    37,    39,    49,
-    10,     8,    32,    12,    21,    16,    31,    45,    27,    45,
-    27,    32,    38,    32,    11,    13,    34,    15,    38,    14,
-    27,    37,    27,    22,    32,    49,    23,    40,    28,    40,
-    26,    29,    33,    42,    38,    40,    40,    24,    24,    24,
-    24,    41,    43,    35,    44,    47,    48,    27,    50,    35,
-    51,    52,   nil,    40,   nil,    27,   nil,    27,   nil,   nil,
-    35,   nil,   nil,   nil,   nil,   nil,   nil,    35,   nil,    35,
-    40,   nil,   nil,   nil,   nil,    35,   nil,   nil,   nil,   nil,
-    35,    35,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,    35,    35 ]
+    20,    20,    20,    28,    40,    32,    42,    39,    33,     8,
+    12,    15,     1,    27,    15,    22,    22,    22,    15,    15,
+    15,     5,    31,    28,     9,    28,    28,    28,    28,    16,
+    16,    16,    45,    37,    45,     6,    35,     6,    39,    10,
+    32,    37,    49,    11,    20,    42,    31,    42,    27,    15,
+    27,    32,    33,     8,    12,    13,    14,    23,    28,    22,
+    28,    33,    35,    33,    24,    37,    16,    45,    49,    45,
+    28,    29,    28,     7,    33,    30,    38,    40,     7,    40,
+    34,    41,    38,    43,    42,    40,    40,    27,    25,    25,
+    25,    25,    44,    20,    47,    48,    50,    28,    38,    20,
+    51,    52,   nil,    40,   nil,    28,   nil,    28,   nil,   nil,
+    20,   nil,   nil,   nil,   nil,   nil,   nil,    20,   nil,    20,
+    40,   nil,   nil,   nil,   nil,    20,   nil,   nil,   nil,   nil,
+    20,    20,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,    20,    20 ]
 
 racc_goto_pointer = [
-   nil,    15,   nil,   nil,   nil,   -59,    31,    13,   -37,   -55,
-    46,   -23,   -35,    53,    23,    12,     5,   nil,   nil,   nil,
-   nil,   -46,    41,    43,    53,   nil,   -26,    -9,   -32,    11,
-  -107,  -131,  -140,   -82,  -105,   -58,   nil,  -126,  -121,  -140,
-   -88,   -19,   -28,    40,   -38,   -57,   nil,     5,   -49,   -96,
-   -71,   -98,   -24 ]
+   nil,    12,   nil,   nil,   nil,   -68,    35,    70,   -35,   -65,
+    35,   -44,   -34,    43,    10,    -6,    16,   nil,   nil,   nil,
+   -58,   nil,   -43,    25,    31,    54,   nil,   -19,    -9,   -39,
+     5,   -96,  -136,  -140,   -84,  -109,   nil,  -132,  -107,  -150,
+   -88,   -29,   -27,    31,   -40,   -47,   nil,     4,   -50,  -103,
+   -73,   -98,   -24 ]
 
 racc_goto_default = [
    nil,   nil,     2,     8,    88,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,    10,   nil,   nil,    50,   nil,    21,    22,    23,
-   100,   nil,   nil,   nil,   nil,    67,   nil,    75,   nil,   nil,
-   nil,   nil,   nil,   151,   152,    72,   129,   nil,   nil,   167,
+    72,   102,   nil,   nil,   nil,   nil,    67,   nil,    75,   nil,
+   nil,   nil,   nil,   nil,   151,   152,   129,   nil,   nil,   167,
    nil,    76,   nil,   nil,   nil,    80,    90,   nil,   nil,   nil,
    nil,   nil,   nil ]
 
 racc_reduce_table = [
   0, 0, :racc_error,
-  0, 61, :_reduce_1,
-  2, 61, :_reduce_2,
-  0, 62, :_reduce_3,
-  2, 62, :_reduce_4,
-  1, 63, :_reduce_5,
-  2, 63, :_reduce_6,
-  0, 64, :_reduce_none,
-  1, 64, :_reduce_none,
-  5, 56, :_reduce_none,
-  0, 65, :_reduce_10,
-  0, 66, :_reduce_11,
-  5, 57, :_reduce_12,
-  2, 57, :_reduce_none,
-  1, 71, :_reduce_14,
-  2, 71, :_reduce_15,
-  1, 58, :_reduce_none,
-  2, 58, :_reduce_17,
-  3, 58, :_reduce_none,
+  0, 62, :_reduce_1,
+  2, 62, :_reduce_2,
+  0, 63, :_reduce_3,
+  2, 63, :_reduce_4,
+  1, 64, :_reduce_5,
+  2, 64, :_reduce_6,
+  0, 65, :_reduce_none,
+  1, 65, :_reduce_none,
+  5, 57, :_reduce_none,
+  0, 66, :_reduce_10,
+  0, 67, :_reduce_11,
+  5, 58, :_reduce_12,
   2, 58, :_reduce_none,
-  2, 58, :_reduce_20,
-  2, 58, :_reduce_21,
-  3, 58, :_reduce_22,
-  2, 58, :_reduce_23,
-  1, 58, :_reduce_24,
-  1, 58, :_reduce_25,
-  2, 58, :_reduce_none,
-  1, 76, :_reduce_27,
-  2, 76, :_reduce_28,
-  2, 67, :_reduce_29,
-  1, 67, :_reduce_none,
-  1, 67, :_reduce_none,
-  1, 67, :_reduce_none,
-  3, 67, :_reduce_33,
-  3, 67, :_reduce_34,
-  3, 67, :_reduce_35,
-  2, 67, :_reduce_36,
-  2, 67, :_reduce_37,
-  2, 67, :_reduce_38,
-  2, 67, :_reduce_39,
-  2, 67, :_reduce_40,
-  2, 72, :_reduce_none,
-  2, 72, :_reduce_42,
-  2, 72, :_reduce_43,
-  2, 72, :_reduce_44,
-  2, 72, :_reduce_45,
-  2, 72, :_reduce_46,
-  1, 81, :_reduce_47,
-  2, 81, :_reduce_48,
-  1, 77, :_reduce_49,
-  2, 77, :_reduce_50,
-  3, 77, :_reduce_51,
-  0, 84, :_reduce_none,
-  1, 84, :_reduce_none,
-  3, 80, :_reduce_54,
-  0, 87, :_reduce_none,
-  1, 87, :_reduce_none,
-  8, 73, :_reduce_57,
-  5, 74, :_reduce_58,
-  8, 74, :_reduce_59,
-  1, 85, :_reduce_60,
-  3, 85, :_reduce_61,
-  1, 86, :_reduce_62,
-  3, 86, :_reduce_63,
-  0, 95, :_reduce_none,
-  1, 95, :_reduce_none,
-  1, 88, :_reduce_66,
-  3, 88, :_reduce_67,
-  3, 88, :_reduce_68,
-  6, 88, :_reduce_69,
-  3, 88, :_reduce_70,
-  3, 88, :_reduce_71,
-  0, 83, :_reduce_none,
-  1, 83, :_reduce_73,
-  1, 97, :_reduce_74,
-  2, 97, :_reduce_75,
-  1, 78, :_reduce_76,
-  2, 78, :_reduce_77,
-  3, 78, :_reduce_78,
-  1, 90, :_reduce_none,
-  1, 90, :_reduce_none,
-  0, 98, :_reduce_81,
-  0, 99, :_reduce_82,
-  5, 70, :_reduce_83,
-  1, 100, :_reduce_84,
-  2, 100, :_reduce_85,
-  1, 79, :_reduce_86,
-  2, 79, :_reduce_87,
-  3, 79, :_reduce_88,
-  1, 82, :_reduce_89,
-  1, 82, :_reduce_90,
-  0, 102, :_reduce_none,
-  1, 102, :_reduce_none,
+  1, 72, :_reduce_14,
+  2, 72, :_reduce_15,
+  1, 59, :_reduce_none,
+  2, 59, :_reduce_17,
+  3, 59, :_reduce_none,
   2, 59, :_reduce_none,
+  2, 59, :_reduce_20,
+  2, 59, :_reduce_21,
+  3, 59, :_reduce_22,
+  2, 59, :_reduce_23,
+  1, 59, :_reduce_24,
+  1, 59, :_reduce_25,
   2, 59, :_reduce_none,
-  4, 101, :_reduce_95,
-  1, 103, :_reduce_96,
-  3, 103, :_reduce_97,
+  1, 77, :_reduce_27,
+  1, 77, :_reduce_28,
+  1, 78, :_reduce_29,
+  2, 78, :_reduce_30,
+  2, 68, :_reduce_31,
+  1, 68, :_reduce_none,
+  1, 68, :_reduce_none,
+  1, 68, :_reduce_none,
+  3, 68, :_reduce_35,
+  3, 68, :_reduce_36,
+  3, 68, :_reduce_37,
+  2, 68, :_reduce_38,
+  2, 68, :_reduce_39,
+  2, 68, :_reduce_40,
+  2, 68, :_reduce_41,
+  2, 68, :_reduce_42,
+  2, 73, :_reduce_none,
+  2, 73, :_reduce_44,
+  2, 73, :_reduce_45,
+  2, 73, :_reduce_46,
+  2, 73, :_reduce_47,
+  2, 73, :_reduce_48,
+  1, 83, :_reduce_49,
+  2, 83, :_reduce_50,
+  1, 79, :_reduce_51,
+  2, 79, :_reduce_52,
+  3, 79, :_reduce_53,
+  0, 86, :_reduce_none,
+  1, 86, :_reduce_none,
+  3, 82, :_reduce_56,
+  0, 89, :_reduce_none,
+  1, 89, :_reduce_none,
+  8, 74, :_reduce_59,
+  5, 75, :_reduce_60,
+  8, 75, :_reduce_61,
+  1, 87, :_reduce_62,
+  3, 87, :_reduce_63,
+  1, 88, :_reduce_64,
+  3, 88, :_reduce_65,
+  0, 96, :_reduce_none,
+  1, 96, :_reduce_none,
+  1, 90, :_reduce_68,
+  3, 90, :_reduce_69,
+  3, 90, :_reduce_70,
+  6, 90, :_reduce_71,
+  3, 90, :_reduce_72,
+  3, 90, :_reduce_73,
+  0, 85, :_reduce_none,
+  1, 85, :_reduce_75,
+  1, 98, :_reduce_76,
+  2, 98, :_reduce_77,
+  1, 80, :_reduce_78,
+  2, 80, :_reduce_79,
+  3, 80, :_reduce_80,
+  1, 76, :_reduce_none,
+  1, 76, :_reduce_none,
+  0, 99, :_reduce_83,
+  0, 100, :_reduce_84,
+  5, 71, :_reduce_85,
+  1, 101, :_reduce_86,
+  2, 101, :_reduce_87,
+  1, 81, :_reduce_88,
+  2, 81, :_reduce_89,
+  3, 81, :_reduce_90,
+  1, 84, :_reduce_91,
+  1, 84, :_reduce_92,
+  0, 103, :_reduce_none,
+  1, 103, :_reduce_none,
+  2, 60, :_reduce_none,
+  2, 60, :_reduce_none,
+  4, 102, :_reduce_97,
   1, 104, :_reduce_98,
   3, 104, :_reduce_99,
-  5, 104, :_reduce_100,
-  7, 104, :_reduce_101,
-  4, 104, :_reduce_102,
-  3, 104, :_reduce_103,
-  1, 92, :_reduce_104,
-  1, 92, :_reduce_105,
-  1, 92, :_reduce_106,
+  1, 105, :_reduce_100,
+  3, 105, :_reduce_101,
+  5, 105, :_reduce_102,
+  7, 105, :_reduce_103,
+  4, 105, :_reduce_104,
+  3, 105, :_reduce_105,
+  1, 93, :_reduce_106,
   1, 93, :_reduce_107,
-  3, 93, :_reduce_108,
-  2, 93, :_reduce_109,
-  4, 93, :_reduce_110,
-  0, 105, :_reduce_111,
-  0, 106, :_reduce_112,
-  5, 94, :_reduce_113,
-  3, 91, :_reduce_114,
-  0, 107, :_reduce_115,
-  3, 60, :_reduce_116,
-  1, 68, :_reduce_none,
-  0, 69, :_reduce_none,
-  1, 69, :_reduce_none,
+  1, 93, :_reduce_108,
+  1, 94, :_reduce_109,
+  3, 94, :_reduce_110,
+  2, 94, :_reduce_111,
+  4, 94, :_reduce_112,
+  0, 106, :_reduce_113,
+  0, 107, :_reduce_114,
+  5, 95, :_reduce_115,
+  3, 92, :_reduce_116,
+  0, 108, :_reduce_117,
+  3, 61, :_reduce_118,
   1, 69, :_reduce_none,
-  1, 69, :_reduce_none,
-  1, 75, :_reduce_none,
-  1, 75, :_reduce_none,
-  0, 89, :_reduce_none,
-  1, 89, :_reduce_none,
-  1, 96, :_reduce_126 ]
+  0, 70, :_reduce_none,
+  1, 70, :_reduce_none,
+  1, 70, :_reduce_none,
+  1, 70, :_reduce_none,
+  0, 91, :_reduce_none,
+  1, 91, :_reduce_none,
+  1, 97, :_reduce_126 ]
 
 racc_reduce_n = 127
 
@@ -1053,31 +1053,32 @@ def raise_parse_error(error_message, location)
   "%after-reduce" => 29,
   "%after-shift-error-token" => 30,
   "%after-pop-stack" => 31,
-  "%token" => 32,
-  "%type" => 33,
-  "%left" => 34,
-  "%right" => 35,
-  "%precedence" => 36,
-  "%nonassoc" => 37,
-  "%rule" => 38,
-  "(" => 39,
-  ")" => 40,
-  ":" => 41,
-  "%inline" => 42,
-  "," => 43,
-  "|" => 44,
-  "%prec" => 45,
-  "{" => 46,
-  "}" => 47,
-  "?" => 48,
-  "+" => 49,
-  "*" => 50,
-  "[" => 51,
-  "]" => 52,
-  "{...}" => 53,
-  "%empty" => 54 }
-
-racc_nt_base = 55
+  "-temp-group" => 32,
+  "%token" => 33,
+  "%type" => 34,
+  "%left" => 35,
+  "%right" => 36,
+  "%precedence" => 37,
+  "%nonassoc" => 38,
+  "%rule" => 39,
+  "(" => 40,
+  ")" => 41,
+  ":" => 42,
+  "%inline" => 43,
+  "," => 44,
+  "|" => 45,
+  "%prec" => 46,
+  "{" => 47,
+  "}" => 48,
+  "?" => 49,
+  "+" => 50,
+  "*" => 51,
+  "[" => 52,
+  "]" => 53,
+  "{...}" => 54,
+  "%empty" => 55 }
+
+racc_nt_base = 56
 
 racc_use_result_var = true
 
@@ -1131,6 +1132,7 @@ def raise_parse_error(error_message, location)
   "\"%after-reduce\"",
   "\"%after-shift-error-token\"",
   "\"%after-pop-stack\"",
+  "\"-temp-group\"",
   "\"%token\"",
   "\"%type\"",
   "\"%left\"",
@@ -1174,8 +1176,9 @@ def raise_parse_error(error_message, location)
   "symbol_declaration",
   "rule_declaration",
   "inline_declaration",
-  "generic_symbol",
-  "\"-many1@generic_symbol\"",
+  "symbol",
+  "\"-group@symbol|TAG\"",
+  "\"-many1@-group@symbol|TAG\"",
   "token_declarations",
   "symbol_declarations",
   "token_declarations_for_precedence",
@@ -1189,7 +1192,6 @@ def raise_parse_error(error_message, location)
   "\"-option@TAG\"",
   "rule_rhs",
   "empty",
-  "symbol",
   "named_ref",
   "parameterizing_suffix",
   "parameterizing_args",
@@ -1371,20 +1373,34 @@ def _reduce_25(val, _values, result)
 
 module_eval(<<'.,.,', 'parser.y', 109)
   def _reduce_27(val, _values, result)
-    result = val[1] ? val[1].unshift(val[0]) : val
+    result = val
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 109)
   def _reduce_28(val, _values, result)
+    result = val
+    result
+  end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 109)
+  def _reduce_29(val, _values, result)
+    result = val[1] ? val[1].unshift(val[0]) : val
+    result
+  end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 109)
+  def _reduce_30(val, _values, result)
     result = val[1] ? val[1].unshift(val[0]) : val
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 55)
-  def _reduce_29(val, _values, result)
+  def _reduce_31(val, _values, result)
                                @grammar.set_union(
                              Grammar::Code::NoReferenceCode.new(type: :union, token_code: val[1]),
                              val[1].line
@@ -1394,16 +1410,16 @@ def _reduce_29(val, _values, result)
   end
 .,.,
 
-# reduce 30 omitted
+# reduce 32 omitted
 
-# reduce 31 omitted
+# reduce 33 omitted
 
-# reduce 32 omitted
+# reduce 34 omitted
 
 module_eval(<<'.,.,', 'parser.y', 65)
-  def _reduce_33(val, _values, result)
+  def _reduce_35(val, _values, result)
                                @grammar.add_destructor(
-                             ident_or_tags: val[2],
+                             ident_or_tags: val[2].flatten,
                              token_code: val[1],
                              lineno: val[1].line
                            )
@@ -1413,9 +1429,9 @@ def _reduce_33(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 73)
-  def _reduce_34(val, _values, result)
+  def _reduce_36(val, _values, result)
                                @grammar.add_printer(
-                             ident_or_tags: val[2],
+                             ident_or_tags: val[2].flatten,
                              token_code: val[1],
                              lineno: val[1].line
                            )
@@ -1425,9 +1441,9 @@ def _reduce_34(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 81)
-  def _reduce_35(val, _values, result)
+  def _reduce_37(val, _values, result)
                                @grammar.add_error_token(
-                             ident_or_tags: val[2],
+                             ident_or_tags: val[2].flatten,
                              token_code: val[1],
                              lineno: val[1].line
                            )
@@ -1437,7 +1453,7 @@ def _reduce_35(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 89)
-  def _reduce_36(val, _values, result)
+  def _reduce_38(val, _values, result)
                                @grammar.after_shift = val[1]
 
     result
@@ -1445,7 +1461,7 @@ def _reduce_36(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 93)
-  def _reduce_37(val, _values, result)
+  def _reduce_39(val, _values, result)
                                @grammar.before_reduce = val[1]
 
     result
@@ -1453,7 +1469,7 @@ def _reduce_37(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 97)
-  def _reduce_38(val, _values, result)
+  def _reduce_40(val, _values, result)
                                @grammar.after_reduce = val[1]
 
     result
@@ -1461,7 +1477,7 @@ def _reduce_38(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 101)
-  def _reduce_39(val, _values, result)
+  def _reduce_41(val, _values, result)
                                @grammar.after_shift_error_token = val[1]
 
     result
@@ -1469,17 +1485,17 @@ def _reduce_39(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 105)
-  def _reduce_40(val, _values, result)
+  def _reduce_42(val, _values, result)
                                @grammar.after_pop_stack = val[1]
 
     result
   end
 .,.,
 
-# reduce 41 omitted
+# reduce 43 omitted
 
 module_eval(<<'.,.,', 'parser.y', 111)
-  def _reduce_42(val, _values, result)
+  def _reduce_44(val, _values, result)
                               val[1].each {|hash|
                             hash[:tokens].each {|id|
                               @grammar.add_type(id: id, tag: hash[:tag])
@@ -1491,7 +1507,7 @@ def _reduce_42(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 119)
-  def _reduce_43(val, _values, result)
+  def _reduce_45(val, _values, result)
                               val[1].each {|hash|
                             hash[:tokens].each {|id|
                               sym = @grammar.add_term(id: id)
@@ -1505,7 +1521,7 @@ def _reduce_43(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 129)
-  def _reduce_44(val, _values, result)
+  def _reduce_46(val, _values, result)
                               val[1].each {|hash|
                             hash[:tokens].each {|id|
                               sym = @grammar.add_term(id: id)
@@ -1519,7 +1535,7 @@ def _reduce_44(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 139)
-  def _reduce_45(val, _values, result)
+  def _reduce_47(val, _values, result)
                               val[1].each {|hash|
                             hash[:tokens].each {|id|
                               sym = @grammar.add_term(id: id)
@@ -1533,7 +1549,7 @@ def _reduce_45(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 149)
-  def _reduce_46(val, _values, result)
+  def _reduce_48(val, _values, result)
                               val[1].each {|hash|
                             hash[:tokens].each {|id|
                               sym = @grammar.add_term(id: id)
@@ -1547,21 +1563,21 @@ def _reduce_46(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 178)
-  def _reduce_47(val, _values, result)
+  def _reduce_49(val, _values, result)
     result = val[1] ? val[1].unshift(val[0]) : val
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 178)
-  def _reduce_48(val, _values, result)
+  def _reduce_50(val, _values, result)
     result = val[1] ? val[1].unshift(val[0]) : val
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 160)
-  def _reduce_49(val, _values, result)
+  def _reduce_51(val, _values, result)
                               val[0].each {|token_declaration|
                             @grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1], tag: nil, replace: true)
                           }
@@ -1571,7 +1587,7 @@ def _reduce_49(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 166)
-  def _reduce_50(val, _values, result)
+  def _reduce_52(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], tag: val[0], replace: true)
                           }
@@ -1581,7 +1597,7 @@ def _reduce_50(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 172)
-  def _reduce_51(val, _values, result)
+  def _reduce_53(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], tag: val[1], replace: true)
                           }
@@ -1590,23 +1606,23 @@ def _reduce_51(val, _values, result)
   end
 .,.,
 
-# reduce 52 omitted
+# reduce 54 omitted
 
-# reduce 53 omitted
+# reduce 55 omitted
 
 module_eval(<<'.,.,', 'parser.y', 177)
-  def _reduce_54(val, _values, result)
+  def _reduce_56(val, _values, result)
      result = val
     result
   end
 .,.,
 
-# reduce 55 omitted
+# reduce 57 omitted
 
-# reduce 56 omitted
+# reduce 58 omitted
 
 module_eval(<<'.,.,', 'parser.y', 181)
-  def _reduce_57(val, _values, result)
+  def _reduce_59(val, _values, result)
                             rule = Grammar::ParameterizingRule::Rule.new(val[1].s_value, val[3], val[7], tag: val[5])
                         @grammar.add_parameterizing_rule(rule)
 
@@ -1615,7 +1631,7 @@ def _reduce_57(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 187)
-  def _reduce_58(val, _values, result)
+  def _reduce_60(val, _values, result)
                             rule = Grammar::ParameterizingRule::Rule.new(val[2].s_value, [], val[4], is_inline: true)
                         @grammar.add_parameterizing_rule(rule)
 
@@ -1624,7 +1640,7 @@ def _reduce_58(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 192)
-  def _reduce_59(val, _values, result)
+  def _reduce_61(val, _values, result)
                             rule = Grammar::ParameterizingRule::Rule.new(val[2].s_value, val[4], val[7], is_inline: true)
                         @grammar.add_parameterizing_rule(rule)
 
@@ -1633,21 +1649,21 @@ def _reduce_59(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 196)
-  def _reduce_60(val, _values, result)
+  def _reduce_62(val, _values, result)
      result = [val[0]]
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 197)
-  def _reduce_61(val, _values, result)
+  def _reduce_63(val, _values, result)
      result = val[0].append(val[2])
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 201)
-  def _reduce_62(val, _values, result)
+  def _reduce_64(val, _values, result)
                       builder = val[0]
                   result = [builder]
 
@@ -1656,7 +1672,7 @@ def _reduce_62(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 206)
-  def _reduce_63(val, _values, result)
+  def _reduce_65(val, _values, result)
                       builder = val[2]
                   result = val[0].append(builder)
 
@@ -1664,12 +1680,12 @@ def _reduce_63(val, _values, result)
   end
 .,.,
 
-# reduce 64 omitted
+# reduce 66 omitted
 
-# reduce 65 omitted
+# reduce 67 omitted
 
 module_eval(<<'.,.,', 'parser.y', 212)
-  def _reduce_66(val, _values, result)
+  def _reduce_68(val, _values, result)
                   reset_precs
               result = Grammar::ParameterizingRule::Rhs.new
 
@@ -1678,7 +1694,7 @@ def _reduce_66(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 217)
-  def _reduce_67(val, _values, result)
+  def _reduce_69(val, _values, result)
                   token = val[1]
               token.alias_name = val[2]
               builder = val[0]
@@ -1690,7 +1706,7 @@ def _reduce_67(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 225)
-  def _reduce_68(val, _values, result)
+  def _reduce_70(val, _values, result)
                     builder = val[0]
                 builder.symbols << Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], location: @lexer.location, args: [val[1]])
                 result = builder
@@ -1700,7 +1716,7 @@ def _reduce_68(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 231)
-  def _reduce_69(val, _values, result)
+  def _reduce_71(val, _values, result)
                     builder = val[0]
                 builder.symbols << Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[3], lhs_tag: val[5])
                 result = builder
@@ -1710,7 +1726,7 @@ def _reduce_69(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 237)
-  def _reduce_70(val, _values, result)
+  def _reduce_72(val, _values, result)
                   user_code = val[1]
               user_code.alias_name = val[2]
               builder = val[0]
@@ -1722,7 +1738,7 @@ def _reduce_70(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 245)
-  def _reduce_71(val, _values, result)
+  def _reduce_73(val, _values, result)
                   sym = @grammar.find_symbol_by_id!(val[2])
               @prec_seen = true
               builder = val[0]
@@ -1733,56 +1749,56 @@ def _reduce_71(val, _values, result)
   end
 .,.,
 
-# reduce 72 omitted
+# reduce 74 omitted
 
 module_eval(<<'.,.,', 'parser.y', 253)
-  def _reduce_73(val, _values, result)
+  def _reduce_75(val, _values, result)
      result = val[0].s_value
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 260)
-  def _reduce_74(val, _values, result)
+  def _reduce_76(val, _values, result)
     result = val[1] ? val[1].unshift(val[0]) : val
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 260)
-  def _reduce_75(val, _values, result)
+  def _reduce_77(val, _values, result)
     result = val[1] ? val[1].unshift(val[0]) : val
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 255)
-  def _reduce_76(val, _values, result)
+  def _reduce_78(val, _values, result)
      result = [{tag: nil, tokens: val[0]}]
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 256)
-  def _reduce_77(val, _values, result)
+  def _reduce_79(val, _values, result)
      result = [{tag: val[0], tokens: val[1]}]
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 257)
-  def _reduce_78(val, _values, result)
+  def _reduce_80(val, _values, result)
      result = val[0].append({tag: val[1], tokens: val[2]})
     result
   end
 .,.,
 
-# reduce 79 omitted
+# reduce 81 omitted
 
-# reduce 80 omitted
+# reduce 82 omitted
 
 module_eval(<<'.,.,', 'parser.y', 263)
-  def _reduce_81(val, _values, result)
+  def _reduce_83(val, _values, result)
                    begin_c_declaration("}")
 
     result
@@ -1790,7 +1806,7 @@ def _reduce_81(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 267)
-  def _reduce_82(val, _values, result)
+  def _reduce_84(val, _values, result)
                    end_c_declaration
 
     result
@@ -1798,7 +1814,7 @@ def _reduce_82(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 271)
-  def _reduce_83(val, _values, result)
+  def _reduce_85(val, _values, result)
                    result = val[2]
 
     result
@@ -1806,64 +1822,64 @@ def _reduce_83(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 279)
-  def _reduce_84(val, _values, result)
+  def _reduce_86(val, _values, result)
     result = val[1] ? val[1].unshift(val[0]) : val
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 279)
-  def _reduce_85(val, _values, result)
+  def _reduce_87(val, _values, result)
     result = val[1] ? val[1].unshift(val[0]) : val
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 274)
-  def _reduce_86(val, _values, result)
+  def _reduce_88(val, _values, result)
      result = [{tag: nil, tokens: val[0]}]
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 275)
-  def _reduce_87(val, _values, result)
+  def _reduce_89(val, _values, result)
      result = [{tag: val[0], tokens: val[1]}]
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 276)
-  def _reduce_88(val, _values, result)
+  def _reduce_90(val, _values, result)
      result = val[0].append({tag: val[1], tokens: val[2]})
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 278)
-  def _reduce_89(val, _values, result)
+  def _reduce_91(val, _values, result)
      on_action_error("ident after %prec", val[0]) if @prec_seen
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 279)
-  def _reduce_90(val, _values, result)
+  def _reduce_92(val, _values, result)
      on_action_error("char after %prec", val[0]) if @prec_seen
     result
   end
 .,.,
 
-# reduce 91 omitted
-
-# reduce 92 omitted
-
 # reduce 93 omitted
 
 # reduce 94 omitted
 
+# reduce 95 omitted
+
+# reduce 96 omitted
+
 module_eval(<<'.,.,', 'parser.y', 287)
-  def _reduce_95(val, _values, result)
+  def _reduce_97(val, _values, result)
                  lhs = val[0]
              lhs.alias_name = val[1]
              val[3].each do |builder|
@@ -1877,7 +1893,7 @@ def _reduce_95(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 298)
-  def _reduce_96(val, _values, result)
+  def _reduce_98(val, _values, result)
                     builder = val[0]
                 if !builder.line
                   builder.line = @lexer.line - 1
@@ -1889,7 +1905,7 @@ def _reduce_96(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 306)
-  def _reduce_97(val, _values, result)
+  def _reduce_99(val, _values, result)
                     builder = val[2]
                 if !builder.line
                   builder.line = @lexer.line - 1
@@ -1901,7 +1917,7 @@ def _reduce_97(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 315)
-  def _reduce_98(val, _values, result)
+  def _reduce_100(val, _values, result)
                reset_precs
            result = @grammar.create_rule_builder(@rule_counter, @midrule_action_counter)
 
@@ -1910,7 +1926,7 @@ def _reduce_98(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 320)
-  def _reduce_99(val, _values, result)
+  def _reduce_101(val, _values, result)
                token = val[1]
            token.alias_name = val[2]
            builder = val[0]
@@ -1922,7 +1938,7 @@ def _reduce_99(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 328)
-  def _reduce_100(val, _values, result)
+  def _reduce_102(val, _values, result)
                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)
@@ -1934,7 +1950,7 @@ def _reduce_100(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 336)
-  def _reduce_101(val, _values, result)
+  def _reduce_103(val, _values, result)
                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)
@@ -1946,7 +1962,7 @@ def _reduce_101(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 344)
-  def _reduce_102(val, _values, result)
+  def _reduce_104(val, _values, result)
                user_code = val[1]
            user_code.alias_name = val[2]
            user_code.tag = val[3]
@@ -1959,7 +1975,7 @@ def _reduce_102(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 353)
-  def _reduce_103(val, _values, result)
+  def _reduce_105(val, _values, result)
                sym = @grammar.find_symbol_by_id!(val[2])
            @prec_seen = true
            builder = val[0]
@@ -1971,56 +1987,56 @@ def _reduce_103(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 360)
-  def _reduce_104(val, _values, result)
+  def _reduce_106(val, _values, result)
      result = "option"
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 361)
-  def _reduce_105(val, _values, result)
+  def _reduce_107(val, _values, result)
      result = "nonempty_list"
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 362)
-  def _reduce_106(val, _values, result)
+  def _reduce_108(val, _values, result)
      result = "list"
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 364)
-  def _reduce_107(val, _values, result)
+  def _reduce_109(val, _values, result)
      result = [val[0]]
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 365)
-  def _reduce_108(val, _values, result)
+  def _reduce_110(val, _values, result)
      result = val[0].append(val[2])
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 366)
-  def _reduce_109(val, _values, result)
+  def _reduce_111(val, _values, result)
      result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[0])]
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 367)
-  def _reduce_110(val, _values, result)
+  def _reduce_112(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', 371)
-  def _reduce_111(val, _values, result)
+  def _reduce_113(val, _values, result)
                           if @prec_seen
                         on_action_error("multiple User_code after %prec", val[0])  if @code_after_prec
                         @code_after_prec = true
@@ -2032,7 +2048,7 @@ def _reduce_111(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 379)
-  def _reduce_112(val, _values, result)
+  def _reduce_114(val, _values, result)
                           end_c_declaration
 
     result
@@ -2040,7 +2056,7 @@ def _reduce_112(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 383)
-  def _reduce_113(val, _values, result)
+  def _reduce_115(val, _values, result)
                           result = val[2]
 
     result
@@ -2048,14 +2064,14 @@ def _reduce_113(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 386)
-  def _reduce_114(val, _values, result)
+  def _reduce_116(val, _values, result)
      result = val[1].s_value
     result
   end
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 390)
-  def _reduce_115(val, _values, result)
+  def _reduce_117(val, _values, result)
                                 begin_c_declaration('\Z')
                             @grammar.epilogue_first_lineno = @lexer.line + 1
 
@@ -2064,7 +2080,7 @@ def _reduce_115(val, _values, result)
 .,.,
 
 module_eval(<<'.,.,', 'parser.y', 395)
-  def _reduce_116(val, _values, result)
+  def _reduce_118(val, _values, result)
                                 end_c_declaration
                             @grammar.epilogue = val[2].s_value
 
@@ -2072,10 +2088,6 @@ def _reduce_116(val, _values, result)
   end
 .,.,
 
-# reduce 117 omitted
-
-# reduce 118 omitted
-
 # reduce 119 omitted
 
 # reduce 120 omitted
@@ -2090,7 +2102,7 @@ def _reduce_116(val, _values, result)
 
 # reduce 125 omitted
 
-module_eval(<<'.,.,', 'parser.y', 412)
+module_eval(<<'.,.,', 'parser.y', 409)
   def _reduce_126(val, _values, result)
      result = Lrama::Lexer::Token::Ident.new(s_value: val[0])
     result
diff --git a/parser.y b/parser.y
index 52603a72..056ddbcf 100644
--- a/parser.y
+++ b/parser.y
@@ -61,26 +61,26 @@ rule
                      | symbol_declaration
                      | rule_declaration
                      | inline_declaration
-                     | "%destructor" param generic_symbol+
+                     | "%destructor" param (symbol | TAG)+
                          {
                            @grammar.add_destructor(
-                             ident_or_tags: val[2],
+                             ident_or_tags: val[2].flatten,
                              token_code: val[1],
                              lineno: val[1].line
                            )
                          }
-                     | "%printer" param generic_symbol+
+                     | "%printer" param (symbol | TAG)+
                          {
                            @grammar.add_printer(
-                             ident_or_tags: val[2],
+                             ident_or_tags: val[2].flatten,
                              token_code: val[1],
                              lineno: val[1].line
                            )
                          }
-                     | "%error-token" param generic_symbol+
+                     | "%error-token" param (symbol | TAG)+
                          {
                            @grammar.add_error_token(
-                             ident_or_tags: val[2],
+                             ident_or_tags: val[2].flatten,
                              token_code: val[1],
                              lineno: val[1].line
                            )
@@ -404,9 +404,6 @@ rule
        | STRING
        | "{...}"
 
-  generic_symbol: symbol
-                | TAG
-
   empty: /* empty */
        | "%empty"
 
diff --git a/spec/fixtures/context/basic.y b/spec/fixtures/context/basic.y
index 7f41210b..31f5f701 100644
--- a/spec/fixtures/context/basic.y
+++ b/spec/fixtures/context/basic.y
@@ -18,6 +18,13 @@
 %printer {
     print_token();
 } tNUMBER tSTRING
+%destructor {
+    printf("destructor for i: %d\n", $$);
+    printf("line for i: %d\n", __LINE__);
+} <i>
+%error-token {
+    $$ = 100;
+} tNUMBER
 
 %lex-param {struct lex_params *p}
 %parse-param {struct parse_params *p}
diff --git a/spec/lrama/context_spec.rb b/spec/lrama/context_spec.rb
index 6d2b6245..027d204c 100644
--- a/spec/lrama/context_spec.rb
+++ b/spec/lrama/context_spec.rb
@@ -98,8 +98,8 @@
       expect(context.yytname[context.yytranslate[11]]).to eq("\"escaped vertical tab\"")
       expect(context.yytname[context.yytranslate[258]]).to eq("keyword_class")
       expect(context.yyrline).to eq([
-         0,    57,    57,    58,    59,    62,    64,    64,    67,    70,
-        71,    74,    77,    80
+         0,    64,    64,    65,    66,    69,    71,    71,    74,    77,
+        78,    81,    84,    87
       ])
       expect(context.yytname).to eq([
         "\"EOI\"", "error", "\"invalid token\"", "\"backslash\"",