Remove enum < integer_constant > from grammar
[babeltrace.git] / formats / ctf / metadata / ctf-parser.y
index 07d9873838b62bd18459f67488ac86ded9b08838..66e37923c9315dd482c577912f3f62a75fa5431a 100644 (file)
@@ -292,6 +292,7 @@ static struct ctf_node *make_node(struct ctf_scanner *scanner,
                CDS_INIT_LIST_HEAD(&node->u.enumerator.values);
                break;
        case NODE_ENUM:
+               CDS_INIT_LIST_HEAD(&node->u._enum.container_type);
                CDS_INIT_LIST_HEAD(&node->u._enum.enumerator_list);
                break;
        case NODE_STRUCT_OR_VARIANT_DECLARATION:
@@ -493,10 +494,11 @@ static int reparent_type_specifier(struct ctf_node *node,
                break;
        case NODE_TYPE_DECLARATOR:
                parent->u.type_declarator.type = TYPEDEC_NESTED;
-               parent->u.type_declarator.u.nested.length = node;
+               CDS_INIT_LIST_HEAD(&parent->u.type_declarator.u.nested.length);
+               _cds_list_splice_tail(&node->tmp_head, &parent->u.type_declarator.u.nested.length);
                break;
        case NODE_ENUM:
-               parent->u._enum.container_type = node;
+               _cds_list_splice_tail(&node->tmp_head, &parent->u._enum.container_type);
                break;
        case NODE_STRUCT_OR_VARIANT_DECLARATION:
                _cds_list_splice_tail(&node->tmp_head, &parent->u.struct_or_variant_declaration.declaration_specifier);
@@ -814,11 +816,10 @@ void ctf_scanner_free(struct ctf_scanner *scanner)
 %type <n> alias_declaration_specifiers
 
 %type <n> type_declarator_list
-%type <n> abstract_type_declarator_list
 %type <n> type_specifier
 %type <n> struct_type_specifier
 %type <n> variant_type_specifier
-%type <n> type_specifier_or_integer_constant
+%type <n> declaration_specifiers_or_integer_constant
 %type <n> enum_type_specifier
 %type <n> struct_or_variant_declaration_list
 %type <n> struct_or_variant_declaration
@@ -829,12 +830,13 @@ void ctf_scanner_free(struct ctf_scanner *scanner)
 %type <n> abstract_declarator_list
 %type <n> abstract_declarator
 %type <n> direct_abstract_declarator
+%type <n> alias_abstract_declarator_list
+%type <n> alias_abstract_declarator
+%type <n> direct_alias_abstract_declarator
 %type <n> declarator
 %type <n> direct_declarator
 %type <n> type_declarator
 %type <n> direct_type_declarator
-%type <n> abstract_type_declarator
-%type <n> direct_abstract_type_declarator
 %type <n> pointer      
 %type <n> ctf_assignment_expression_list
 %type <n> ctf_assignment_expression
@@ -1116,7 +1118,7 @@ declaration:
                        _cds_list_splice_tail(&($1)->tmp_head, &($$)->u._typedef.declaration_specifier);
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._typedef.type_declarators);
                }
-       |       TYPEALIAS declaration_specifiers abstract_declarator_list COLON alias_declaration_specifiers abstract_type_declarator_list SEMICOLON
+       |       TYPEALIAS declaration_specifiers abstract_declarator_list COLON alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
                {
                        $$ = make_node(scanner, NODE_TYPEALIAS);
                        $$->u.typealias.target = make_node(scanner, NODE_TYPEALIAS_TARGET);
@@ -1233,16 +1235,6 @@ type_declarator_list:
                }
        ;
 
-abstract_type_declarator_list:
-               abstract_type_declarator
-               {       $$ = $1;        }
-       |       abstract_type_declarator_list COMMA abstract_type_declarator
-               {
-                       $$ = $1;
-                       cds_list_add_tail(&($3)->siblings, &($$)->tmp_head);
-               }
-       ;
-
 type_specifier:
                VOID
                {
@@ -1512,7 +1504,7 @@ variant_declaration_end:
                {       pop_scope(scanner);     }
        ;
 
-type_specifier_or_integer_constant:
+declaration_specifiers_or_integer_constant:
                declaration_specifiers
                {       $$ = $1;                }
        |       DECIMAL_CONSTANT
@@ -1545,11 +1537,11 @@ enum_type_specifier:
                        $$->u._enum.has_body = 1;
                        _cds_list_splice_tail(&($2)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       LT type_specifier_or_integer_constant GT LBRAC enumerator_list RBRAC
+       |       LT declaration_specifiers GT LBRAC enumerator_list RBRAC
                {
                        $$ = make_node(scanner, NODE_ENUM);
                        $$->u._enum.has_body = 1;
-                       $$->u._enum.container_type = $2;
+                       _cds_list_splice_tail(&($2)->tmp_head, &($$)->u._enum.container_type);
                        _cds_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       IDENTIFIER LBRAC enumerator_list RBRAC
@@ -1559,12 +1551,12 @@ enum_type_specifier:
                        $$->u._enum.enum_id = $1->s;
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       IDENTIFIER LT type_specifier_or_integer_constant GT LBRAC enumerator_list RBRAC
+       |       IDENTIFIER LT declaration_specifiers GT LBRAC enumerator_list RBRAC
                {
                        $$ = make_node(scanner, NODE_ENUM);
                        $$->u._enum.has_body = 1;
                        $$->u._enum.enum_id = $1->s;
-                       $$->u._enum.container_type = $3;
+                       _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.container_type);
                        _cds_list_splice_tail(&($6)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       ID_TYPE LBRAC enumerator_list RBRAC
@@ -1574,12 +1566,12 @@ enum_type_specifier:
                        $$->u._enum.enum_id = $1->s;
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       ID_TYPE LT type_specifier_or_integer_constant GT LBRAC enumerator_list RBRAC
+       |       ID_TYPE LT declaration_specifiers GT LBRAC enumerator_list RBRAC
                {
                        $$ = make_node(scanner, NODE_ENUM);
                        $$->u._enum.has_body = 1;
                        $$->u._enum.enum_id = $1->s;
-                       $$->u._enum.container_type = $3;
+                       _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.container_type);
                        _cds_list_splice_tail(&($6)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       LBRAC enumerator_list COMMA RBRAC
@@ -1588,11 +1580,11 @@ enum_type_specifier:
                        $$->u._enum.has_body = 1;
                        _cds_list_splice_tail(&($2)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       LT type_specifier_or_integer_constant GT LBRAC enumerator_list COMMA RBRAC
+       |       LT declaration_specifiers GT LBRAC enumerator_list COMMA RBRAC
                {
                        $$ = make_node(scanner, NODE_ENUM);
                        $$->u._enum.has_body = 1;
-                       $$->u._enum.container_type = $2;
+                       _cds_list_splice_tail(&($2)->tmp_head, &($$)->u._enum.container_type);
                        _cds_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       IDENTIFIER LBRAC enumerator_list COMMA RBRAC
@@ -1602,12 +1594,12 @@ enum_type_specifier:
                        $$->u._enum.enum_id = $1->s;
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       IDENTIFIER LT type_specifier_or_integer_constant GT LBRAC enumerator_list COMMA RBRAC
+       |       IDENTIFIER LT declaration_specifiers GT LBRAC enumerator_list COMMA RBRAC
                {
                        $$ = make_node(scanner, NODE_ENUM);
                        $$->u._enum.has_body = 1;
                        $$->u._enum.enum_id = $1->s;
-                       $$->u._enum.container_type = $3;
+                       _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.container_type);
                        _cds_list_splice_tail(&($6)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       IDENTIFIER
@@ -1616,12 +1608,12 @@ enum_type_specifier:
                        $$->u._enum.has_body = 0;
                        $$->u._enum.enum_id = $1->s;
                }
-       |       IDENTIFIER LT type_specifier_or_integer_constant GT
+       |       IDENTIFIER LT declaration_specifiers GT
                {
                        $$ = make_node(scanner, NODE_ENUM);
                        $$->u._enum.has_body = 0;
                        $$->u._enum.enum_id = $1->s;
-                       $$->u._enum.container_type = $3;
+                       _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.container_type);
                }
        |       ID_TYPE LBRAC enumerator_list COMMA RBRAC
                {
@@ -1630,12 +1622,12 @@ enum_type_specifier:
                        $$->u._enum.enum_id = $1->s;
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       ID_TYPE LT type_specifier_or_integer_constant GT LBRAC enumerator_list COMMA RBRAC
+       |       ID_TYPE LT declaration_specifiers GT LBRAC enumerator_list COMMA RBRAC
                {
                        $$ = make_node(scanner, NODE_ENUM);
                        $$->u._enum.has_body = 1;
                        $$->u._enum.enum_id = $1->s;
-                       $$->u._enum.container_type = $3;
+                       _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.container_type);
                        _cds_list_splice_tail(&($6)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       ID_TYPE
@@ -1644,12 +1636,12 @@ enum_type_specifier:
                        $$->u._enum.has_body = 0;
                        $$->u._enum.enum_id = $1->s;
                }
-       |       ID_TYPE LT type_specifier_or_integer_constant GT
+       |       ID_TYPE LT declaration_specifiers GT
                {
                        $$ = make_node(scanner, NODE_ENUM);
                        $$->u._enum.has_body = 0;
                        $$->u._enum.enum_id = $1->s;
-                       $$->u._enum.container_type = $3;
+                       _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.container_type);
                }
        ;
 
@@ -1694,7 +1686,7 @@ struct_or_variant_declaration:
                        _cds_list_splice_tail(&($1)->tmp_head, &($$)->u._typedef.declaration_specifier);
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._typedef.type_declarators);
                }
-       |       TYPEALIAS declaration_specifiers abstract_declarator_list COLON alias_declaration_specifiers abstract_type_declarator_list SEMICOLON
+       |       TYPEALIAS declaration_specifiers abstract_declarator_list COLON alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
                {
                        $$ = make_node(scanner, NODE_TYPEALIAS);
                        $$->u.typealias.target = make_node(scanner, NODE_TYPEALIAS_TARGET);
@@ -1878,12 +1870,13 @@ direct_abstract_declarator:
                        $$->u.type_declarator.type = TYPEDEC_NESTED;
                        $$->u.type_declarator.u.nested.type_declarator = $2;
                }
-       |       direct_abstract_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
+       |       direct_abstract_declarator LSBRAC declaration_specifiers_or_integer_constant RSBRAC
                {
                        $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
                        $$->u.type_declarator.type = TYPEDEC_NESTED;
                        $$->u.type_declarator.u.nested.type_declarator = $1;
-                       $$->u.type_declarator.u.nested.length = $3;
+                       CDS_INIT_LIST_HEAD(&($$)->u.type_declarator.u.nested.length);
+                       _cds_list_splice_tail(&($3)->tmp_head, &($$)->u.type_declarator.u.nested.length);
                }
        |       direct_abstract_declarator LSBRAC RSBRAC
                {
@@ -1894,114 +1887,120 @@ direct_abstract_declarator:
                }
        ;
 
-declarator:
-               direct_declarator
+alias_abstract_declarator_list:
+               alias_abstract_declarator
                {       $$ = $1;        }
-       |       pointer direct_declarator
+       |       alias_abstract_declarator_list COMMA alias_abstract_declarator
+               {
+                       $$ = $1;
+                       cds_list_add_tail(&($3)->siblings, &($$)->tmp_head);
+               }
+       ;
+
+alias_abstract_declarator:
+               direct_alias_abstract_declarator
+               {       $$ = $1;        }
+       |       pointer direct_alias_abstract_declarator
                {
                        $$ = $2;
                        cds_list_splice(&($1)->tmp_head, &($$)->u.type_declarator.pointers);
                }
        ;
 
-direct_declarator:
-               IDENTIFIER
+direct_alias_abstract_declarator:
+               /* empty */
                {
                        $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
-                       $$->u.type_declarator.type = TYPEDEC_ID;
-                       $$->u.type_declarator.u.id = $1->s;
+                        $$->u.type_declarator.type = TYPEDEC_ID;
+                       /* id is NULL */
                }
-       |       LPAREN declarator RPAREN
+       |       LPAREN alias_abstract_declarator RPAREN
                {
                        $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
                        $$->u.type_declarator.type = TYPEDEC_NESTED;
                        $$->u.type_declarator.u.nested.type_declarator = $2;
                }
-       |       direct_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
+       |       direct_alias_abstract_declarator LSBRAC declaration_specifiers_or_integer_constant RSBRAC
                {
                        $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
                        $$->u.type_declarator.type = TYPEDEC_NESTED;
                        $$->u.type_declarator.u.nested.type_declarator = $1;
-                       $$->u.type_declarator.u.nested.length = $3;
+                       CDS_INIT_LIST_HEAD(&($$)->u.type_declarator.u.nested.length);
+                       _cds_list_splice_tail(&($3)->tmp_head, &($$)->u.type_declarator.u.nested.length);
+               }
+       |       direct_alias_abstract_declarator LSBRAC RSBRAC
+               {
+                       $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
+                       $$->u.type_declarator.type = TYPEDEC_NESTED;
+                       $$->u.type_declarator.u.nested.type_declarator = $1;
+                       $$->u.type_declarator.u.nested.abstract_array = 1;
                }
        ;
 
-type_declarator:
-               direct_type_declarator
+declarator:
+               direct_declarator
                {       $$ = $1;        }
-       |       pointer direct_type_declarator
+       |       pointer direct_declarator
                {
                        $$ = $2;
                        cds_list_splice(&($1)->tmp_head, &($$)->u.type_declarator.pointers);
                }
        ;
 
-direct_type_declarator:
+direct_declarator:
                IDENTIFIER
                {
-                       add_type(scanner, $1);
                        $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
                        $$->u.type_declarator.type = TYPEDEC_ID;
                        $$->u.type_declarator.u.id = $1->s;
                }
-       |       LPAREN type_declarator RPAREN
+       |       LPAREN declarator RPAREN
                {
                        $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
                        $$->u.type_declarator.type = TYPEDEC_NESTED;
                        $$->u.type_declarator.u.nested.type_declarator = $2;
                }
-       |       direct_type_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
+       |       direct_declarator LSBRAC declaration_specifiers_or_integer_constant RSBRAC
                {
                        $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
                        $$->u.type_declarator.type = TYPEDEC_NESTED;
                        $$->u.type_declarator.u.nested.type_declarator = $1;
-                       $$->u.type_declarator.u.nested.length = $3;
+                       CDS_INIT_LIST_HEAD(&($$)->u.type_declarator.u.nested.length);
+                       _cds_list_splice_tail(&($3)->tmp_head, &($$)->u.type_declarator.u.nested.length);
                }
        ;
 
-abstract_type_declarator:
-               direct_abstract_type_declarator
+type_declarator:
+               direct_type_declarator
                {       $$ = $1;        }
-       |       pointer direct_abstract_type_declarator
+       |       pointer direct_type_declarator
                {
                        $$ = $2;
                        cds_list_splice(&($1)->tmp_head, &($$)->u.type_declarator.pointers);
                }
        ;
 
-direct_abstract_type_declarator:
-               /* empty */
-               {
-                       $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
-                        $$->u.type_declarator.type = TYPEDEC_ID;
-                       /* id is NULL */
-               }
-       |       IDENTIFIER
+direct_type_declarator:
+               IDENTIFIER
                {
                        add_type(scanner, $1);
                        $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
                        $$->u.type_declarator.type = TYPEDEC_ID;
                        $$->u.type_declarator.u.id = $1->s;
                }
-       |       LPAREN abstract_type_declarator RPAREN
+       |       LPAREN type_declarator RPAREN
                {
                        $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
                        $$->u.type_declarator.type = TYPEDEC_NESTED;
                        $$->u.type_declarator.u.nested.type_declarator = $2;
                }
-       |       direct_abstract_type_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
+       |       direct_type_declarator LSBRAC declaration_specifiers_or_integer_constant RSBRAC
                {
                        $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
                        $$->u.type_declarator.type = TYPEDEC_NESTED;
                        $$->u.type_declarator.u.nested.type_declarator = $1;
-                       $$->u.type_declarator.u.nested.length = $3;
-               }
-       |       direct_abstract_type_declarator LSBRAC RSBRAC
-               {
-                       $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
-                       $$->u.type_declarator.type = TYPEDEC_NESTED;
-                       $$->u.type_declarator.u.nested.type_declarator = $1;
-                       $$->u.type_declarator.u.nested.abstract_array = 1;
+                       CDS_INIT_LIST_HEAD(&($$)->u.type_declarator.u.nested.length);
+                       _cds_list_splice_tail(&($3)->tmp_head, &($$)->u.type_declarator.u.nested.length);
                }
        ;
 
@@ -2086,7 +2085,7 @@ ctf_assignment_expression:
                        _cds_list_splice_tail(&($1)->tmp_head, &($$)->u._typedef.declaration_specifier);
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._typedef.type_declarators);
                }
-       |       TYPEALIAS declaration_specifiers abstract_declarator_list COLON alias_declaration_specifiers abstract_type_declarator_list
+       |       TYPEALIAS declaration_specifiers abstract_declarator_list COLON alias_declaration_specifiers alias_abstract_declarator_list
                {
                        $$ = make_node(scanner, NODE_TYPEALIAS);
                        $$->u.typealias.target = make_node(scanner, NODE_TYPEALIAS_TARGET);
This page took 0.030039 seconds and 4 git commands to generate.