5 * Common Trace Format Metadata Grammar.
13 #include <helpers/list.h>
15 #include "ctf-parser.h"
18 #define printf_dbg(fmt, args...) fprintf(stderr, "%s: " fmt, __func__, args)
19 #define printf_dbg_noarg(fmt) fprintf(stderr, "%s: " fmt, __func__)
24 static CDS_LIST_HEAD(allocated_strings);
34 struct cds_list_head gc;
38 struct scope root_scope;
39 struct scope *cs = &root_scope; /* current scope */
41 char *strredup(char **dest, const char *src)
43 size_t len = strlen(src) + 1;
45 *dest = realloc(*dest, len);
52 static struct gc_string *gc_string_alloc(size_t len)
54 struct gc_string *gstr;
56 gstr = malloc(sizeof(*gstr) + len);
57 cds_list_add(&gstr->gc, &allocated_strings);
61 void setstring(const char *src)
63 yylval.gs = gc_string_alloc(strlen(src) + 1);
64 strcpy(yylval.gs->s, src);
67 static void init_scope(struct scope *scope, struct scope *parent)
69 scope->parent = parent;
70 scope->types = g_hash_table_new_full(g_str_hash, g_str_equal,
71 (GDestroyNotify) free, NULL);
74 static void finalize_scope(struct scope *scope)
76 g_hash_table_destroy(scope->types);
79 static void push_scope(void)
83 printf_dbg_noarg("push scope\n");
84 ns = malloc(sizeof(struct scope));
89 static void pop_scope(void)
93 printf_dbg_noarg("pop scope\n");
100 int lookup_type(struct scope *s, const char *id)
104 ret = (int) g_hash_table_lookup(s->types, id);
105 printf_dbg("lookup %p %s %d\n", s, id, ret);
109 int is_type(const char *id)
114 for (it = cs; it != NULL; it = it->parent) {
115 if (lookup_type(it, id)) {
120 printf_dbg("is type %s %d\n", id, ret);
124 static void add_type(const char *id)
126 char *type_id = NULL;
128 printf_dbg("add type %s\n", id);
129 if (lookup_type(cs, id))
131 strredup(&type_id, id);
132 g_hash_table_insert(cs->types, type_id, type_id);
135 void yyerror(const char *str)
137 fprintf(stderr, "error %s\n", str);
145 static void free_strings(void)
147 struct gc_string *gstr, *tmp;
149 cds_list_for_each_entry_safe(gstr, tmp, &allocated_strings, gc)
153 int main(int argc, char **argv)
156 init_scope(&root_scope, NULL);
158 finalize_scope(&root_scope);
167 %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
168 %token <gs> IDENTIFIER ID_TYPE
174 struct gc_string *gs;
178 /* %token <c>UPPERCASE_L LOWERCASE_L _U _NONDIGIT */
179 /*%type <n> decl type_decl event_decl stream_decl trace_decl type_def
180 %type <n> event_attrib field_attrib assign_attrib
181 %type <n> event_attrib_list attrib_list field_list appendval_list
182 %type <n> field value type_expr typename typename_postfix
183 %type <gs> typename_prefix identifier */
220 | c_char_sequence c_char
228 /* 1.6 String literals */
232 | s_char_sequence s_char
240 /* 2: Phrase structure grammar */
248 | HEXADECIMAL_CONSTANT
249 | STRING_LITERAL_START DQUOTE
250 | STRING_LITERAL_START s_char_sequence DQUOTE
251 | CHARACTER_CONSTANT_START c_char_sequence SQUOTE
252 | LPAREN unary_expression RPAREN
253 | postfix_expression LSBRAC unary_expression RSBRAC
254 | postfix_expression DOT IDENTIFIER
255 | postfix_expression DOT ID_TYPE
256 | postfix_expression RARROW IDENTIFIER
257 | postfix_expression RARROW ID_TYPE
262 | PLUS postfix_expression
263 | MINUS postfix_expression
266 unary_expression_or_range:
267 unary_expression DOTDOTDOT unary_expression
271 /* 2.2: Declarations */
274 declaration_specifiers SEMICOLON
278 | declaration_specifiers TYPEDEF declaration_specifiers type_declarator_list SEMICOLON
279 | TYPEDEF declaration_specifiers type_declarator_list SEMICOLON
280 | declaration_specifiers TYPEDEF type_declarator_list SEMICOLON
281 | TYPEALIAS declaration_specifiers abstract_declarator_list COLON declaration_specifiers abstract_type_declarator_list SEMICOLON
282 | TYPEALIAS declaration_specifiers abstract_declarator_list COLON type_declarator_list SEMICOLON
286 event_declaration_begin event_declaration_end
287 | event_declaration_begin ctf_assignment_expression_list event_declaration_end
290 event_declaration_begin:
297 event_declaration_end:
306 stream_declaration_begin stream_declaration_end
307 | stream_declaration_begin ctf_assignment_expression_list stream_declaration_end
310 stream_declaration_begin:
317 stream_declaration_end:
326 trace_declaration_begin trace_declaration_end
327 | trace_declaration_begin ctf_assignment_expression_list trace_declaration_end
330 trace_declaration_begin:
337 trace_declaration_end:
344 declaration_specifiers:
347 | declaration_specifiers CONST
348 | declaration_specifiers type_specifier
351 type_declarator_list:
353 | type_declarator_list COMMA type_declarator
356 abstract_type_declarator_list:
357 abstract_type_declarator
358 | abstract_type_declarator_list COMMA abstract_type_declarator
374 | FLOATING_POINT LBRAC RBRAC
375 | FLOATING_POINT LBRAC ctf_assignment_expression_list RBRAC
376 | INTEGER LBRAC RBRAC
377 | INTEGER LBRAC ctf_assignment_expression_list RBRAC
379 | STRING LBRAC ctf_assignment_expression_list RBRAC
380 | ENUM enum_type_specifier
381 | VARIANT variant_type_specifier
382 | STRUCT struct_type_specifier
385 struct_type_specifier:
386 struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
387 | IDENTIFIER struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
388 | ID_TYPE struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end
393 struct_declaration_begin:
400 struct_declaration_end:
407 variant_type_specifier:
408 variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
409 | LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
410 | LT ID_TYPE GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
411 | IDENTIFIER variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
412 | IDENTIFIER LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
413 | IDENTIFIER LT IDENTIFIER GT
414 | IDENTIFIER LT ID_TYPE GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
415 | IDENTIFIER LT ID_TYPE GT
416 | ID_TYPE variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
417 | ID_TYPE LT IDENTIFIER GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
418 | ID_TYPE LT IDENTIFIER GT
419 | ID_TYPE LT ID_TYPE GT variant_declaration_begin struct_or_variant_declaration_list variant_declaration_end
420 | ID_TYPE LT ID_TYPE GT
423 variant_declaration_begin:
430 variant_declaration_end:
437 type_specifier_or_integer_constant:
438 declaration_specifiers
441 | HEXADECIMAL_CONSTANT
445 LBRAC enumerator_list RBRAC
446 | LT type_specifier_or_integer_constant GT LBRAC enumerator_list RBRAC
447 | IDENTIFIER LBRAC enumerator_list RBRAC
448 | IDENTIFIER LT type_specifier_or_integer_constant GT LBRAC enumerator_list RBRAC
449 | ID_TYPE LBRAC enumerator_list RBRAC
450 | ID_TYPE LT type_specifier_or_integer_constant GT LBRAC enumerator_list RBRAC
451 | LBRAC enumerator_list COMMA RBRAC
452 | LT type_specifier_or_integer_constant GT LBRAC enumerator_list COMMA RBRAC
453 | IDENTIFIER LBRAC enumerator_list COMMA RBRAC
454 | IDENTIFIER LT type_specifier_or_integer_constant GT LBRAC enumerator_list COMMA RBRAC
456 | IDENTIFIER LT type_specifier_or_integer_constant GT
457 | ID_TYPE LBRAC enumerator_list COMMA RBRAC
458 | ID_TYPE LT type_specifier_or_integer_constant GT LBRAC enumerator_list COMMA RBRAC
460 | ID_TYPE LT type_specifier_or_integer_constant GT
463 struct_or_variant_declaration_list:
465 | struct_or_variant_declaration_list struct_or_variant_declaration
468 struct_or_variant_declaration:
469 specifier_qualifier_list struct_or_variant_declarator_list SEMICOLON
470 | specifier_qualifier_list TYPEDEF specifier_qualifier_list type_declarator_list SEMICOLON
471 | TYPEDEF specifier_qualifier_list type_declarator_list SEMICOLON
472 | specifier_qualifier_list TYPEDEF type_declarator_list SEMICOLON
473 | TYPEALIAS specifier_qualifier_list abstract_declarator_list COLON specifier_qualifier_list abstract_type_declarator_list SEMICOLON
474 | TYPEALIAS specifier_qualifier_list abstract_declarator_list COLON type_declarator_list SEMICOLON
477 specifier_qualifier_list:
480 | specifier_qualifier_list CONST
481 | specifier_qualifier_list type_specifier
484 struct_or_variant_declarator_list:
485 struct_or_variant_declarator
486 | struct_or_variant_declarator_list COMMA struct_or_variant_declarator
489 struct_or_variant_declarator:
491 | COLON unary_expression
492 | declarator COLON unary_expression
497 | enumerator_list COMMA enumerator
504 | STRING_LITERAL_START DQUOTE
505 | STRING_LITERAL_START s_char_sequence DQUOTE
506 | IDENTIFIER EQUAL unary_expression_or_range
507 | ID_TYPE EQUAL unary_expression_or_range
508 | keywords EQUAL unary_expression_or_range
509 | STRING_LITERAL_START DQUOTE EQUAL unary_expression_or_range
510 | STRING_LITERAL_START s_char_sequence DQUOTE EQUAL unary_expression_or_range
513 abstract_declarator_list:
515 | abstract_declarator_list COMMA abstract_declarator
519 direct_abstract_declarator
520 | pointer direct_abstract_declarator
523 direct_abstract_declarator:
526 | LPAREN abstract_declarator RPAREN
527 | direct_abstract_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
528 | direct_abstract_declarator LSBRAC RSBRAC
533 | pointer direct_declarator
538 | LPAREN declarator RPAREN
539 | direct_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
543 direct_type_declarator
544 | pointer direct_type_declarator
547 direct_type_declarator:
552 | LPAREN type_declarator RPAREN
553 | direct_type_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
556 abstract_type_declarator:
557 direct_abstract_type_declarator
558 | pointer direct_abstract_type_declarator
561 direct_abstract_type_declarator:
567 | LPAREN abstract_type_declarator RPAREN
568 | direct_abstract_type_declarator LSBRAC type_specifier_or_integer_constant RSBRAC
569 | direct_abstract_type_declarator LSBRAC RSBRAC
575 | STAR type_qualifier_list pointer
580 | type_qualifier_list CONST
583 /* 2.3: CTF-specific declarations */
585 ctf_assignment_expression_list:
586 ctf_assignment_expression SEMICOLON
587 | ctf_assignment_expression_list ctf_assignment_expression SEMICOLON
590 ctf_assignment_expression:
591 unary_expression EQUAL unary_expression
592 | unary_expression TYPEASSIGN type_specifier
593 | declaration_specifiers TYPEDEF declaration_specifiers type_declarator_list
594 | TYPEDEF declaration_specifiers type_declarator_list
595 | declaration_specifiers TYPEDEF type_declarator_list
596 | TYPEALIAS declaration_specifiers abstract_declarator_list COLON declaration_specifiers abstract_type_declarator_list
597 | TYPEALIAS declaration_specifiers abstract_declarator_list COLON type_declarator_list