5 * Common Trace Format Metadata Grammar.
7 * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
9 * Permission is hereby granted, free of charge, to any person obtaining a copy
10 * of this software and associated documentation files (the "Software"), to deal
11 * in the Software without restriction, including without limitation the rights
12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 * copies of the Software, and to permit persons to whom the Software is
14 * furnished to do so, subject to the following conditions:
16 * The above copyright notice and this permission notice shall be included in
17 * all copies or substantial portions of the Software.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28 #define BT_LOG_OUTPUT_LEVEL ctf_plugin_metadata_log_level
29 #define BT_LOG_TAG "PLUGIN/CTF/META/PARSER"
41 #include "common/list.h"
42 #include "common/assert.h"
47 #include "parser-wrap.h"
50 * Avoid warning about "yynerrs" being unused, seen with bison 3.5.1 + clang 15
53 BT_DIAG_IGNORE_UNUSED_BUT_SET_VARIABLE
55 /* Join two lists, put "add" at the end of "head". */
57 _bt_list_splice_tail (struct bt_list_head *add, struct bt_list_head *head)
59 /* Do nothing if the list which gets added is empty. */
60 if (add != add->next) {
61 add->next->prev = head->prev;
62 add->prev->next = head;
63 head->prev->next = add->next;
64 head->prev = add->prev;
69 int yylex(union YYSTYPE *yyval, yyscan_t yyscanner);
71 int yylex_init_extra(struct ctf_scanner *scanner, yyscan_t * ptr_yy_globals);
73 int yylex_destroy(yyscan_t yyscanner);
75 void yyrestart(FILE * in_str, yyscan_t yyscanner);
77 int yyget_lineno(yyscan_t yyscanner);
79 char *yyget_text(yyscan_t yyscanner);
81 static const char *node_type_to_str[] = {
82 #define ENTRY(S) [S] = #S,
83 FOREACH_CTF_NODES(ENTRY)
88 * Static node for out of memory errors. Only "type" is used. lineno is
89 * always left at 0. The rest of the node content can be overwritten,
92 static struct ctf_node error_node = {
97 const char *node_type(struct ctf_node *node)
99 if (node->type < NR_NODE_TYPES)
100 return node_type_to_str[node->type];
105 void setstring(struct ctf_scanner *scanner, YYSTYPE *lvalp, const char *src)
107 lvalp->s = objstack_alloc(scanner->objstack, strlen(src) + 1);
108 strcpy(lvalp->s, src);
112 int str_check(size_t str_len, size_t offset, size_t len)
115 if (offset + len < offset)
117 if (offset + len > str_len)
123 int bt_isodigit(int c)
141 int parse_base_sequence(const char *src, size_t len, size_t pos,
142 char *buffer, size_t *buf_len, int base)
144 const size_t max_char = 3;
147 while (!str_check(len, pos, 1) && nr_char < max_char) {
152 buffer[nr_char++] = c;
155 } else if (base == 16) {
157 buffer[nr_char++] = c;
162 /* Unsupported base */
166 BT_ASSERT_DBG(nr_char > 0);
167 buffer[nr_char] = '\0';
173 int import_basic_string(struct ctf_scanner *scanner, YYSTYPE *lvalp,
174 size_t len, const char *src, char delim)
176 size_t pos = 0, dpos = 0;
178 if (str_check(len, pos, 1))
180 if (src[pos++] != delim)
183 while (src[pos] != delim) {
186 if (str_check(len, pos, 1))
190 if (str_check(len, pos, 1))
240 if (parse_base_sequence(src, len, pos - 1,
241 oct_buffer, &oct_len, 8))
243 c = strtoul(&oct_buffer[0], NULL, 8);
252 if (parse_base_sequence(src, len, pos,
253 hex_buffer, &hex_len, 16))
255 c = strtoul(&hex_buffer[0], NULL, 16);
263 if (str_check(len, dpos, 1))
265 lvalp->s[dpos++] = c;
268 if (str_check(len, dpos, 1))
270 lvalp->s[dpos++] = '\0';
272 if (str_check(len, pos, 1))
274 if (src[pos++] != delim)
277 if (str_check(len, pos, 1))
279 if (src[pos] != '\0')
284 int import_string(struct ctf_scanner *scanner, YYSTYPE *lvalp,
285 const char *src, char delim)
289 len = strlen(src) + 1;
290 lvalp->s = objstack_alloc(scanner->objstack, len);
292 // TODO: import wide string
293 _BT_LOGE_LINENO(yyget_lineno(scanner),
294 "wide characters are not supported as of this version: "
295 "scanner-addr=%p", scanner);
298 return import_basic_string(scanner, lvalp, len, src, delim);
302 static void init_scope(struct ctf_scanner_scope *scope,
303 struct ctf_scanner_scope *parent)
305 scope->parent = parent;
306 scope->classes = g_hash_table_new_full(g_str_hash, g_str_equal,
310 static void finalize_scope(struct ctf_scanner_scope *scope)
312 g_hash_table_destroy(scope->classes);
315 static void push_scope(struct ctf_scanner *scanner)
317 struct ctf_scanner_scope *ns;
319 BT_LOGT("Pushing scope: scanner-addr=%p", scanner);
320 ns = malloc(sizeof(struct ctf_scanner_scope));
321 init_scope(ns, scanner->cs);
325 static void pop_scope(struct ctf_scanner *scanner)
327 struct ctf_scanner_scope *os;
329 BT_LOGT("Popping scope: scanner-addr=%p", scanner);
331 scanner->cs = os->parent;
336 static int lookup_type(struct ctf_scanner_scope *s, const char *id)
340 ret = GPOINTER_TO_INT(g_hash_table_lookup(s->classes, id));
341 BT_LOGT("Looked up type: scanner-addr=%p, id=\"%s\", ret=%d",
347 int is_type(struct ctf_scanner *scanner, const char *id)
349 struct ctf_scanner_scope *it;
352 for (it = scanner->cs; it; it = it->parent) {
353 if (lookup_type(it, id)) {
358 BT_LOGT("Found if ID is type: scanner-addr=%p, id=\"%s\", ret=%d",
363 static void add_type(struct ctf_scanner *scanner, char *id)
365 BT_LOGT("Adding type: scanner-addr=%p, id=\"%s\"",
367 if (lookup_type(scanner->cs, id))
369 g_hash_table_insert(scanner->cs->classes, id, id);
372 static struct ctf_node *make_node(struct ctf_scanner *scanner,
375 struct ctf_node *node;
377 node = objstack_alloc(scanner->objstack, sizeof(*node));
379 _BT_LOGE_LINENO(yyget_lineno(scanner->scanner),
380 "failed to allocate one stack entry: "
381 "scanner-addr=%p", scanner);
385 node->lineno = yyget_lineno(scanner->scanner);
386 BT_INIT_LIST_HEAD(&node->tmp_head);
387 bt_list_add(&node->siblings, &node->tmp_head);
391 node->type = NODE_ERROR;
392 BT_LOGE("Trying to create root node: scanner-addr=%p",
396 BT_INIT_LIST_HEAD(&node->u.event.declaration_list);
399 BT_INIT_LIST_HEAD(&node->u.stream.declaration_list);
402 BT_INIT_LIST_HEAD(&node->u.env.declaration_list);
405 BT_INIT_LIST_HEAD(&node->u.trace.declaration_list);
408 BT_INIT_LIST_HEAD(&node->u.clock.declaration_list);
411 BT_INIT_LIST_HEAD(&node->u.callsite.declaration_list);
413 case NODE_CTF_EXPRESSION:
414 BT_INIT_LIST_HEAD(&node->u.ctf_expression.left);
415 BT_INIT_LIST_HEAD(&node->u.ctf_expression.right);
417 case NODE_UNARY_EXPRESSION:
420 BT_INIT_LIST_HEAD(&node->u.field_class_def.field_class_declarators);
422 case NODE_TYPEALIAS_TARGET:
423 BT_INIT_LIST_HEAD(&node->u.field_class_alias_target.field_class_declarators);
425 case NODE_TYPEALIAS_ALIAS:
426 BT_INIT_LIST_HEAD(&node->u.field_class_alias_name.field_class_declarators);
430 case NODE_TYPE_SPECIFIER:
432 case NODE_TYPE_SPECIFIER_LIST:
433 BT_INIT_LIST_HEAD(&node->u.field_class_specifier_list.head);
437 case NODE_TYPE_DECLARATOR:
438 BT_INIT_LIST_HEAD(&node->u.field_class_declarator.pointers);
440 case NODE_FLOATING_POINT:
441 BT_INIT_LIST_HEAD(&node->u.floating_point.expressions);
444 BT_INIT_LIST_HEAD(&node->u.integer.expressions);
447 BT_INIT_LIST_HEAD(&node->u.string.expressions);
449 case NODE_ENUMERATOR:
450 BT_INIT_LIST_HEAD(&node->u.enumerator.values);
453 BT_INIT_LIST_HEAD(&node->u._enum.enumerator_list);
455 case NODE_STRUCT_OR_VARIANT_DECLARATION:
456 BT_INIT_LIST_HEAD(&node->u.struct_or_variant_declaration.field_class_declarators);
459 BT_INIT_LIST_HEAD(&node->u.variant.declaration_list);
462 BT_INIT_LIST_HEAD(&node->u._struct.declaration_list);
463 BT_INIT_LIST_HEAD(&node->u._struct.min_align);
467 node->type = NODE_ERROR;
468 BT_LOGE("Unknown node type: scanner-addr=%p, node-type=%d",
476 static int reparent_ctf_expression(struct ctf_node *node,
477 struct ctf_node *parent)
479 switch (parent->type) {
481 _bt_list_splice_tail(&node->tmp_head, &parent->u.event.declaration_list);
484 _bt_list_splice_tail(&node->tmp_head, &parent->u.stream.declaration_list);
487 _bt_list_splice_tail(&node->tmp_head, &parent->u.env.declaration_list);
490 _bt_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
493 _bt_list_splice_tail(&node->tmp_head, &parent->u.clock.declaration_list);
496 _bt_list_splice_tail(&node->tmp_head, &parent->u.callsite.declaration_list);
498 case NODE_FLOATING_POINT:
499 _bt_list_splice_tail(&node->tmp_head, &parent->u.floating_point.expressions);
502 _bt_list_splice_tail(&node->tmp_head, &parent->u.integer.expressions);
505 _bt_list_splice_tail(&node->tmp_head, &parent->u.string.expressions);
509 case NODE_CTF_EXPRESSION:
511 case NODE_TYPEALIAS_TARGET:
512 case NODE_TYPEALIAS_ALIAS:
514 case NODE_TYPE_SPECIFIER:
515 case NODE_TYPE_SPECIFIER_LIST:
517 case NODE_TYPE_DECLARATOR:
518 case NODE_ENUMERATOR:
520 case NODE_STRUCT_OR_VARIANT_DECLARATION:
523 case NODE_UNARY_EXPRESSION:
528 BT_LOGE("Unknown node type: node-type=%d", parent->type);
534 static int reparent_typedef(struct ctf_node *node, struct ctf_node *parent)
536 switch (parent->type) {
538 _bt_list_splice_tail(&node->tmp_head, &parent->u.root.declaration_list);
541 _bt_list_splice_tail(&node->tmp_head, &parent->u.event.declaration_list);
544 _bt_list_splice_tail(&node->tmp_head, &parent->u.stream.declaration_list);
547 _bt_list_splice_tail(&node->tmp_head, &parent->u.env.declaration_list);
550 _bt_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
553 _bt_list_splice_tail(&node->tmp_head, &parent->u.clock.declaration_list);
556 _bt_list_splice_tail(&node->tmp_head, &parent->u.callsite.declaration_list);
559 _bt_list_splice_tail(&node->tmp_head, &parent->u.variant.declaration_list);
562 _bt_list_splice_tail(&node->tmp_head, &parent->u._struct.declaration_list);
565 case NODE_FLOATING_POINT:
568 case NODE_CTF_EXPRESSION:
570 case NODE_TYPEALIAS_TARGET:
571 case NODE_TYPEALIAS_ALIAS:
573 case NODE_TYPE_SPECIFIER:
574 case NODE_TYPE_SPECIFIER_LIST:
576 case NODE_TYPE_DECLARATOR:
577 case NODE_ENUMERATOR:
579 case NODE_STRUCT_OR_VARIANT_DECLARATION:
580 case NODE_UNARY_EXPRESSION:
585 BT_LOGE("Unknown node type: node-type=%d", parent->type);
591 static int reparent_field_class_alias(struct ctf_node *node, struct ctf_node *parent)
593 switch (parent->type) {
595 _bt_list_splice_tail(&node->tmp_head, &parent->u.root.declaration_list);
598 _bt_list_splice_tail(&node->tmp_head, &parent->u.event.declaration_list);
601 _bt_list_splice_tail(&node->tmp_head, &parent->u.stream.declaration_list);
604 _bt_list_splice_tail(&node->tmp_head, &parent->u.env.declaration_list);
607 _bt_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
610 _bt_list_splice_tail(&node->tmp_head, &parent->u.clock.declaration_list);
613 _bt_list_splice_tail(&node->tmp_head, &parent->u.callsite.declaration_list);
616 _bt_list_splice_tail(&node->tmp_head, &parent->u.variant.declaration_list);
619 _bt_list_splice_tail(&node->tmp_head, &parent->u._struct.declaration_list);
622 case NODE_FLOATING_POINT:
625 case NODE_CTF_EXPRESSION:
627 case NODE_TYPEALIAS_TARGET:
628 case NODE_TYPEALIAS_ALIAS:
630 case NODE_TYPE_SPECIFIER:
631 case NODE_TYPE_SPECIFIER_LIST:
633 case NODE_TYPE_DECLARATOR:
634 case NODE_ENUMERATOR:
636 case NODE_STRUCT_OR_VARIANT_DECLARATION:
637 case NODE_UNARY_EXPRESSION:
642 BT_LOGE("Unknown node type: node-type=%d", parent->type);
648 static int reparent_field_class_specifier(struct ctf_node *node,
649 struct ctf_node *parent)
651 switch (parent->type) {
652 case NODE_TYPE_SPECIFIER_LIST:
653 _bt_list_splice_tail(&node->tmp_head, &parent->u.field_class_specifier_list.head);
656 case NODE_TYPE_SPECIFIER:
666 case NODE_TYPEALIAS_TARGET:
667 case NODE_TYPEALIAS_ALIAS:
668 case NODE_TYPE_DECLARATOR:
670 case NODE_STRUCT_OR_VARIANT_DECLARATION:
672 case NODE_FLOATING_POINT:
675 case NODE_CTF_EXPRESSION:
677 case NODE_ENUMERATOR:
678 case NODE_UNARY_EXPRESSION:
683 BT_LOGE("Unknown node type: node-type=%d", parent->type);
689 static int reparent_field_class_specifier_list(struct ctf_node *node,
690 struct ctf_node *parent)
692 switch (parent->type) {
694 bt_list_add_tail(&node->siblings, &parent->u.root.declaration_list);
697 bt_list_add_tail(&node->siblings, &parent->u.event.declaration_list);
700 bt_list_add_tail(&node->siblings, &parent->u.stream.declaration_list);
703 bt_list_add_tail(&node->siblings, &parent->u.env.declaration_list);
706 bt_list_add_tail(&node->siblings, &parent->u.trace.declaration_list);
709 bt_list_add_tail(&node->siblings, &parent->u.clock.declaration_list);
712 bt_list_add_tail(&node->siblings, &parent->u.callsite.declaration_list);
715 bt_list_add_tail(&node->siblings, &parent->u.variant.declaration_list);
718 bt_list_add_tail(&node->siblings, &parent->u._struct.declaration_list);
721 parent->u.field_class_def.field_class_specifier_list = node;
723 case NODE_TYPEALIAS_TARGET:
724 parent->u.field_class_alias_target.field_class_specifier_list = node;
726 case NODE_TYPEALIAS_ALIAS:
727 parent->u.field_class_alias_name.field_class_specifier_list = node;
730 parent->u._enum.container_field_class = node;
732 case NODE_STRUCT_OR_VARIANT_DECLARATION:
733 parent->u.struct_or_variant_declaration.field_class_specifier_list = node;
735 case NODE_TYPE_DECLARATOR:
736 case NODE_TYPE_SPECIFIER:
738 case NODE_FLOATING_POINT:
741 case NODE_CTF_EXPRESSION:
743 case NODE_ENUMERATOR:
744 case NODE_UNARY_EXPRESSION:
749 BT_LOGE("Unknown node type: node-type=%d", parent->type);
755 static int reparent_field_class_declarator(struct ctf_node *node,
756 struct ctf_node *parent)
758 switch (parent->type) {
759 case NODE_TYPE_DECLARATOR:
760 parent->u.field_class_declarator.type = TYPEDEC_NESTED;
761 parent->u.field_class_declarator.u.nested.field_class_declarator = node;
763 case NODE_STRUCT_OR_VARIANT_DECLARATION:
764 _bt_list_splice_tail(&node->tmp_head, &parent->u.struct_or_variant_declaration.field_class_declarators);
767 _bt_list_splice_tail(&node->tmp_head, &parent->u.field_class_def.field_class_declarators);
769 case NODE_TYPEALIAS_TARGET:
770 _bt_list_splice_tail(&node->tmp_head, &parent->u.field_class_alias_target.field_class_declarators);
772 case NODE_TYPEALIAS_ALIAS:
773 _bt_list_splice_tail(&node->tmp_head, &parent->u.field_class_alias_name.field_class_declarators);
787 case NODE_FLOATING_POINT:
790 case NODE_CTF_EXPRESSION:
791 case NODE_TYPE_SPECIFIER:
792 case NODE_TYPE_SPECIFIER_LIST:
794 case NODE_ENUMERATOR:
795 case NODE_UNARY_EXPRESSION:
800 BT_LOGE("Unknown node type: node-type=%d", parent->type);
809 * Link node to parent. Returns 0 on success, -EPERM if it is not permitted to
810 * create the link declared by the input, -ENOENT if node or parent is NULL,
811 * -EINVAL if there is an internal structure problem.
813 static int set_parent_node(struct ctf_node *node,
814 struct ctf_node *parent)
816 if (!node || !parent)
819 /* Note: Linking to parent will be done only by an external visitor */
821 switch (node->type) {
823 BT_LOGE_STR("Trying to reparent root node.");
827 if (parent->type == NODE_ROOT) {
828 _bt_list_splice_tail(&node->tmp_head, &parent->u.root.event);
834 if (parent->type == NODE_ROOT) {
835 _bt_list_splice_tail(&node->tmp_head, &parent->u.root.stream);
841 if (parent->type == NODE_ROOT) {
842 _bt_list_splice_tail(&node->tmp_head, &parent->u.root.env);
848 if (parent->type == NODE_ROOT) {
849 _bt_list_splice_tail(&node->tmp_head, &parent->u.root.trace);
855 if (parent->type == NODE_ROOT) {
856 _bt_list_splice_tail(&node->tmp_head, &parent->u.root.clock);
862 if (parent->type == NODE_ROOT) {
863 _bt_list_splice_tail(&node->tmp_head, &parent->u.root.callsite);
869 case NODE_CTF_EXPRESSION:
870 return reparent_ctf_expression(node, parent);
871 case NODE_UNARY_EXPRESSION:
872 if (parent->type == NODE_TYPE_DECLARATOR)
873 parent->u.field_class_declarator.bitfield_len = node;
879 return reparent_typedef(node, parent);
880 case NODE_TYPEALIAS_TARGET:
881 if (parent->type == NODE_TYPEALIAS)
882 parent->u.field_class_alias.target = node;
886 case NODE_TYPEALIAS_ALIAS:
887 if (parent->type == NODE_TYPEALIAS)
888 parent->u.field_class_alias.alias = node;
893 return reparent_field_class_alias(node, parent);
896 if (parent->type == NODE_TYPE_DECLARATOR) {
897 _bt_list_splice_tail(&node->tmp_head, &parent->u.field_class_declarator.pointers);
901 case NODE_TYPE_DECLARATOR:
902 return reparent_field_class_declarator(node, parent);
904 case NODE_TYPE_SPECIFIER_LIST:
905 return reparent_field_class_specifier_list(node, parent);
907 case NODE_TYPE_SPECIFIER:
908 return reparent_field_class_specifier(node, parent);
910 case NODE_FLOATING_POINT:
916 return -EINVAL; /* Dealt with internally within grammar */
918 case NODE_ENUMERATOR:
919 if (parent->type == NODE_ENUM) {
920 _bt_list_splice_tail(&node->tmp_head, &parent->u._enum.enumerator_list);
925 case NODE_STRUCT_OR_VARIANT_DECLARATION:
926 switch (parent->type) {
928 _bt_list_splice_tail(&node->tmp_head, &parent->u._struct.declaration_list);
931 _bt_list_splice_tail(&node->tmp_head, &parent->u.variant.declaration_list);
940 BT_LOGE("Unknown node type: node-type=%d", parent->type);
947 void yyerror(struct ctf_scanner *scanner, yyscan_t yyscanner, const char *str)
949 _BT_LOGE_LINENO(yyget_lineno(scanner->scanner),
950 "%s: token=\"%s\"", str, yyget_text(scanner->scanner));
953 #define reparent_error(scanner, str) \
955 yyerror(scanner, scanner->scanner, YY_("reparent_error: " str)); \
959 static struct ctf_ast *ctf_ast_alloc(struct ctf_scanner *scanner)
963 ast = objstack_alloc(scanner->objstack, sizeof(*ast));
966 ast->root.type = NODE_ROOT;
967 BT_INIT_LIST_HEAD(&ast->root.tmp_head);
968 BT_INIT_LIST_HEAD(&ast->root.u.root.declaration_list);
969 BT_INIT_LIST_HEAD(&ast->root.u.root.trace);
970 BT_INIT_LIST_HEAD(&ast->root.u.root.env);
971 BT_INIT_LIST_HEAD(&ast->root.u.root.stream);
972 BT_INIT_LIST_HEAD(&ast->root.u.root.event);
973 BT_INIT_LIST_HEAD(&ast->root.u.root.clock);
974 BT_INIT_LIST_HEAD(&ast->root.u.root.callsite);
978 int ctf_scanner_append_ast(struct ctf_scanner *scanner, FILE *input)
980 /* Start processing new stream */
981 yyrestart(input, scanner->scanner);
982 return yyparse(scanner, scanner->scanner);
985 struct ctf_scanner *ctf_scanner_alloc(void)
987 struct ctf_scanner *scanner;
990 scanner = malloc(sizeof(*scanner));
993 memset(scanner, 0, sizeof(*scanner));
994 ret = yylex_init_extra(scanner, &scanner->scanner);
996 BT_LOGE("yylex_init_extra() failed: ret=%d", ret);
997 goto cleanup_scanner;
999 scanner->objstack = objstack_create();
1000 if (!scanner->objstack)
1002 scanner->ast = ctf_ast_alloc(scanner);
1004 goto cleanup_objstack;
1005 init_scope(&scanner->root_scope, NULL);
1006 scanner->cs = &scanner->root_scope;
1011 objstack_destroy(scanner->objstack);
1013 ret = yylex_destroy(scanner->scanner);
1015 BT_LOGE("yylex_destroy() failed: scanner-addr=%p, ret=%d",
1022 void ctf_scanner_free(struct ctf_scanner *scanner)
1028 finalize_scope(&scanner->root_scope);
1029 objstack_destroy(scanner->objstack);
1030 ret = yylex_destroy(scanner->scanner);
1032 BT_LOGE("yylex_destroy() failed: scanner-addr=%p, ret=%d",
1038 * The bison-provided version of strlen (yystrlen) generates a benign
1039 * -Wnull-dereference warning. That version is used when building on cygwin,
1040 * for example, but you can also enable it by hand (to test) by removing the
1041 * preprocessor conditional around it.
1043 * Define yystrlen such that it will always use strlen. As far as we know,
1044 * strlen provided by all the platforms we use is reliable.
1046 #define yystrlen strlen
1051 * This ends up in parser.h and makes sure those who want to include it pass
1052 * through parser-wrap.h.
1055 #ifndef ALLOW_INCLUDE_PARSER_H
1056 # error "Don't include parser.h directly, include parser-wrap.h instead."
1062 void setstring(struct ctf_scanner *scanner, YYSTYPE *lvalp, const char *src);
1065 int import_string(struct ctf_scanner *scanner, YYSTYPE *lvalp, const char *src, char delim);
1071 %parse-param {struct ctf_scanner *scanner}
1072 %parse-param {yyscan_t yyscanner}
1073 %lex-param {yyscan_t yyscanner}
1075 * Expect two shift-reduce conflicts. Caused by enum name-opt : type {}
1076 * vs struct { int :value; } (unnamed bit-field). The default is to
1077 * shift, so whenever we encounter an enumeration, we are doing the
1078 * proper thing (shift). It is illegal to declare an enumeration
1079 * "bit-field", so it is OK if this situation ends up in a parsing
1084 %token CTF_INTEGER_LITERAL CTF_STRING_LITERAL CTF_CHARACTER_LITERAL CTF_LSBRAC CTF_RSBRAC CTF_LPAREN CTF_RPAREN CTF_LBRAC CTF_RBRAC CTF_RARROW CTF_STAR CTF_PLUS CTF_MINUS CTF_LT CTF_GT CTF_TYPEASSIGN CTF_COLON CTF_SEMICOLON CTF_DOTDOTDOT CTF_DOT CTF_EQUAL CTF_COMMA CTF_CONST CTF_CHAR CTF_DOUBLE CTF_ENUM CTF_ENV CTF_EVENT CTF_FLOATING_POINT CTF_FLOAT CTF_INTEGER CTF_INT CTF_LONG CTF_SHORT CTF_SIGNED CTF_STREAM CTF_STRING CTF_STRUCT CTF_TRACE CTF_CALLSITE CTF_CLOCK CTF_TYPEALIAS CTF_TYPEDEF CTF_UNSIGNED CTF_VARIANT CTF_VOID CTF_BOOL CTF_COMPLEX CTF_IMAGINARY CTF_TOK_ALIGN
1085 %token <s> IDENTIFIER ID_TYPE
1090 unsigned long long ull;
1096 %type <s> CTF_STRING_LITERAL CTF_CHARACTER_LITERAL
1100 %type <ull> CTF_INTEGER_LITERAL
1101 %type <n> postfix_expression unary_expression unary_expression_or_range
1103 %type <n> declaration
1104 %type <n> event_declaration
1105 %type <n> stream_declaration
1106 %type <n> env_declaration
1107 %type <n> trace_declaration
1108 %type <n> clock_declaration
1109 %type <n> callsite_declaration
1110 %type <n> integer_declaration_specifiers
1111 %type <n> declaration_specifiers
1112 %type <n> alias_declaration_specifiers
1114 %type <n> field_class_declarator_list
1115 %type <n> integer_field_class_specifier
1116 %type <n> field_class_specifier
1117 %type <n> struct_class_specifier
1118 %type <n> variant_field_class_specifier
1119 %type <n> enum_field_class_specifier
1120 %type <n> struct_or_variant_declaration_list
1121 %type <n> struct_or_variant_declaration
1122 %type <n> struct_or_variant_declarator_list
1123 %type <n> struct_or_variant_declarator
1124 %type <n> enumerator_list
1125 %type <n> enumerator
1126 %type <n> abstract_declarator_list
1127 %type <n> abstract_declarator
1128 %type <n> direct_abstract_declarator
1129 %type <n> alias_abstract_declarator_list
1130 %type <n> alias_abstract_declarator
1131 %type <n> direct_alias_abstract_declarator
1132 %type <n> declarator
1133 %type <n> direct_declarator
1134 %type <n> field_class_declarator
1135 %type <n> direct_field_class_declarator
1137 %type <n> ctf_assignment_expression_list
1138 %type <n> ctf_assignment_expression
1145 if (set_parent_node($1, &ctf_scanner_get_ast(scanner)->root))
1146 reparent_error(scanner, "error reparenting to root");
1150 if (set_parent_node($2, &ctf_scanner_get_ast(scanner)->root))
1151 reparent_error(scanner, "error reparenting to root");
1180 | CTF_FLOATING_POINT
1213 /* 2: Phrase structure grammar */
1218 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1219 $$->u.unary_expression.type = UNARY_STRING;
1220 $$->u.unary_expression.u.string = yylval.s;
1224 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1225 $$->u.unary_expression.type = UNARY_STRING;
1226 $$->u.unary_expression.u.string = yylval.s;
1230 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1231 $$->u.unary_expression.type = UNARY_STRING;
1232 $$->u.unary_expression.u.string = yylval.s;
1234 | CTF_INTEGER_LITERAL
1236 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1237 $$->u.unary_expression.type = UNARY_UNSIGNED_CONSTANT;
1238 $$->u.unary_expression.u.unsigned_constant = $1;
1240 | CTF_STRING_LITERAL
1242 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1243 $$->u.unary_expression.type = UNARY_STRING;
1244 $$->u.unary_expression.u.string = $1;
1246 | CTF_CHARACTER_LITERAL
1248 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1249 $$->u.unary_expression.type = UNARY_STRING;
1250 $$->u.unary_expression.u.string = $1;
1252 | CTF_LPAREN unary_expression CTF_RPAREN
1256 | postfix_expression CTF_LSBRAC unary_expression CTF_RSBRAC
1258 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1259 $$->u.unary_expression.type = UNARY_SBRAC;
1260 $$->u.unary_expression.u.sbrac_exp = $3;
1261 bt_list_splice(&($1)->tmp_head, &($$)->tmp_head);
1262 bt_list_add_tail(&($$)->siblings, &($$)->tmp_head);
1264 | postfix_expression CTF_DOT IDENTIFIER
1266 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1267 $$->u.unary_expression.type = UNARY_STRING;
1268 $$->u.unary_expression.u.string = yylval.s;
1269 $$->u.unary_expression.link = UNARY_DOTLINK;
1270 bt_list_splice(&($1)->tmp_head, &($$)->tmp_head);
1271 bt_list_add_tail(&($$)->siblings, &($$)->tmp_head);
1273 | postfix_expression CTF_DOT ID_TYPE
1275 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1276 $$->u.unary_expression.type = UNARY_STRING;
1277 $$->u.unary_expression.u.string = yylval.s;
1278 $$->u.unary_expression.link = UNARY_DOTLINK;
1279 bt_list_splice(&($1)->tmp_head, &($$)->tmp_head);
1280 bt_list_add_tail(&($$)->siblings, &($$)->tmp_head);
1282 | postfix_expression CTF_DOT keywords
1284 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1285 $$->u.unary_expression.type = UNARY_STRING;
1286 $$->u.unary_expression.u.string = yylval.s;
1287 $$->u.unary_expression.link = UNARY_DOTLINK;
1288 bt_list_splice(&($1)->tmp_head, &($$)->tmp_head);
1289 bt_list_add_tail(&($$)->siblings, &($$)->tmp_head);
1291 | postfix_expression CTF_RARROW IDENTIFIER
1293 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1294 $$->u.unary_expression.type = UNARY_STRING;
1295 $$->u.unary_expression.u.string = yylval.s;
1296 $$->u.unary_expression.link = UNARY_ARROWLINK;
1297 bt_list_splice(&($1)->tmp_head, &($$)->tmp_head);
1298 bt_list_add_tail(&($$)->siblings, &($$)->tmp_head);
1300 | postfix_expression CTF_RARROW ID_TYPE
1302 $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
1303 $$->u.unary_expression.type = UNARY_STRING;
1304 $$->u.unary_expression.u.string = yylval.s;
1305 $$->u.unary_expression.link = UNARY_ARROWLINK;
1306 bt_list_splice(&($1)->tmp_head, &($$)->tmp_head);
1307 bt_list_add_tail(&($$)->siblings, &($$)->tmp_head);
1314 | CTF_PLUS postfix_expression
1317 if ($$->u.unary_expression.type != UNARY_UNSIGNED_CONSTANT
1318 && $$->u.unary_expression.type != UNARY_SIGNED_CONSTANT) {
1319 reparent_error(scanner, "expecting numeric constant");
1322 | CTF_MINUS postfix_expression
1325 if ($$->u.unary_expression.type == UNARY_UNSIGNED_CONSTANT) {
1326 $$->u.unary_expression.type = UNARY_SIGNED_CONSTANT;
1327 $$->u.unary_expression.u.signed_constant =
1328 -($$->u.unary_expression.u.unsigned_constant);
1329 } else if ($$->u.unary_expression.type == UNARY_SIGNED_CONSTANT) {
1330 $$->u.unary_expression.u.signed_constant =
1331 -($$->u.unary_expression.u.signed_constant);
1333 reparent_error(scanner, "expecting numeric constant");
1338 unary_expression_or_range:
1339 unary_expression CTF_DOTDOTDOT unary_expression
1342 _bt_list_splice_tail(&($3)->tmp_head, &($$)->tmp_head);
1343 $3->u.unary_expression.link = UNARY_DOTDOTDOT;
1349 /* 2.2: Declarations */
1352 declaration_specifiers CTF_SEMICOLON
1356 | stream_declaration
1364 | callsite_declaration
1366 | declaration_specifiers CTF_TYPEDEF declaration_specifiers field_class_declarator_list CTF_SEMICOLON
1368 struct ctf_node *list;
1370 $$ = make_node(scanner, NODE_TYPEDEF);
1371 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
1372 $$->u.field_class_def.field_class_specifier_list = list;
1373 _bt_list_splice_tail(&($1)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
1374 _bt_list_splice_tail(&($3)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
1375 _bt_list_splice_tail(&($4)->tmp_head, &($$)->u.field_class_def.field_class_declarators);
1377 | CTF_TYPEDEF declaration_specifiers field_class_declarator_list CTF_SEMICOLON
1379 struct ctf_node *list;
1381 $$ = make_node(scanner, NODE_TYPEDEF);
1382 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
1383 $$->u.field_class_def.field_class_specifier_list = list;
1384 _bt_list_splice_tail(&($2)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
1385 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_def.field_class_declarators);
1387 | declaration_specifiers CTF_TYPEDEF field_class_declarator_list CTF_SEMICOLON
1389 struct ctf_node *list;
1391 $$ = make_node(scanner, NODE_TYPEDEF);
1392 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
1393 $$->u.field_class_def.field_class_specifier_list = list;
1394 _bt_list_splice_tail(&($1)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
1395 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_def.field_class_declarators);
1397 | CTF_TYPEALIAS declaration_specifiers abstract_declarator_list CTF_TYPEASSIGN alias_declaration_specifiers alias_abstract_declarator_list CTF_SEMICOLON
1399 struct ctf_node *list;
1401 $$ = make_node(scanner, NODE_TYPEALIAS);
1402 $$->u.field_class_alias.target = make_node(scanner, NODE_TYPEALIAS_TARGET);
1403 $$->u.field_class_alias.alias = make_node(scanner, NODE_TYPEALIAS_ALIAS);
1405 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
1406 $$->u.field_class_alias.target->u.field_class_alias_target.field_class_specifier_list = list;
1407 _bt_list_splice_tail(&($2)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
1408 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_alias.target->u.field_class_alias_target.field_class_declarators);
1410 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
1411 $$->u.field_class_alias.alias->u.field_class_alias_name.field_class_specifier_list = list;
1412 _bt_list_splice_tail(&($5)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
1413 _bt_list_splice_tail(&($6)->tmp_head, &($$)->u.field_class_alias.alias->u.field_class_alias_name.field_class_declarators);
1418 event_declaration_begin event_declaration_end
1420 $$ = make_node(scanner, NODE_EVENT);
1422 | event_declaration_begin ctf_assignment_expression_list event_declaration_end
1424 $$ = make_node(scanner, NODE_EVENT);
1425 if (set_parent_node($2, $$))
1426 reparent_error(scanner, "event_declaration");
1430 event_declaration_begin:
1432 { push_scope(scanner); }
1435 event_declaration_end:
1436 CTF_RBRAC CTF_SEMICOLON
1437 { pop_scope(scanner); }
1442 stream_declaration_begin stream_declaration_end
1444 $$ = make_node(scanner, NODE_STREAM);
1446 | stream_declaration_begin ctf_assignment_expression_list stream_declaration_end
1448 $$ = make_node(scanner, NODE_STREAM);
1449 if (set_parent_node($2, $$))
1450 reparent_error(scanner, "stream_declaration");
1454 stream_declaration_begin:
1455 CTF_STREAM CTF_LBRAC
1456 { push_scope(scanner); }
1459 stream_declaration_end:
1460 CTF_RBRAC CTF_SEMICOLON
1461 { pop_scope(scanner); }
1465 env_declaration_begin env_declaration_end
1467 $$ = make_node(scanner, NODE_ENV);
1469 | env_declaration_begin ctf_assignment_expression_list env_declaration_end
1471 $$ = make_node(scanner, NODE_ENV);
1472 if (set_parent_node($2, $$))
1473 reparent_error(scanner, "env declaration");
1477 env_declaration_begin:
1479 { push_scope(scanner); }
1482 env_declaration_end:
1483 CTF_RBRAC CTF_SEMICOLON
1484 { pop_scope(scanner); }
1488 trace_declaration_begin trace_declaration_end
1490 $$ = make_node(scanner, NODE_TRACE);
1492 | trace_declaration_begin ctf_assignment_expression_list trace_declaration_end
1494 $$ = make_node(scanner, NODE_TRACE);
1495 if (set_parent_node($2, $$))
1496 reparent_error(scanner, "trace_declaration");
1500 trace_declaration_begin:
1502 { push_scope(scanner); }
1505 trace_declaration_end:
1506 CTF_RBRAC CTF_SEMICOLON
1507 { pop_scope(scanner); }
1511 CTF_CLOCK clock_declaration_begin clock_declaration_end
1513 $$ = make_node(scanner, NODE_CLOCK);
1515 | CTF_CLOCK clock_declaration_begin ctf_assignment_expression_list clock_declaration_end
1517 $$ = make_node(scanner, NODE_CLOCK);
1518 if (set_parent_node($3, $$))
1519 reparent_error(scanner, "trace_declaration");
1523 clock_declaration_begin:
1525 { push_scope(scanner); }
1528 clock_declaration_end:
1529 CTF_RBRAC CTF_SEMICOLON
1530 { pop_scope(scanner); }
1533 callsite_declaration:
1534 CTF_CALLSITE callsite_declaration_begin callsite_declaration_end
1536 $$ = make_node(scanner, NODE_CALLSITE);
1538 | CTF_CALLSITE callsite_declaration_begin ctf_assignment_expression_list callsite_declaration_end
1540 $$ = make_node(scanner, NODE_CALLSITE);
1541 if (set_parent_node($3, $$))
1542 reparent_error(scanner, "trace_declaration");
1546 callsite_declaration_begin:
1548 { push_scope(scanner); }
1551 callsite_declaration_end:
1552 CTF_RBRAC CTF_SEMICOLON
1553 { pop_scope(scanner); }
1556 integer_declaration_specifiers:
1559 struct ctf_node *node;
1561 $$ = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
1562 node = make_node(scanner, NODE_TYPE_SPECIFIER);
1563 node->u.field_class_specifier.type = TYPESPEC_CONST;
1564 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
1566 | integer_field_class_specifier
1568 struct ctf_node *node;
1570 $$ = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
1572 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
1574 | integer_declaration_specifiers CTF_CONST
1576 struct ctf_node *node;
1579 node = make_node(scanner, NODE_TYPE_SPECIFIER);
1580 node->u.field_class_specifier.type = TYPESPEC_CONST;
1581 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
1583 | integer_declaration_specifiers integer_field_class_specifier
1586 bt_list_add_tail(&($2)->siblings, &($$)->u.field_class_specifier_list.head);
1590 declaration_specifiers:
1593 struct ctf_node *node;
1595 $$ = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
1596 node = make_node(scanner, NODE_TYPE_SPECIFIER);
1597 node->u.field_class_specifier.type = TYPESPEC_CONST;
1598 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
1600 | field_class_specifier
1602 struct ctf_node *node;
1604 $$ = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
1606 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
1608 | declaration_specifiers CTF_CONST
1610 struct ctf_node *node;
1613 node = make_node(scanner, NODE_TYPE_SPECIFIER);
1614 node->u.field_class_specifier.type = TYPESPEC_CONST;
1615 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
1617 | declaration_specifiers field_class_specifier
1620 bt_list_add_tail(&($2)->siblings, &($$)->u.field_class_specifier_list.head);
1624 field_class_declarator_list:
1625 field_class_declarator
1627 | field_class_declarator_list CTF_COMMA field_class_declarator
1630 bt_list_add_tail(&($3)->siblings, &($$)->tmp_head);
1634 integer_field_class_specifier:
1637 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1638 $$->u.field_class_specifier.type = TYPESPEC_CHAR;
1642 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1643 $$->u.field_class_specifier.type = TYPESPEC_SHORT;
1647 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1648 $$->u.field_class_specifier.type = TYPESPEC_INT;
1652 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1653 $$->u.field_class_specifier.type = TYPESPEC_LONG;
1657 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1658 $$->u.field_class_specifier.type = TYPESPEC_SIGNED;
1662 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1663 $$->u.field_class_specifier.type = TYPESPEC_UNSIGNED;
1667 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1668 $$->u.field_class_specifier.type = TYPESPEC_BOOL;
1672 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1673 $$->u.field_class_specifier.type = TYPESPEC_ID_TYPE;
1674 $$->u.field_class_specifier.id_type = yylval.s;
1676 | CTF_INTEGER CTF_LBRAC CTF_RBRAC
1678 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1679 $$->u.field_class_specifier.type = TYPESPEC_INTEGER;
1680 $$->u.field_class_specifier.node = make_node(scanner, NODE_INTEGER);
1682 | CTF_INTEGER CTF_LBRAC ctf_assignment_expression_list CTF_RBRAC
1684 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1685 $$->u.field_class_specifier.type = TYPESPEC_INTEGER;
1686 $$->u.field_class_specifier.node = make_node(scanner, NODE_INTEGER);
1687 if (set_parent_node($3, $$->u.field_class_specifier.node))
1688 reparent_error(scanner, "integer reparent error");
1692 field_class_specifier:
1695 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1696 $$->u.field_class_specifier.type = TYPESPEC_VOID;
1700 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1701 $$->u.field_class_specifier.type = TYPESPEC_CHAR;
1705 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1706 $$->u.field_class_specifier.type = TYPESPEC_SHORT;
1710 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1711 $$->u.field_class_specifier.type = TYPESPEC_INT;
1715 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1716 $$->u.field_class_specifier.type = TYPESPEC_LONG;
1720 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1721 $$->u.field_class_specifier.type = TYPESPEC_FLOAT;
1725 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1726 $$->u.field_class_specifier.type = TYPESPEC_DOUBLE;
1730 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1731 $$->u.field_class_specifier.type = TYPESPEC_SIGNED;
1735 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1736 $$->u.field_class_specifier.type = TYPESPEC_UNSIGNED;
1740 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1741 $$->u.field_class_specifier.type = TYPESPEC_BOOL;
1745 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1746 $$->u.field_class_specifier.type = TYPESPEC_COMPLEX;
1750 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1751 $$->u.field_class_specifier.type = TYPESPEC_IMAGINARY;
1755 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1756 $$->u.field_class_specifier.type = TYPESPEC_ID_TYPE;
1757 $$->u.field_class_specifier.id_type = yylval.s;
1759 | CTF_FLOATING_POINT CTF_LBRAC CTF_RBRAC
1761 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1762 $$->u.field_class_specifier.type = TYPESPEC_FLOATING_POINT;
1763 $$->u.field_class_specifier.node = make_node(scanner, NODE_FLOATING_POINT);
1765 | CTF_FLOATING_POINT CTF_LBRAC ctf_assignment_expression_list CTF_RBRAC
1767 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1768 $$->u.field_class_specifier.type = TYPESPEC_FLOATING_POINT;
1769 $$->u.field_class_specifier.node = make_node(scanner, NODE_FLOATING_POINT);
1770 if (set_parent_node($3, $$->u.field_class_specifier.node))
1771 reparent_error(scanner, "floating point reparent error");
1773 | CTF_INTEGER CTF_LBRAC CTF_RBRAC
1775 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1776 $$->u.field_class_specifier.type = TYPESPEC_INTEGER;
1777 $$->u.field_class_specifier.node = make_node(scanner, NODE_INTEGER);
1779 | CTF_INTEGER CTF_LBRAC ctf_assignment_expression_list CTF_RBRAC
1781 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1782 $$->u.field_class_specifier.type = TYPESPEC_INTEGER;
1783 $$->u.field_class_specifier.node = make_node(scanner, NODE_INTEGER);
1784 if (set_parent_node($3, $$->u.field_class_specifier.node))
1785 reparent_error(scanner, "integer reparent error");
1789 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1790 $$->u.field_class_specifier.type = TYPESPEC_STRING;
1791 $$->u.field_class_specifier.node = make_node(scanner, NODE_STRING);
1793 | CTF_STRING CTF_LBRAC CTF_RBRAC
1795 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1796 $$->u.field_class_specifier.type = TYPESPEC_STRING;
1797 $$->u.field_class_specifier.node = make_node(scanner, NODE_STRING);
1799 | CTF_STRING CTF_LBRAC ctf_assignment_expression_list CTF_RBRAC
1801 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1802 $$->u.field_class_specifier.type = TYPESPEC_STRING;
1803 $$->u.field_class_specifier.node = make_node(scanner, NODE_STRING);
1804 if (set_parent_node($3, $$->u.field_class_specifier.node))
1805 reparent_error(scanner, "string reparent error");
1807 | CTF_ENUM enum_field_class_specifier
1809 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1810 $$->u.field_class_specifier.type = TYPESPEC_ENUM;
1811 $$->u.field_class_specifier.node = $2;
1813 | CTF_VARIANT variant_field_class_specifier
1815 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1816 $$->u.field_class_specifier.type = TYPESPEC_VARIANT;
1817 $$->u.field_class_specifier.node = $2;
1819 | CTF_STRUCT struct_class_specifier
1821 $$ = make_node(scanner, NODE_TYPE_SPECIFIER);
1822 $$->u.field_class_specifier.type = TYPESPEC_STRUCT;
1823 $$->u.field_class_specifier.node = $2;
1827 struct_class_specifier:
1828 struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
1830 $$ = make_node(scanner, NODE_STRUCT);
1831 $$->u._struct.has_body = 1;
1832 if ($2 && set_parent_node($2, $$))
1833 reparent_error(scanner, "struct reparent error");
1835 | IDENTIFIER struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
1837 $$ = make_node(scanner, NODE_STRUCT);
1838 $$->u._struct.has_body = 1;
1839 $$->u._struct.name = $1;
1840 if ($3 && set_parent_node($3, $$))
1841 reparent_error(scanner, "struct reparent error");
1843 | ID_TYPE struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
1845 $$ = make_node(scanner, NODE_STRUCT);
1846 $$->u._struct.has_body = 1;
1847 $$->u._struct.name = $1;
1848 if ($3 && set_parent_node($3, $$))
1849 reparent_error(scanner, "struct reparent error");
1853 $$ = make_node(scanner, NODE_STRUCT);
1854 $$->u._struct.has_body = 0;
1855 $$->u._struct.name = $1;
1859 $$ = make_node(scanner, NODE_STRUCT);
1860 $$->u._struct.has_body = 0;
1861 $$->u._struct.name = $1;
1863 | struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end CTF_TOK_ALIGN CTF_LPAREN unary_expression CTF_RPAREN
1865 $$ = make_node(scanner, NODE_STRUCT);
1866 $$->u._struct.has_body = 1;
1867 bt_list_add_tail(&($6)->siblings, &$$->u._struct.min_align);
1868 if ($2 && set_parent_node($2, $$))
1869 reparent_error(scanner, "struct reparent error");
1871 | IDENTIFIER struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end CTF_TOK_ALIGN CTF_LPAREN unary_expression CTF_RPAREN
1873 $$ = make_node(scanner, NODE_STRUCT);
1874 $$->u._struct.has_body = 1;
1875 $$->u._struct.name = $1;
1876 bt_list_add_tail(&($7)->siblings, &$$->u._struct.min_align);
1877 if ($3 && set_parent_node($3, $$))
1878 reparent_error(scanner, "struct reparent error");
1880 | ID_TYPE struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end CTF_TOK_ALIGN CTF_LPAREN unary_expression CTF_RPAREN
1882 $$ = make_node(scanner, NODE_STRUCT);
1883 $$->u._struct.has_body = 1;
1884 $$->u._struct.name = $1;
1885 bt_list_add_tail(&($7)->siblings, &$$->u._struct.min_align);
1886 if ($3 && set_parent_node($3, $$))
1887 reparent_error(scanner, "struct reparent error");
1891 struct_declaration_begin:
1893 { push_scope(scanner); }
1896 struct_declaration_end:
1898 { pop_scope(scanner); }
1901 variant_field_class_specifier:
1902 variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
1904 $$ = make_node(scanner, NODE_VARIANT);
1905 $$->u.variant.has_body = 1;
1906 if ($2 && set_parent_node($2, $$))
1907 reparent_error(scanner, "variant reparent error");
1909 | CTF_LT IDENTIFIER CTF_GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
1911 $$ = make_node(scanner, NODE_VARIANT);
1912 $$->u.variant.has_body = 1;
1913 $$->u.variant.choice = $2;
1914 if ($5 && set_parent_node($5, $$))
1915 reparent_error(scanner, "variant reparent error");
1917 | CTF_LT ID_TYPE CTF_GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
1919 $$ = make_node(scanner, NODE_VARIANT);
1920 $$->u.variant.has_body = 1;
1921 $$->u.variant.choice = $2;
1922 if ($5 && set_parent_node($5, $$))
1923 reparent_error(scanner, "variant reparent error");
1925 | IDENTIFIER variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
1927 $$ = make_node(scanner, NODE_VARIANT);
1928 $$->u.variant.has_body = 1;
1929 $$->u.variant.name = $1;
1930 if ($3 && set_parent_node($3, $$))
1931 reparent_error(scanner, "variant reparent error");
1933 | IDENTIFIER CTF_LT IDENTIFIER CTF_GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
1935 $$ = make_node(scanner, NODE_VARIANT);
1936 $$->u.variant.has_body = 1;
1937 $$->u.variant.name = $1;
1938 $$->u.variant.choice = $3;
1939 if ($6 && set_parent_node($6, $$))
1940 reparent_error(scanner, "variant reparent error");
1942 | IDENTIFIER CTF_LT IDENTIFIER CTF_GT
1944 $$ = make_node(scanner, NODE_VARIANT);
1945 $$->u.variant.has_body = 0;
1946 $$->u.variant.name = $1;
1947 $$->u.variant.choice = $3;
1949 | IDENTIFIER CTF_LT ID_TYPE CTF_GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
1951 $$ = make_node(scanner, NODE_VARIANT);
1952 $$->u.variant.has_body = 1;
1953 $$->u.variant.name = $1;
1954 $$->u.variant.choice = $3;
1955 if ($6 && set_parent_node($6, $$))
1956 reparent_error(scanner, "variant reparent error");
1958 | IDENTIFIER CTF_LT ID_TYPE CTF_GT
1960 $$ = make_node(scanner, NODE_VARIANT);
1961 $$->u.variant.has_body = 0;
1962 $$->u.variant.name = $1;
1963 $$->u.variant.choice = $3;
1965 | ID_TYPE variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
1967 $$ = make_node(scanner, NODE_VARIANT);
1968 $$->u.variant.has_body = 1;
1969 $$->u.variant.name = $1;
1970 if ($3 && set_parent_node($3, $$))
1971 reparent_error(scanner, "variant reparent error");
1973 | ID_TYPE CTF_LT IDENTIFIER CTF_GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
1975 $$ = make_node(scanner, NODE_VARIANT);
1976 $$->u.variant.has_body = 1;
1977 $$->u.variant.name = $1;
1978 $$->u.variant.choice = $3;
1979 if ($6 && set_parent_node($6, $$))
1980 reparent_error(scanner, "variant reparent error");
1982 | ID_TYPE CTF_LT IDENTIFIER CTF_GT
1984 $$ = make_node(scanner, NODE_VARIANT);
1985 $$->u.variant.has_body = 0;
1986 $$->u.variant.name = $1;
1987 $$->u.variant.choice = $3;
1989 | ID_TYPE CTF_LT ID_TYPE CTF_GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
1991 $$ = make_node(scanner, NODE_VARIANT);
1992 $$->u.variant.has_body = 1;
1993 $$->u.variant.name = $1;
1994 $$->u.variant.choice = $3;
1995 if ($6 && set_parent_node($6, $$))
1996 reparent_error(scanner, "variant reparent error");
1998 | ID_TYPE CTF_LT ID_TYPE CTF_GT
2000 $$ = make_node(scanner, NODE_VARIANT);
2001 $$->u.variant.has_body = 0;
2002 $$->u.variant.name = $1;
2003 $$->u.variant.choice = $3;
2007 variant_declaration_begin:
2009 { push_scope(scanner); }
2012 variant_declaration_end:
2014 { pop_scope(scanner); }
2017 enum_field_class_specifier:
2018 CTF_LBRAC enumerator_list CTF_RBRAC
2020 $$ = make_node(scanner, NODE_ENUM);
2021 $$->u._enum.has_body = 1;
2022 _bt_list_splice_tail(&($2)->tmp_head, &($$)->u._enum.enumerator_list);
2024 | CTF_COLON integer_declaration_specifiers CTF_LBRAC enumerator_list CTF_RBRAC
2026 $$ = make_node(scanner, NODE_ENUM);
2027 $$->u._enum.has_body = 1;
2028 ($$)->u._enum.container_field_class = $2;
2029 _bt_list_splice_tail(&($4)->tmp_head, &($$)->u._enum.enumerator_list);
2031 | IDENTIFIER CTF_LBRAC enumerator_list CTF_RBRAC
2033 $$ = make_node(scanner, NODE_ENUM);
2034 $$->u._enum.has_body = 1;
2035 $$->u._enum.enum_id = $1;
2036 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
2038 | IDENTIFIER CTF_COLON integer_declaration_specifiers CTF_LBRAC enumerator_list CTF_RBRAC
2040 $$ = make_node(scanner, NODE_ENUM);
2041 $$->u._enum.has_body = 1;
2042 $$->u._enum.enum_id = $1;
2043 ($$)->u._enum.container_field_class = $3;
2044 _bt_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
2046 | ID_TYPE CTF_LBRAC enumerator_list CTF_RBRAC
2048 $$ = make_node(scanner, NODE_ENUM);
2049 $$->u._enum.has_body = 1;
2050 $$->u._enum.enum_id = $1;
2051 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
2053 | ID_TYPE CTF_COLON integer_declaration_specifiers CTF_LBRAC enumerator_list CTF_RBRAC
2055 $$ = make_node(scanner, NODE_ENUM);
2056 $$->u._enum.has_body = 1;
2057 $$->u._enum.enum_id = $1;
2058 ($$)->u._enum.container_field_class = $3;
2059 _bt_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
2061 | CTF_LBRAC enumerator_list CTF_COMMA CTF_RBRAC
2063 $$ = make_node(scanner, NODE_ENUM);
2064 $$->u._enum.has_body = 1;
2065 _bt_list_splice_tail(&($2)->tmp_head, &($$)->u._enum.enumerator_list);
2067 | CTF_COLON integer_declaration_specifiers CTF_LBRAC enumerator_list CTF_COMMA CTF_RBRAC
2069 $$ = make_node(scanner, NODE_ENUM);
2070 $$->u._enum.has_body = 1;
2071 ($$)->u._enum.container_field_class = $2;
2072 _bt_list_splice_tail(&($4)->tmp_head, &($$)->u._enum.enumerator_list);
2074 | IDENTIFIER CTF_LBRAC enumerator_list CTF_COMMA CTF_RBRAC
2076 $$ = make_node(scanner, NODE_ENUM);
2077 $$->u._enum.has_body = 1;
2078 $$->u._enum.enum_id = $1;
2079 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
2081 | IDENTIFIER CTF_COLON integer_declaration_specifiers CTF_LBRAC enumerator_list CTF_COMMA CTF_RBRAC
2083 $$ = make_node(scanner, NODE_ENUM);
2084 $$->u._enum.has_body = 1;
2085 $$->u._enum.enum_id = $1;
2086 ($$)->u._enum.container_field_class = $3;
2087 _bt_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
2091 $$ = make_node(scanner, NODE_ENUM);
2092 $$->u._enum.has_body = 0;
2093 $$->u._enum.enum_id = $1;
2095 | ID_TYPE CTF_LBRAC enumerator_list CTF_COMMA CTF_RBRAC
2097 $$ = make_node(scanner, NODE_ENUM);
2098 $$->u._enum.has_body = 1;
2099 $$->u._enum.enum_id = $1;
2100 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u._enum.enumerator_list);
2102 | ID_TYPE CTF_COLON integer_declaration_specifiers CTF_LBRAC enumerator_list CTF_COMMA CTF_RBRAC
2104 $$ = make_node(scanner, NODE_ENUM);
2105 $$->u._enum.has_body = 1;
2106 $$->u._enum.enum_id = $1;
2107 ($$)->u._enum.container_field_class = $3;
2108 _bt_list_splice_tail(&($5)->tmp_head, &($$)->u._enum.enumerator_list);
2112 $$ = make_node(scanner, NODE_ENUM);
2113 $$->u._enum.has_body = 0;
2114 $$->u._enum.enum_id = $1;
2118 struct_or_variant_declaration_list:
2121 | struct_or_variant_declaration_list struct_or_variant_declaration
2125 bt_list_add_tail(&($2)->siblings, &($$)->tmp_head);
2128 bt_list_add_tail(&($$)->siblings, &($$)->tmp_head);
2133 struct_or_variant_declaration:
2134 declaration_specifiers struct_or_variant_declarator_list CTF_SEMICOLON
2136 struct ctf_node *list;
2138 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2139 _bt_list_splice_tail(&($1)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2140 $$ = make_node(scanner, NODE_STRUCT_OR_VARIANT_DECLARATION);
2141 ($$)->u.struct_or_variant_declaration.field_class_specifier_list = list;
2142 _bt_list_splice_tail(&($2)->tmp_head, &($$)->u.struct_or_variant_declaration.field_class_declarators);
2144 | declaration_specifiers CTF_TYPEDEF declaration_specifiers field_class_declarator_list CTF_SEMICOLON
2146 struct ctf_node *list;
2148 $$ = make_node(scanner, NODE_TYPEDEF);
2149 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2150 $$->u.field_class_def.field_class_specifier_list = list;
2151 _bt_list_splice_tail(&($1)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2152 _bt_list_splice_tail(&($3)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2153 _bt_list_splice_tail(&($4)->tmp_head, &($$)->u.field_class_def.field_class_declarators);
2155 | CTF_TYPEDEF declaration_specifiers field_class_declarator_list CTF_SEMICOLON
2157 struct ctf_node *list;
2159 $$ = make_node(scanner, NODE_TYPEDEF);
2160 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2161 $$->u.field_class_def.field_class_specifier_list = list;
2162 _bt_list_splice_tail(&($2)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2163 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_def.field_class_declarators);
2165 | declaration_specifiers CTF_TYPEDEF field_class_declarator_list CTF_SEMICOLON
2167 struct ctf_node *list;
2169 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2170 _bt_list_splice_tail(&($1)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2171 $$ = make_node(scanner, NODE_TYPEDEF);
2172 ($$)->u.struct_or_variant_declaration.field_class_specifier_list = list;
2173 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_def.field_class_declarators);
2175 | CTF_TYPEALIAS declaration_specifiers abstract_declarator_list CTF_TYPEASSIGN alias_declaration_specifiers alias_abstract_declarator_list CTF_SEMICOLON
2177 struct ctf_node *list;
2179 $$ = make_node(scanner, NODE_TYPEALIAS);
2180 $$->u.field_class_alias.target = make_node(scanner, NODE_TYPEALIAS_TARGET);
2181 $$->u.field_class_alias.alias = make_node(scanner, NODE_TYPEALIAS_ALIAS);
2183 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2184 $$->u.field_class_alias.target->u.field_class_alias_target.field_class_specifier_list = list;
2185 _bt_list_splice_tail(&($2)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2186 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_alias.target->u.field_class_alias_target.field_class_declarators);
2188 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2189 $$->u.field_class_alias.alias->u.field_class_alias_name.field_class_specifier_list = list;
2190 _bt_list_splice_tail(&($5)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2191 _bt_list_splice_tail(&($6)->tmp_head, &($$)->u.field_class_alias.alias->u.field_class_alias_name.field_class_declarators);
2195 alias_declaration_specifiers:
2198 struct ctf_node *node;
2200 $$ = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2201 node = make_node(scanner, NODE_TYPE_SPECIFIER);
2202 node->u.field_class_specifier.type = TYPESPEC_CONST;
2203 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
2205 | field_class_specifier
2207 struct ctf_node *node;
2209 $$ = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2211 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
2215 struct ctf_node *node;
2217 add_type(scanner, $1);
2218 $$ = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2219 node = make_node(scanner, NODE_TYPE_SPECIFIER);
2220 node->u.field_class_specifier.type = TYPESPEC_ID_TYPE;
2221 node->u.field_class_specifier.id_type = yylval.s;
2222 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
2224 | alias_declaration_specifiers CTF_CONST
2226 struct ctf_node *node;
2229 node = make_node(scanner, NODE_TYPE_SPECIFIER);
2230 node->u.field_class_specifier.type = TYPESPEC_CONST;
2231 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
2233 | alias_declaration_specifiers field_class_specifier
2236 bt_list_add_tail(&($2)->siblings, &($$)->u.field_class_specifier_list.head);
2238 | alias_declaration_specifiers IDENTIFIER
2240 struct ctf_node *node;
2242 add_type(scanner, $2);
2244 node = make_node(scanner, NODE_TYPE_SPECIFIER);
2245 node->u.field_class_specifier.type = TYPESPEC_ID_TYPE;
2246 node->u.field_class_specifier.id_type = yylval.s;
2247 bt_list_add_tail(&node->siblings, &($$)->u.field_class_specifier_list.head);
2251 struct_or_variant_declarator_list:
2252 struct_or_variant_declarator
2254 | struct_or_variant_declarator_list CTF_COMMA struct_or_variant_declarator
2257 bt_list_add_tail(&($3)->siblings, &($$)->tmp_head);
2261 struct_or_variant_declarator:
2264 | CTF_COLON unary_expression
2266 | declarator CTF_COLON unary_expression
2269 if (set_parent_node($3, $1))
2270 reparent_error(scanner, "struct_or_variant_declarator");
2277 | enumerator_list CTF_COMMA enumerator
2280 bt_list_add_tail(&($3)->siblings, &($$)->tmp_head);
2287 $$ = make_node(scanner, NODE_ENUMERATOR);
2288 $$->u.enumerator.id = $1;
2292 $$ = make_node(scanner, NODE_ENUMERATOR);
2293 $$->u.enumerator.id = $1;
2297 $$ = make_node(scanner, NODE_ENUMERATOR);
2298 $$->u.enumerator.id = $1;
2300 | CTF_STRING_LITERAL
2302 $$ = make_node(scanner, NODE_ENUMERATOR);
2303 $$->u.enumerator.id = $1;
2305 | IDENTIFIER CTF_EQUAL unary_expression_or_range
2307 $$ = make_node(scanner, NODE_ENUMERATOR);
2308 $$->u.enumerator.id = $1;
2309 bt_list_splice(&($3)->tmp_head, &($$)->u.enumerator.values);
2311 | ID_TYPE CTF_EQUAL unary_expression_or_range
2313 $$ = make_node(scanner, NODE_ENUMERATOR);
2314 $$->u.enumerator.id = $1;
2315 bt_list_splice(&($3)->tmp_head, &($$)->u.enumerator.values);
2317 | keywords CTF_EQUAL unary_expression_or_range
2319 $$ = make_node(scanner, NODE_ENUMERATOR);
2320 $$->u.enumerator.id = $1;
2321 bt_list_splice(&($3)->tmp_head, &($$)->u.enumerator.values);
2323 | CTF_STRING_LITERAL CTF_EQUAL unary_expression_or_range
2325 $$ = make_node(scanner, NODE_ENUMERATOR);
2326 $$->u.enumerator.id = $1;
2327 bt_list_splice(&($3)->tmp_head, &($$)->u.enumerator.values);
2331 abstract_declarator_list:
2334 | abstract_declarator_list CTF_COMMA abstract_declarator
2337 bt_list_add_tail(&($3)->siblings, &($$)->tmp_head);
2341 abstract_declarator:
2342 direct_abstract_declarator
2344 | pointer direct_abstract_declarator
2347 bt_list_splice(&($1)->tmp_head, &($$)->u.field_class_declarator.pointers);
2351 direct_abstract_declarator:
2354 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2355 $$->u.field_class_declarator.type = TYPEDEC_ID;
2360 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2361 $$->u.field_class_declarator.type = TYPEDEC_ID;
2362 $$->u.field_class_declarator.u.id = $1;
2364 | CTF_LPAREN abstract_declarator CTF_RPAREN
2366 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2367 $$->u.field_class_declarator.type = TYPEDEC_NESTED;
2368 $$->u.field_class_declarator.u.nested.field_class_declarator = $2;
2370 | direct_abstract_declarator CTF_LSBRAC unary_expression CTF_RSBRAC
2372 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2373 $$->u.field_class_declarator.type = TYPEDEC_NESTED;
2374 $$->u.field_class_declarator.u.nested.field_class_declarator = $1;
2375 BT_INIT_LIST_HEAD(&($$)->u.field_class_declarator.u.nested.length);
2376 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_declarator.u.nested.length);
2378 | direct_abstract_declarator CTF_LSBRAC CTF_RSBRAC
2380 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2381 $$->u.field_class_declarator.type = TYPEDEC_NESTED;
2382 $$->u.field_class_declarator.u.nested.field_class_declarator = $1;
2383 $$->u.field_class_declarator.u.nested.abstract_array = 1;
2387 alias_abstract_declarator_list:
2388 alias_abstract_declarator
2390 | alias_abstract_declarator_list CTF_COMMA alias_abstract_declarator
2393 bt_list_add_tail(&($3)->siblings, &($$)->tmp_head);
2397 alias_abstract_declarator:
2398 direct_alias_abstract_declarator
2400 | pointer direct_alias_abstract_declarator
2403 bt_list_splice(&($1)->tmp_head, &($$)->u.field_class_declarator.pointers);
2407 direct_alias_abstract_declarator:
2410 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2411 $$->u.field_class_declarator.type = TYPEDEC_ID;
2414 | CTF_LPAREN alias_abstract_declarator CTF_RPAREN
2416 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2417 $$->u.field_class_declarator.type = TYPEDEC_NESTED;
2418 $$->u.field_class_declarator.u.nested.field_class_declarator = $2;
2420 | direct_alias_abstract_declarator CTF_LSBRAC unary_expression CTF_RSBRAC
2422 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2423 $$->u.field_class_declarator.type = TYPEDEC_NESTED;
2424 $$->u.field_class_declarator.u.nested.field_class_declarator = $1;
2425 BT_INIT_LIST_HEAD(&($$)->u.field_class_declarator.u.nested.length);
2426 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_declarator.u.nested.length);
2428 | direct_alias_abstract_declarator CTF_LSBRAC CTF_RSBRAC
2430 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2431 $$->u.field_class_declarator.type = TYPEDEC_NESTED;
2432 $$->u.field_class_declarator.u.nested.field_class_declarator = $1;
2433 $$->u.field_class_declarator.u.nested.abstract_array = 1;
2440 | pointer direct_declarator
2443 bt_list_splice(&($1)->tmp_head, &($$)->u.field_class_declarator.pointers);
2450 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2451 $$->u.field_class_declarator.type = TYPEDEC_ID;
2452 $$->u.field_class_declarator.u.id = $1;
2454 | CTF_LPAREN declarator CTF_RPAREN
2456 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2457 $$->u.field_class_declarator.type = TYPEDEC_NESTED;
2458 $$->u.field_class_declarator.u.nested.field_class_declarator = $2;
2460 | direct_declarator CTF_LSBRAC unary_expression CTF_RSBRAC
2462 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2463 $$->u.field_class_declarator.type = TYPEDEC_NESTED;
2464 $$->u.field_class_declarator.u.nested.field_class_declarator = $1;
2465 BT_INIT_LIST_HEAD(&($$)->u.field_class_declarator.u.nested.length);
2466 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_declarator.u.nested.length);
2470 field_class_declarator:
2471 direct_field_class_declarator
2473 | pointer direct_field_class_declarator
2476 bt_list_splice(&($1)->tmp_head, &($$)->u.field_class_declarator.pointers);
2480 direct_field_class_declarator:
2483 add_type(scanner, $1);
2484 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2485 $$->u.field_class_declarator.type = TYPEDEC_ID;
2486 $$->u.field_class_declarator.u.id = $1;
2488 | CTF_LPAREN field_class_declarator CTF_RPAREN
2490 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2491 $$->u.field_class_declarator.type = TYPEDEC_NESTED;
2492 $$->u.field_class_declarator.u.nested.field_class_declarator = $2;
2494 | direct_field_class_declarator CTF_LSBRAC unary_expression CTF_RSBRAC
2496 $$ = make_node(scanner, NODE_TYPE_DECLARATOR);
2497 $$->u.field_class_declarator.type = TYPEDEC_NESTED;
2498 $$->u.field_class_declarator.u.nested.field_class_declarator = $1;
2499 BT_INIT_LIST_HEAD(&($$)->u.field_class_declarator.u.nested.length);
2500 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_declarator.u.nested.length);
2507 $$ = make_node(scanner, NODE_POINTER);
2511 $$ = make_node(scanner, NODE_POINTER);
2512 bt_list_splice(&($2)->tmp_head, &($$)->tmp_head);
2514 | CTF_STAR type_qualifier_list pointer
2516 $$ = make_node(scanner, NODE_POINTER);
2517 $$->u.pointer.const_qualifier = 1;
2518 bt_list_splice(&($3)->tmp_head, &($$)->tmp_head);
2522 type_qualifier_list:
2523 /* pointer assumes only const type qualifier */
2525 | type_qualifier_list CTF_CONST
2528 /* 2.3: CTF-specific declarations */
2530 ctf_assignment_expression_list:
2531 ctf_assignment_expression CTF_SEMICOLON
2533 | ctf_assignment_expression_list ctf_assignment_expression CTF_SEMICOLON
2536 bt_list_add_tail(&($2)->siblings, &($$)->tmp_head);
2540 ctf_assignment_expression:
2541 unary_expression CTF_EQUAL unary_expression
2544 * Because we have left and right, cannot use
2547 $$ = make_node(scanner, NODE_CTF_EXPRESSION);
2548 _bt_list_splice_tail(&($1)->tmp_head, &($$)->u.ctf_expression.left);
2549 if ($1->u.unary_expression.type != UNARY_STRING)
2550 reparent_error(scanner, "ctf_assignment_expression left expects string");
2551 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.ctf_expression.right);
2553 | unary_expression CTF_TYPEASSIGN declaration_specifiers /* Only allow struct */
2556 * Because we have left and right, cannot use
2559 $$ = make_node(scanner, NODE_CTF_EXPRESSION);
2560 _bt_list_splice_tail(&($1)->tmp_head, &($$)->u.ctf_expression.left);
2561 if ($1->u.unary_expression.type != UNARY_STRING)
2562 reparent_error(scanner, "ctf_assignment_expression left expects string");
2563 bt_list_add_tail(&($3)->siblings, &($$)->u.ctf_expression.right);
2565 | declaration_specifiers CTF_TYPEDEF declaration_specifiers field_class_declarator_list
2567 struct ctf_node *list;
2569 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2570 _bt_list_splice_tail(&($1)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2571 _bt_list_splice_tail(&($3)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2572 $$ = make_node(scanner, NODE_TYPEDEF);
2573 ($$)->u.struct_or_variant_declaration.field_class_specifier_list = list;
2574 _bt_list_splice_tail(&($4)->tmp_head, &($$)->u.field_class_def.field_class_declarators);
2576 | CTF_TYPEDEF declaration_specifiers field_class_declarator_list
2578 struct ctf_node *list;
2580 $$ = make_node(scanner, NODE_TYPEDEF);
2581 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2582 $$->u.field_class_def.field_class_specifier_list = list;
2583 _bt_list_splice_tail(&($2)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2584 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_def.field_class_declarators);
2586 | declaration_specifiers CTF_TYPEDEF field_class_declarator_list
2588 struct ctf_node *list;
2590 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2591 _bt_list_splice_tail(&($1)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2592 $$ = make_node(scanner, NODE_TYPEDEF);
2593 ($$)->u.struct_or_variant_declaration.field_class_specifier_list = list;
2594 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_def.field_class_declarators);
2596 | CTF_TYPEALIAS declaration_specifiers abstract_declarator_list CTF_TYPEASSIGN alias_declaration_specifiers alias_abstract_declarator_list
2598 struct ctf_node *list;
2600 $$ = make_node(scanner, NODE_TYPEALIAS);
2601 $$->u.field_class_alias.target = make_node(scanner, NODE_TYPEALIAS_TARGET);
2602 $$->u.field_class_alias.alias = make_node(scanner, NODE_TYPEALIAS_ALIAS);
2604 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2605 $$->u.field_class_alias.target->u.field_class_alias_target.field_class_specifier_list = list;
2606 _bt_list_splice_tail(&($2)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2607 _bt_list_splice_tail(&($3)->tmp_head, &($$)->u.field_class_alias.target->u.field_class_alias_target.field_class_declarators);
2609 list = make_node(scanner, NODE_TYPE_SPECIFIER_LIST);
2610 $$->u.field_class_alias.alias->u.field_class_alias_name.field_class_specifier_list = list;
2611 _bt_list_splice_tail(&($5)->u.field_class_specifier_list.head, &list->u.field_class_specifier_list.head);
2612 _bt_list_splice_tail(&($6)->tmp_head, &($$)->u.field_class_alias.alias->u.field_class_alias_name.field_class_declarators);