5 * Common Trace Format Metadata Grammar.
13 #include <helpers/list.h>
15 #include "ctf-scanner.h"
16 #include "ctf-parser.h"
19 #define printf_dbg(fmt, args...) fprintf(stderr, "%s: " fmt, __func__, args)
20 #define printf_dbg_noarg(fmt) fprintf(stderr, "%s: " fmt, __func__)
22 int yyparse(struct ctf_scanner *scanner);
23 int yylex(union YYSTYPE *yyval, struct ctf_scanner *scanner);
24 int yylex_init_extra(struct ctf_scanner *scanner, yyscan_t * ptr_yy_globals);
25 int yylex_destroy(yyscan_t yyscanner) ;
26 void yyset_in(FILE * in_str, yyscan_t scanner);
31 struct cds_list_head gc;
35 char *strredup(char **dest, const char *src)
37 size_t len = strlen(src) + 1;
39 *dest = realloc(*dest, len);
46 static struct gc_string *gc_string_alloc(struct ctf_scanner *scanner, size_t len)
48 struct gc_string *gstr;
50 gstr = malloc(sizeof(*gstr) + len);
51 cds_list_add(&gstr->gc, &scanner->allocated_strings);
55 void setstring(struct ctf_scanner *scanner, YYSTYPE *lvalp, const char *src)
57 lvalp->gs = gc_string_alloc(scanner, strlen(src) + 1);
58 strcpy(lvalp->gs->s, src);
61 static void init_scope(struct scope *scope, struct scope *parent)
63 scope->parent = parent;
64 scope->types = g_hash_table_new_full(g_str_hash, g_str_equal,
65 (GDestroyNotify) free, NULL);
68 static void finalize_scope(struct scope *scope)
70 g_hash_table_destroy(scope->types);
73 static void push_scope(struct ctf_scanner *scanner)
77 printf_dbg_noarg("push scope\n");
78 ns = malloc(sizeof(struct scope));
79 init_scope(ns, scanner->cs);
83 static void pop_scope(struct ctf_scanner *scanner)
87 printf_dbg_noarg("pop scope\n");
89 scanner->cs = os->parent;
94 static int lookup_type(struct scope *s, const char *id)
98 ret = (int) g_hash_table_lookup(s->types, id);
99 printf_dbg("lookup %p %s %d\n", s, id, ret);
103 int is_type(struct ctf_scanner *scanner, const char *id)
108 for (it = scanner->cs; it != NULL; it = it->parent) {
109 if (lookup_type(it, id)) {
114 printf_dbg("is type %s %d\n", id, ret);
118 static void add_type(struct ctf_scanner *scanner, const char *id)
120 char *type_id = NULL;
122 printf_dbg("add type %s\n", id);
123 if (lookup_type(scanner->cs, id))
125 strredup(&type_id, id);
126 g_hash_table_insert(scanner->cs->types, type_id, type_id);
129 void yyerror(struct ctf_scanner *scanner, const char *str)
131 fprintf(stderr, "error %s\n", str);
139 static void free_strings(struct cds_list_head *list)
141 struct gc_string *gstr, *tmp;
143 cds_list_for_each_entry_safe(gstr, tmp, list, gc)
147 static struct ctf_ast *ctf_ast_alloc(void)
151 ast = malloc(sizeof(*ast));
154 memset(ast, 0, sizeof(*ast));
158 static void ctf_ast_free(struct ctf_ast *ast)
162 int ctf_scanner_append_ast(struct ctf_scanner *scanner)
164 return yyparse(scanner);
167 struct ctf_scanner *ctf_scanner_alloc(FILE *input)
169 struct ctf_scanner *scanner;
172 scanner = malloc(sizeof(*scanner));
175 memset(scanner, 0, sizeof(*scanner));
177 ret = yylex_init_extra(scanner, &scanner->scanner);
179 fprintf(stderr, "yylex_init error\n");
180 goto cleanup_scanner;
182 yyset_in(input, scanner);
184 scanner->ast = ctf_ast_alloc();
187 init_scope(&scanner->root_scope, NULL);
188 CDS_INIT_LIST_HEAD(&scanner->allocated_strings);
193 ret = yylex_destroy(scanner->scanner);
195 fprintf(stderr, "yylex_destroy error\n");
201 void ctf_scanner_free(struct ctf_scanner *scanner)
205 finalize_scope(&scanner->root_scope);
206 free_strings(&scanner->allocated_strings);
207 ctf_ast_free(scanner->ast);
208 ret = yylex_destroy(scanner->scanner);
210 fprintf(stderr, "yylex_destroy error\n");
218 %parse-param {struct ctf_scanner *scanner}
219 %lex-param {struct ctf_scanner *scanner}
221 %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
222 %token <gs> IDENTIFIER ID_TYPE
228 struct gc_string *gs;
268 | c_char_sequence c_char
276 /* 1.6 String literals */
280 | s_char_sequence s_char
288 /* 2: Phrase structure grammar */
296 | HEXADECIMAL_CONSTANT
297 | STRING_LITERAL_START DQUOTE
298 | STRING_LITERAL_START s_char_sequence DQUOTE
299 | CHARACTER_CONSTANT_START c_char_sequence SQUOTE
300 | LPAREN unary_expression RPAREN
301 | postfix_expression LSBRAC unary_expression RSBRAC
302 | postfix_expression DOT IDENTIFIER
303 | postfix_expression DOT ID_TYPE
304 | postfix_expression RARROW IDENTIFIER
305 | postfix_expression RARROW ID_TYPE
310 | PLUS postfix_expression
311 | MINUS postfix_expression
314 unary_expression_or_range:
315 unary_expression DOTDOTDOT unary_expression
319 /* 2.2: Declarations */
322 declaration_specifiers SEMICOLON
326 | declaration_specifiers TYPEDEF declaration_specifiers type_declarator_list SEMICOLON
327 | TYPEDEF declaration_specifiers type_declarator_list SEMICOLON
328 | declaration_specifiers TYPEDEF type_declarator_list SEMICOLON
329 | TYPEALIAS declaration_specifiers abstract_declarator_list COLON declaration_specifiers abstract_type_declarator_list SEMICOLON
330 | TYPEALIAS declaration_specifiers abstract_declarator_list COLON type_declarator_list SEMICOLON
334 event_declaration_begin event_declaration_end
335 | event_declaration_begin ctf_assignment_expression_list event_declaration_end
338 event_declaration_begin:
345 event_declaration_end:
354 stream_declaration_begin stream_declaration_end
355 | stream_declaration_begin ctf_assignment_expression_list stream_declaration_end
358 stream_declaration_begin:
365 stream_declaration_end:
374 trace_declaration_begin trace_declaration_end
375 | trace_declaration_begin ctf_assignment_expression_list trace_declaration_end
378 trace_declaration_begin:
385 trace_declaration_end:
392 declaration_specifiers:
395 | declaration_specifiers CONST
396 | declaration_specifiers type_specifier
399 type_declarator_list:
401 | type_declarator_list COMMA type_declarator
404 abstract_type_declarator_list:
405 abstract_type_declarator
406 | abstract_type_declarator_list COMMA abstract_type_declarator
422 | FLOATING_POINT LBRAC RBRAC
423 | FLOATING_POINT LBRAC ctf_assignment_expression_list RBRAC
424 | INTEGER LBRAC RBRAC
425 | INTEGER LBRAC ctf_assignment_expression_list RBRAC
427 | STRING LBRAC ctf_assignment_expression_list RBRAC
428 | ENUM enum_type_specifier
429 | VARIANT variant_type_specifier
430 | STRUCT struct_type_specifier
433 struct_type_specifier:
434 struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
435 | IDENTIFIER struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
436 | ID_TYPE struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
441 struct_declaration_begin:
448 struct_declaration_end:
455 variant_type_specifier:
456 variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
457 | LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
458 | LT ID_TYPE GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
459 | IDENTIFIER variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
460 | IDENTIFIER LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
461 | IDENTIFIER LT IDENTIFIER GT
462 | IDENTIFIER LT ID_TYPE GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
463 | IDENTIFIER LT ID_TYPE GT
464 | ID_TYPE variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
465 | ID_TYPE LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
466 | ID_TYPE LT IDENTIFIER GT
467 | ID_TYPE LT ID_TYPE GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
468 | ID_TYPE LT ID_TYPE GT
471 variant_declaration_begin:
478 variant_declaration_end:
485 type_specifier_or_integer_constant:
486 declaration_specifiers
489 | HEXADECIMAL_CONSTANT
493 LBRAC enumerator_list RBRAC
494 | LT type_specifier_or_integer_constant GT LBRAC enumerator_list RBRAC
495 | IDENTIFIER LBRAC enumerator_list RBRAC
496 | IDENTIFIER LT type_specifier_or_integer_constant GT LBRAC enumerator_list RBRAC
497 | ID_TYPE LBRAC enumerator_list RBRAC
498 | ID_TYPE LT type_specifier_or_integer_constant GT LBRAC enumerator_list RBRAC
499 | LBRAC enumerator_list COMMA RBRAC
500 | LT type_specifier_or_integer_constant GT LBRAC enumerator_list COMMA RBRAC
501 | IDENTIFIER LBRAC enumerator_list COMMA RBRAC
502 | IDENTIFIER LT type_specifier_or_integer_constant GT LBRAC enumerator_list COMMA RBRAC
504 | IDENTIFIER LT type_specifier_or_integer_constant GT
505 | ID_TYPE LBRAC enumerator_list COMMA RBRAC
506 | ID_TYPE LT type_specifier_or_integer_constant GT LBRAC enumerator_list COMMA RBRAC
508 | ID_TYPE LT type_specifier_or_integer_constant GT
511 struct_or_variant_declaration_list:
513 | struct_or_variant_declaration_list struct_or_variant_declaration
516 struct_or_variant_declaration:
517 specifier_qualifier_list struct_or_variant_declarator_list SEMICOLON
518 | specifier_qualifier_list TYPEDEF specifier_qualifier_list type_declarator_list SEMICOLON
519 | TYPEDEF specifier_qualifier_list type_declarator_list SEMICOLON
520 | specifier_qualifier_list TYPEDEF type_declarator_list SEMICOLON
521 | TYPEALIAS specifier_qualifier_list abstract_declarator_list COLON specifier_qualifier_list abstract_type_declarator_list SEMICOLON
522 | TYPEALIAS specifier_qualifier_list abstract_declarator_list COLON type_declarator_list SEMICOLON
525 specifier_qualifier_list:
528 | specifier_qualifier_list CONST
529 | specifier_qualifier_list type_specifier
532 struct_or_variant_declarator_list:
533 struct_or_variant_declarator
534 | struct_or_variant_declarator_list COMMA struct_or_variant_declarator
537 struct_or_variant_declarator:
539 | COLON unary_expression
540 | declarator COLON unary_expression
545 | enumerator_list COMMA enumerator
552 | STRING_LITERAL_START DQUOTE
553 | STRING_LITERAL_START s_char_sequence DQUOTE
554 | IDENTIFIER EQUAL unary_expression_or_range
555 | ID_TYPE EQUAL unary_expression_or_range
556 | keywords EQUAL unary_expression_or_range
557 | STRING_LITERAL_START DQUOTE EQUAL unary_expression_or_range
558 | STRING_LITERAL_START s_char_sequence DQUOTE EQUAL unary_expression_or_range
561 abstract_declarator_list:
563 | abstract_declarator_list COMMA abstract_declarator
567 direct_abstract_declarator
568 | pointer direct_abstract_declarator
571 direct_abstract_declarator:
574 | LPAREN abstract_declarator RPAREN
575 | direct_abstract_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
576 | direct_abstract_declarator LSBRAC RSBRAC
581 | pointer direct_declarator
586 | LPAREN declarator RPAREN
587 | direct_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
591 direct_type_declarator
592 | pointer direct_type_declarator
595 direct_type_declarator:
598 add_type(scanner, $1->s);
600 | LPAREN type_declarator RPAREN
601 | direct_type_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
604 abstract_type_declarator:
605 direct_abstract_type_declarator
606 | pointer direct_abstract_type_declarator
609 direct_abstract_type_declarator:
613 add_type(scanner, $1->s);
615 | LPAREN abstract_type_declarator RPAREN
616 | direct_abstract_type_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
617 | direct_abstract_type_declarator LSBRAC RSBRAC
623 | STAR type_qualifier_list pointer
628 | type_qualifier_list CONST
631 /* 2.3: CTF-specific declarations */
633 ctf_assignment_expression_list:
634 ctf_assignment_expression SEMICOLON
635 | ctf_assignment_expression_list ctf_assignment_expression SEMICOLON
638 ctf_assignment_expression:
639 unary_expression EQUAL unary_expression
640 | unary_expression TYPEASSIGN type_specifier
641 | declaration_specifiers TYPEDEF declaration_specifiers type_declarator_list
642 | TYPEDEF declaration_specifiers type_declarator_list
643 | declaration_specifiers TYPEDEF type_declarator_list
644 | TYPEALIAS declaration_specifiers abstract_declarator_list COLON declaration_specifiers abstract_type_declarator_list
645 | TYPEALIAS declaration_specifiers abstract_declarator_list COLON type_declarator_list