X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-parser.y;h=66e37923c9315dd482c577912f3f62a75fa5431a;hp=f6c6185957d52c1a632f751301e5e889091f8171;hb=2b0a0f95394186acf18c453209e31b028312ecf3;hpb=1ee8e81dbe8f14831974e32cef7d5f116d17a73d diff --git a/formats/ctf/metadata/ctf-parser.y b/formats/ctf/metadata/ctf-parser.y index f6c61859..66e37923 100644 --- a/formats/ctf/metadata/ctf-parser.y +++ b/formats/ctf/metadata/ctf-parser.y @@ -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 alias_declaration_specifiers %type type_declarator_list -%type abstract_type_declarator_list %type type_specifier %type struct_type_specifier %type variant_type_specifier -%type type_specifier_or_integer_constant +%type declaration_specifiers_or_integer_constant %type enum_type_specifier %type struct_or_variant_declaration_list %type struct_or_variant_declaration @@ -829,12 +830,13 @@ void ctf_scanner_free(struct ctf_scanner *scanner) %type abstract_declarator_list %type abstract_declarator %type direct_abstract_declarator +%type alias_abstract_declarator_list +%type alias_abstract_declarator +%type direct_alias_abstract_declarator %type declarator %type direct_declarator %type type_declarator %type direct_type_declarator -%type abstract_type_declarator -%type direct_abstract_type_declarator %type pointer %type ctf_assignment_expression_list %type 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 @@ -1542,98 +1534,114 @@ enum_type_specifier: LBRAC enumerator_list RBRAC { $$ = make_node(scanner, NODE_ENUM); + $$->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.container_type = $2; + $$->u._enum.has_body = 1; + _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 { $$ = make_node(scanner, NODE_ENUM); + $$->u._enum.has_body = 1; $$->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 { $$ = make_node(scanner, NODE_ENUM); + $$->u._enum.has_body = 1; $$->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 { $$ = make_node(scanner, NODE_ENUM); + $$->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.container_type = $2; + $$->u._enum.has_body = 1; + _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 { $$ = make_node(scanner, NODE_ENUM); + $$->u._enum.has_body = 1; $$->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 { $$ = make_node(scanner, NODE_ENUM); + $$->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 { $$ = make_node(scanner, NODE_ENUM); + $$->u._enum.has_body = 1; $$->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 { $$ = make_node(scanner, NODE_ENUM); + $$->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); } ; @@ -1678,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); @@ -1862,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 { @@ -1878,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); } ; @@ -2070,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);