Trivial cleanup
[babeltrace.git] / formats / ctf / metadata / ctf-parser.y
index fcc877ba7abacea65ef199f16b593a85bd119ec9..f394fda2702cd398506c0091f9922d5af975ad30 100644 (file)
@@ -52,7 +52,7 @@ _cds_list_splice_tail (struct cds_list_head *add, struct cds_list_head *head)
 int yyparse(struct ctf_scanner *scanner);
 int yylex(union YYSTYPE *yyval, struct ctf_scanner *scanner);
 int yylex_init_extra(struct ctf_scanner *scanner, yyscan_t * ptr_yy_globals);
-int yylex_destroy(yyscan_t yyscanner) ;
+int yylex_destroy(yyscan_t yyscanner);
 void yyset_in(FILE * in_str, yyscan_t scanner);
 
 int yydebug;
@@ -839,6 +839,15 @@ void ctf_scanner_free(struct ctf_scanner *scanner)
        /* %locations */
 %parse-param {struct ctf_scanner *scanner}
 %lex-param {struct ctf_scanner *scanner}
+/*
+ * Expect two shift-reduce conflicts. Caused by enum name-opt : type {}
+ * vs struct { int :value; } (unnamed bit-field). The default is to
+ * shift, so whenever we encounter an enumeration, we are doing the
+ * proper thing (shift). It is illegal to declare an enumeration
+ * "bit-field", so it is OK if this situation ends up in a parsing
+ * error.
+ */
+%expect 2
 %start file
 %token CHARACTER_CONSTANT_START SQUOTE STRING_LITERAL_START DQUOTE ESCSEQ CHAR_STRING_TOKEN LSBRAC RSBRAC LPAREN RPAREN LBRAC RBRAC RARROW STAR PLUS MINUS LT GT TYPEASSIGN COLON SEMICOLON DOTDOTDOT DOT EQUAL COMMA CONST CHAR DOUBLE ENUM EVENT FLOATING_POINT FLOAT INTEGER INT LONG SHORT SIGNED STREAM STRING STRUCT TRACE TYPEALIAS TYPEDEF UNSIGNED VARIANT VOID _BOOL _COMPLEX _IMAGINARY DECIMAL_CONSTANT OCTAL_CONSTANT HEXADECIMAL_CONSTANT
 %token <gs> IDENTIFIER ID_TYPE
@@ -860,10 +869,12 @@ void ctf_scanner_free(struct ctf_scanner *scanner)
 %type <n> event_declaration
 %type <n> stream_declaration
 %type <n> trace_declaration
+%type <n> integer_declaration_specifiers
 %type <n> declaration_specifiers
 %type <n> alias_declaration_specifiers
 
 %type <n> type_declarator_list
+%type <n> integer_type_specifier
 %type <n> type_specifier
 %type <n> struct_type_specifier
 %type <n> variant_type_specifier
@@ -1010,7 +1021,6 @@ postfix_expression:
                        $$->u.unary_expression.type = UNARY_STRING;
                        $$->u.unary_expression.u.string = yylval.gs->s;
                }
-
        |       DECIMAL_CONSTANT
                {
                        $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
@@ -1178,7 +1188,7 @@ declaration:
                        _cds_list_splice_tail(&($1)->u.type_specifier_list.head, &list->u.type_specifier_list.head);
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._typedef.type_declarators);
                }
-       |       TYPEALIAS declaration_specifiers abstract_declarator_list COLON alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
+       |       TYPEALIAS declaration_specifiers abstract_declarator_list TYPEASSIGN alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
                {
                        struct ctf_node *list;
 
@@ -1269,6 +1279,40 @@ trace_declaration_end:
                {       pop_scope(scanner);     }
        ;
 
+integer_declaration_specifiers:
+               CONST
+               {
+                       struct ctf_node *node;
+
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
+                       node = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       node->u.type_specifier.type = TYPESPEC_CONST;
+                       cds_list_add_tail(&node->siblings, &($$)->u.type_specifier_list.head);
+               }
+       |       integer_type_specifier
+               {
+                       struct ctf_node *node;
+
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
+                       node = $1;
+                       cds_list_add_tail(&node->siblings, &($$)->u.type_specifier_list.head);
+               }
+       |       integer_declaration_specifiers CONST
+               {
+                       struct ctf_node *node;
+
+                       $$ = $1;
+                       node = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       node->u.type_specifier.type = TYPESPEC_CONST;
+                       cds_list_add_tail(&node->siblings, &($$)->u.type_specifier_list.head);
+               }
+       |       integer_declaration_specifiers integer_type_specifier
+               {
+                       $$ = $1;
+                       cds_list_add_tail(&($2)->siblings, &($$)->u.type_specifier_list.head);
+               }
+       ;
+
 declaration_specifiers:
                CONST
                {
@@ -1313,6 +1357,64 @@ type_declarator_list:
                }
        ;
 
+integer_type_specifier:
+               CHAR
+               {
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       $$->u.type_specifier.type = TYPESPEC_CHAR;
+               }
+       |       SHORT
+               {
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       $$->u.type_specifier.type = TYPESPEC_SHORT;
+               }
+       |       INT
+               {
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       $$->u.type_specifier.type = TYPESPEC_INT;
+               }
+       |       LONG
+               {
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       $$->u.type_specifier.type = TYPESPEC_LONG;
+               }
+       |       SIGNED
+               {
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       $$->u.type_specifier.type = TYPESPEC_SIGNED;
+               }
+       |       UNSIGNED
+               {
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       $$->u.type_specifier.type = TYPESPEC_UNSIGNED;
+               }
+       |       _BOOL
+               {
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       $$->u.type_specifier.type = TYPESPEC_BOOL;
+               }
+       |       ID_TYPE
+               {
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       $$->u.type_specifier.type = TYPESPEC_ID_TYPE;
+                       $$->u.type_specifier.id_type = yylval.gs->s;
+               }
+       |       INTEGER LBRAC RBRAC
+               {
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       $$->u.type_specifier.type = TYPESPEC_INTEGER;
+                       $$->u.type_specifier.node = make_node(scanner, NODE_INTEGER);
+               }
+       |       INTEGER LBRAC ctf_assignment_expression_list RBRAC
+               {
+                       $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+                       $$->u.type_specifier.type = TYPESPEC_INTEGER;
+                       $$->u.type_specifier.node = make_node(scanner, NODE_INTEGER);
+                       if (set_parent_node($3, $$->u.type_specifier.node))
+                               reparent_error(scanner, "integer reparent error");
+               }
+       ;
+
 type_specifier:
                VOID
                {
@@ -1433,14 +1535,12 @@ type_specifier:
                        $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
                        $$->u.type_specifier.type = TYPESPEC_VARIANT;
                        $$->u.type_specifier.node = $2;
-                       $$ = $2;
                }
        |       STRUCT struct_type_specifier
                {
                        $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
                        $$->u.type_specifier.type = TYPESPEC_STRUCT;
                        $$->u.type_specifier.node = $2;
-                       $$ = $2;
                }
        ;
 
@@ -1449,7 +1549,7 @@ struct_type_specifier:
                {
                        $$ = make_node(scanner, NODE_STRUCT);
                        $$->u._struct.has_body = 1;
-                       if (set_parent_node($2, $$))
+                       if ($2 && set_parent_node($2, $$))
                                reparent_error(scanner, "struct reparent error");
                }
        |       IDENTIFIER struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
@@ -1457,7 +1557,7 @@ struct_type_specifier:
                        $$ = make_node(scanner, NODE_STRUCT);
                        $$->u._struct.has_body = 1;
                        $$->u._struct.name = $1->s;
-                       if (set_parent_node($3, $$))
+                       if ($3 && set_parent_node($3, $$))
                                reparent_error(scanner, "struct reparent error");
                }
        |       ID_TYPE struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
@@ -1465,7 +1565,7 @@ struct_type_specifier:
                        $$ = make_node(scanner, NODE_STRUCT);
                        $$->u._struct.has_body = 1;
                        $$->u._struct.name = $1->s;
-                       if (set_parent_node($3, $$))
+                       if ($3 && set_parent_node($3, $$))
                                reparent_error(scanner, "struct reparent error");
                }
        |       IDENTIFIER
@@ -1497,7 +1597,7 @@ variant_type_specifier:
                {
                        $$ = make_node(scanner, NODE_VARIANT);
                        $$->u.variant.has_body = 1;
-                       if (set_parent_node($2, $$))
+                       if ($2 && set_parent_node($2, $$))
                                reparent_error(scanner, "variant reparent error");
                }
        |       LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
@@ -1505,7 +1605,7 @@ variant_type_specifier:
                        $$ = make_node(scanner, NODE_VARIANT);
                        $$->u.variant.has_body = 1;
                        $$->u.variant.choice = $2->s;
-                       if (set_parent_node($5, $$))
+                       if ($5 && set_parent_node($5, $$))
                                reparent_error(scanner, "variant reparent error");
                }
        |       LT ID_TYPE GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
@@ -1513,7 +1613,7 @@ variant_type_specifier:
                        $$ = make_node(scanner, NODE_VARIANT);
                        $$->u.variant.has_body = 1;
                        $$->u.variant.choice = $2->s;
-                       if (set_parent_node($5, $$))
+                       if ($5 && set_parent_node($5, $$))
                                reparent_error(scanner, "variant reparent error");
                }
        |       IDENTIFIER variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
@@ -1521,7 +1621,7 @@ variant_type_specifier:
                        $$ = make_node(scanner, NODE_VARIANT);
                        $$->u.variant.has_body = 1;
                        $$->u.variant.name = $1->s;
-                       if (set_parent_node($3, $$))
+                       if ($3 && set_parent_node($3, $$))
                                reparent_error(scanner, "variant reparent error");
                }
        |       IDENTIFIER LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
@@ -1530,7 +1630,7 @@ variant_type_specifier:
                        $$->u.variant.has_body = 1;
                        $$->u.variant.name = $1->s;
                        $$->u.variant.choice = $3->s;
-                       if (set_parent_node($6, $$))
+                       if ($6 && set_parent_node($6, $$))
                                reparent_error(scanner, "variant reparent error");
                }
        |       IDENTIFIER LT IDENTIFIER GT
@@ -1546,7 +1646,7 @@ variant_type_specifier:
                        $$->u.variant.has_body = 1;
                        $$->u.variant.name = $1->s;
                        $$->u.variant.choice = $3->s;
-                       if (set_parent_node($6, $$))
+                       if ($6 && set_parent_node($6, $$))
                                reparent_error(scanner, "variant reparent error");
                }
        |       IDENTIFIER LT ID_TYPE GT
@@ -1561,7 +1661,7 @@ variant_type_specifier:
                        $$ = make_node(scanner, NODE_VARIANT);
                        $$->u.variant.has_body = 1;
                        $$->u.variant.name = $1->s;
-                       if (set_parent_node($3, $$))
+                       if ($3 && set_parent_node($3, $$))
                                reparent_error(scanner, "variant reparent error");
                }
        |       ID_TYPE LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
@@ -1570,7 +1670,7 @@ variant_type_specifier:
                        $$->u.variant.has_body = 1;
                        $$->u.variant.name = $1->s;
                        $$->u.variant.choice = $3->s;
-                       if (set_parent_node($6, $$))
+                       if ($6 && set_parent_node($6, $$))
                                reparent_error(scanner, "variant reparent error");
                }
        |       ID_TYPE LT IDENTIFIER GT
@@ -1586,7 +1686,7 @@ variant_type_specifier:
                        $$->u.variant.has_body = 1;
                        $$->u.variant.name = $1->s;
                        $$->u.variant.choice = $3->s;
-                       if (set_parent_node($6, $$))
+                       if ($6 && set_parent_node($6, $$))
                                reparent_error(scanner, "variant reparent error");
                }
        |       ID_TYPE LT ID_TYPE GT
@@ -1641,12 +1741,12 @@ enum_type_specifier:
                        $$->u._enum.has_body = 1;
                        _cds_list_splice_tail(&($2)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       LT declaration_specifiers GT LBRAC enumerator_list RBRAC
+       |       COLON integer_declaration_specifiers LBRAC enumerator_list RBRAC
                {
                        $$ = make_node(scanner, NODE_ENUM);
                        $$->u._enum.has_body = 1;
                        ($$)->u._enum.container_type = $2;
-                       _cds_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
+                       _cds_list_splice_tail(&($4)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       IDENTIFIER LBRAC enumerator_list RBRAC
                {
@@ -1655,13 +1755,13 @@ enum_type_specifier:
                        $$->u._enum.enum_id = $1->s;
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       IDENTIFIER LT declaration_specifiers GT LBRAC enumerator_list RBRAC
+       |       IDENTIFIER COLON integer_declaration_specifiers 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(&($6)->tmp_head, &($$)->u._enum.enumerator_list);
+                       _cds_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       ID_TYPE LBRAC enumerator_list RBRAC
                {
@@ -1670,13 +1770,13 @@ enum_type_specifier:
                        $$->u._enum.enum_id = $1->s;
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       ID_TYPE LT declaration_specifiers GT LBRAC enumerator_list RBRAC
+       |       ID_TYPE COLON integer_declaration_specifiers 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(&($6)->tmp_head, &($$)->u._enum.enumerator_list);
+                       _cds_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       LBRAC enumerator_list COMMA RBRAC
                {
@@ -1684,12 +1784,12 @@ enum_type_specifier:
                        $$->u._enum.has_body = 1;
                        _cds_list_splice_tail(&($2)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       LT declaration_specifiers GT LBRAC enumerator_list COMMA RBRAC
+       |       COLON integer_declaration_specifiers LBRAC enumerator_list COMMA RBRAC
                {
                        $$ = make_node(scanner, NODE_ENUM);
                        $$->u._enum.has_body = 1;
                        ($$)->u._enum.container_type = $2;
-                       _cds_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
+                       _cds_list_splice_tail(&($4)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       IDENTIFIER LBRAC enumerator_list COMMA RBRAC
                {
@@ -1698,13 +1798,13 @@ enum_type_specifier:
                        $$->u._enum.enum_id = $1->s;
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       IDENTIFIER LT declaration_specifiers GT LBRAC enumerator_list COMMA RBRAC
+       |       IDENTIFIER COLON integer_declaration_specifiers 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(&($6)->tmp_head, &($$)->u._enum.enumerator_list);
+                       _cds_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       IDENTIFIER
                {
@@ -1712,13 +1812,6 @@ enum_type_specifier:
                        $$->u._enum.has_body = 0;
                        $$->u._enum.enum_id = $1->s;
                }
-       |       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;
-               }
        |       ID_TYPE LBRAC enumerator_list COMMA RBRAC
                {
                        $$ = make_node(scanner, NODE_ENUM);
@@ -1726,13 +1819,13 @@ enum_type_specifier:
                        $$->u._enum.enum_id = $1->s;
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
                }
-       |       ID_TYPE LT declaration_specifiers GT LBRAC enumerator_list COMMA RBRAC
+       |       ID_TYPE COLON integer_declaration_specifiers 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(&($6)->tmp_head, &($$)->u._enum.enumerator_list);
+                       _cds_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
                }
        |       ID_TYPE
                {
@@ -1740,13 +1833,6 @@ enum_type_specifier:
                        $$->u._enum.has_body = 0;
                        $$->u._enum.enum_id = $1->s;
                }
-       |       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;
-               }
        ;
 
 struct_or_variant_declaration_list:
@@ -1806,7 +1892,7 @@ struct_or_variant_declaration:
                        ($$)->u.struct_or_variant_declaration.type_specifier_list = list;
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._typedef.type_declarators);
                }
-       |       TYPEALIAS declaration_specifiers abstract_declarator_list COLON alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
+       |       TYPEALIAS declaration_specifiers abstract_declarator_list TYPEASSIGN alias_declaration_specifiers alias_abstract_declarator_list SEMICOLON
                {
                        struct ctf_node *list;
 
@@ -2191,9 +2277,8 @@ ctf_assignment_expression:
                                reparent_error(scanner, "ctf_assignment_expression left expects string");
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u.ctf_expression.right);
                }
-       |       unary_expression TYPEASSIGN type_specifier      /* Only allow struct */
+       |       unary_expression TYPEASSIGN declaration_specifiers      /* Only allow struct */
                {
-                       struct ctf_node *list;
                        /*
                         * Because we have left and right, cannot use
                         * set_parent_node.
@@ -2202,9 +2287,7 @@ ctf_assignment_expression:
                        _cds_list_splice_tail(&($1)->tmp_head, &($$)->u.ctf_expression.left);
                        if ($1->u.unary_expression.type != UNARY_STRING)
                                reparent_error(scanner, "ctf_assignment_expression left expects string");
-                       list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
-                       cds_list_add_tail(&($3)->siblings, &list->u.type_specifier_list.head);
-                       cds_list_add_tail(&list->siblings, &($$)->u.ctf_expression.right);
+                       cds_list_add_tail(&($3)->siblings, &($$)->u.ctf_expression.right);
                }
        |       declaration_specifiers TYPEDEF declaration_specifiers type_declarator_list
                {
@@ -2237,7 +2320,7 @@ ctf_assignment_expression:
                        ($$)->u.struct_or_variant_declaration.type_specifier_list = list;
                        _cds_list_splice_tail(&($3)->tmp_head, &($$)->u._typedef.type_declarators);
                }
-       |       TYPEALIAS declaration_specifiers abstract_declarator_list COLON alias_declaration_specifiers alias_abstract_declarator_list
+       |       TYPEALIAS declaration_specifiers abstract_declarator_list TYPEASSIGN alias_declaration_specifiers alias_abstract_declarator_list
                {
                        struct ctf_node *list;
 
This page took 0.029862 seconds and 4 git commands to generate.