+callsite_declaration:
+ CALLSITE callsite_declaration_begin callsite_declaration_end
+ {
+ $$ = make_node(scanner, NODE_CALLSITE);
+ }
+ | CALLSITE callsite_declaration_begin ctf_assignment_expression_list callsite_declaration_end
+ {
+ $$ = make_node(scanner, NODE_CALLSITE);
+ if (set_parent_node($3, $$))
+ reparent_error(scanner, "trace_declaration");
+ }
+ ;
+
+callsite_declaration_begin:
+ LBRAC
+ { push_scope(scanner); }
+ ;
+
+callsite_declaration_end:
+ RBRAC SEMICOLON
+ { 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;
+ bt_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;
+ bt_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;
+ bt_list_add_tail(&node->siblings, &($$)->u.type_specifier_list.head);
+ }
+ | integer_declaration_specifiers integer_type_specifier
+ {
+ $$ = $1;
+ bt_list_add_tail(&($2)->siblings, &($$)->u.type_specifier_list.head);
+ }
+ ;
+
+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;
+ bt_list_add_tail(&node->siblings, &($$)->u.type_specifier_list.head);
+ }
+ | type_specifier
+ {
+ struct ctf_node *node;
+
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
+ node = $1;
+ bt_list_add_tail(&node->siblings, &($$)->u.type_specifier_list.head);
+ }
+ | declaration_specifiers CONST
+ {
+ struct ctf_node *node;
+
+ $$ = $1;
+ node = make_node(scanner, NODE_TYPE_SPECIFIER);
+ node->u.type_specifier.type = TYPESPEC_CONST;
+ bt_list_add_tail(&node->siblings, &($$)->u.type_specifier_list.head);
+ }
+ | declaration_specifiers type_specifier
+ {
+ $$ = $1;
+ bt_list_add_tail(&($2)->siblings, &($$)->u.type_specifier_list.head);
+ }
+ ;
+
+type_declarator_list:
+ type_declarator
+ { $$ = $1; }
+ | type_declarator_list COMMA type_declarator
+ {
+ $$ = $1;
+ bt_list_add_tail(&($3)->siblings, &($$)->tmp_head);
+ }
+ ;
+
+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
+ {
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+ $$->u.type_specifier.type = TYPESPEC_VOID;
+ }
+ | 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;
+ }
+ | FLOAT
+ {
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+ $$->u.type_specifier.type = TYPESPEC_FLOAT;
+ }
+ | DOUBLE
+ {
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+ $$->u.type_specifier.type = TYPESPEC_DOUBLE;
+ }
+ | 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;
+ }
+ | _COMPLEX
+ {
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+ $$->u.type_specifier.type = TYPESPEC_COMPLEX;
+ }
+ | _IMAGINARY
+ {
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+ $$->u.type_specifier.type = TYPESPEC_IMAGINARY;
+ }
+ | ID_TYPE
+ {
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+ $$->u.type_specifier.type = TYPESPEC_ID_TYPE;
+ $$->u.type_specifier.id_type = yylval.gs->s;
+ }
+ | FLOATING_POINT LBRAC RBRAC
+ {
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+ $$->u.type_specifier.type = TYPESPEC_FLOATING_POINT;
+ $$->u.type_specifier.node = make_node(scanner, NODE_FLOATING_POINT);
+ }
+ | FLOATING_POINT LBRAC ctf_assignment_expression_list RBRAC
+ {
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+ $$->u.type_specifier.type = TYPESPEC_FLOATING_POINT;
+ $$->u.type_specifier.node = make_node(scanner, NODE_FLOATING_POINT);
+ if (set_parent_node($3, $$->u.type_specifier.node))
+ reparent_error(scanner, "floating point reparent error");
+ }
+ | 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");
+ }
+ | STRING
+ {
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+ $$->u.type_specifier.type = TYPESPEC_STRING;
+ $$->u.type_specifier.node = make_node(scanner, NODE_STRING);
+ }
+ | STRING LBRAC RBRAC
+ {
+ $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
+ $$->u.type_specifier.type = TYPESPEC_STRING;
+ $$->u.type_specifier.node = make_node(scanner, NODE_STRING);
+ }