Add structure align() attribute, fix empty string support in definition paths
[babeltrace.git] / formats / ctf / metadata / ctf-parser.y
index bbfbbeee707f1fd855de334bc223bceb4bc0bc00..ed766952c175d32ad4412398d27e6431db14c4df 100644 (file)
 #include <errno.h>
 #include <inttypes.h>
 #include <babeltrace/list.h>
+#include <babeltrace/babeltrace.h>
 #include "ctf-scanner.h"
 #include "ctf-parser.h"
 #include "ctf-ast.h"
 
+int yydebug;
+
 /*
  * TODO: support enum, variant and struct declarations in scopes.
  */
@@ -47,8 +50,6 @@ _cds_list_splice_tail (struct cds_list_head *add, struct cds_list_head *head)
        }
 }
 
-#define printf_dbg(fmt, args...)       fprintf(stderr, "%s: " fmt, __func__, ## args)
-
 int yyparse(struct ctf_scanner *scanner);
 int yylex(union YYSTYPE *yyval, struct ctf_scanner *scanner);
 int yylex_init_extra(struct ctf_scanner *scanner, yyscan_t * ptr_yy_globals);
@@ -171,7 +172,7 @@ static void push_scope(struct ctf_scanner *scanner)
 {
        struct ctf_scanner_scope *ns;
 
-       printf_dbg("push scope\n");
+       printf_debug("push scope\n");
        ns = malloc(sizeof(struct ctf_scanner_scope));
        init_scope(ns, scanner->cs);
        scanner->cs = ns;
@@ -181,7 +182,7 @@ static void pop_scope(struct ctf_scanner *scanner)
 {
        struct ctf_scanner_scope *os;
 
-       printf_dbg("pop scope\n");
+       printf_debug("pop scope\n");
        os = scanner->cs;
        scanner->cs = os->parent;
        finalize_scope(os);
@@ -193,7 +194,7 @@ static int lookup_type(struct ctf_scanner_scope *s, const char *id)
        int ret;
 
        ret = (int) (long) g_hash_table_lookup(s->types, id);
-       printf_dbg("lookup %p %s %d\n", s, id, ret);
+       printf_debug("lookup %p %s %d\n", s, id, ret);
        return ret;
 }
 
@@ -208,13 +209,13 @@ int is_type(struct ctf_scanner *scanner, const char *id)
                        break;
                }
        }
-       printf_dbg("is type %s %d\n", id, ret);
+       printf_debug("is type %s %d\n", id, ret);
        return ret;
 }
 
 static void add_type(struct ctf_scanner *scanner, struct gc_string *id)
 {
-       printf_dbg("add type %s\n", id->s);
+       printf_debug("add type %s\n", id->s);
        if (lookup_type(scanner->cs, id->s))
                return;
        g_hash_table_insert(scanner->cs->types, id->s, id->s);
@@ -303,6 +304,7 @@ static struct ctf_node *make_node(struct ctf_scanner *scanner,
                break;
        case NODE_STRUCT:
                CDS_INIT_LIST_HEAD(&node->u._struct.declaration_list);
+               CDS_INIT_LIST_HEAD(&node->u._struct.min_align);
                break;
 
        case NODE_UNKNOWN:
@@ -790,6 +792,8 @@ struct ctf_scanner *ctf_scanner_alloc(FILE *input)
        struct ctf_scanner *scanner;
        int ret;
 
+       yydebug = babeltrace_debug;
+
        scanner = malloc(sizeof(*scanner));
        if (!scanner)
                return NULL;
@@ -855,7 +859,7 @@ void ctf_scanner_free(struct ctf_scanner *scanner)
  */
 %expect 2
 %start file
-%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
+%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 TOK_ALIGN
 %token <gs> IDENTIFIER ID_TYPE
 %token ERROR
 %union
@@ -968,6 +972,8 @@ keywords:
                {       $$ = yylval.gs;         }
        |       TRACE
                {       $$ = yylval.gs;         }
+       |       TOK_ALIGN
+               {       $$ = yylval.gs;         }
        ;
 
 /* 1.5 Constants */
@@ -1516,6 +1522,12 @@ type_specifier:
                        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);
@@ -1586,6 +1598,32 @@ struct_type_specifier:
                        $$->u._struct.has_body = 0;
                        $$->u._struct.name = $1->s;
                }
+       |       struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end TOK_ALIGN LPAREN unary_expression RPAREN
+               {
+                       $$ = make_node(scanner, NODE_STRUCT);
+                       $$->u._struct.has_body = 1;
+                       cds_list_add_tail(&($6)->siblings, &$$->u._struct.min_align);
+                       if ($2 && set_parent_node($2, $$))
+                               reparent_error(scanner, "struct reparent error");
+               }
+       |       IDENTIFIER struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end TOK_ALIGN LPAREN unary_expression RPAREN
+               {
+                       $$ = make_node(scanner, NODE_STRUCT);
+                       $$->u._struct.has_body = 1;
+                       $$->u._struct.name = $1->s;
+                       cds_list_add_tail(&($7)->siblings, &$$->u._struct.min_align);
+                       if ($3 && set_parent_node($3, $$))
+                               reparent_error(scanner, "struct reparent error");
+               }
+       |       ID_TYPE struct_declaration_begin struct_or_variant_declaration_list struct_declaration_end TOK_ALIGN LPAREN unary_expression RPAREN
+               {
+                       $$ = make_node(scanner, NODE_STRUCT);
+                       $$->u._struct.has_body = 1;
+                       $$->u._struct.name = $1->s;
+                       cds_list_add_tail(&($7)->siblings, &$$->u._struct.min_align);
+                       if ($3 && set_parent_node($3, $$))
+                               reparent_error(scanner, "struct reparent error");
+               }
        ;
 
 struct_declaration_begin:
This page took 0.025456 seconds and 4 git commands to generate.