#include <errno.h>
#include <inttypes.h>
#include <babeltrace/list.h>
-#include <babeltrace/babeltrace.h>
+#include <babeltrace/babeltrace-internal.h>
#include "ctf-scanner.h"
#include "ctf-parser.h"
#include "ctf-ast.h"
int yydebug;
-/*
- * TODO: support enum, variant and struct declarations in scopes.
- */
-
/* Join two lists, put "add" at the end of "head". */
static inline void
_cds_list_splice_tail (struct cds_list_head *add, struct cds_list_head *head)
[ NODE_EVENT ] = "NODE_EVENT",
[ NODE_STREAM ] = "NODE_STREAM",
[ NODE_TRACE ] = "NODE_TRACE",
+ [ NODE_CLOCK ] = "NODE_CLOCK",
[ NODE_CTF_EXPRESSION ] = "NODE_CTF_EXPRESSION",
[ NODE_UNARY_EXPRESSION ] = "NODE_UNARY_EXPRESSION",
[ NODE_TYPEDEF ] = "NODE_TYPEDEF",
case NODE_TRACE:
CDS_INIT_LIST_HEAD(&node->u.trace.declaration_list);
break;
+ case NODE_CLOCK:
+ CDS_INIT_LIST_HEAD(&node->u.clock.declaration_list);
+ break;
case NODE_CTF_EXPRESSION:
CDS_INIT_LIST_HEAD(&node->u.ctf_expression.left);
case NODE_TRACE:
_cds_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
break;
+ case NODE_CLOCK:
+ _cds_list_splice_tail(&node->tmp_head, &parent->u.clock.declaration_list);
+ break;
case NODE_FLOATING_POINT:
_cds_list_splice_tail(&node->tmp_head, &parent->u.floating_point.expressions);
break;
case NODE_TRACE:
_cds_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
break;
+ case NODE_CLOCK:
+ _cds_list_splice_tail(&node->tmp_head, &parent->u.clock.declaration_list);
+ break;
case NODE_VARIANT:
_cds_list_splice_tail(&node->tmp_head, &parent->u.variant.declaration_list);
break;
case NODE_TRACE:
_cds_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
break;
+ case NODE_CLOCK:
+ _cds_list_splice_tail(&node->tmp_head, &parent->u.clock.declaration_list);
+ break;
case NODE_VARIANT:
_cds_list_splice_tail(&node->tmp_head, &parent->u.variant.declaration_list);
break;
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
+ case NODE_CLOCK:
case NODE_VARIANT:
case NODE_STRUCT:
case NODE_TYPEDEF:
case NODE_TRACE:
cds_list_add_tail(&node->siblings, &parent->u.trace.declaration_list);
break;
+ case NODE_CLOCK:
+ cds_list_add_tail(&node->siblings, &parent->u.clock.declaration_list);
+ break;
case NODE_VARIANT:
cds_list_add_tail(&node->siblings, &parent->u.variant.declaration_list);
break;
case NODE_TYPEALIAS_ALIAS:
parent->u.typealias_alias.type_specifier_list = node;
break;
- case NODE_TYPE_DECLARATOR:
- parent->u.type_declarator.type = TYPEDEC_NESTED;
- parent->u.type_declarator.u.nested.length = node;
- break;
case NODE_ENUM:
parent->u._enum.container_type = node;
break;
case NODE_STRUCT_OR_VARIANT_DECLARATION:
parent->u.struct_or_variant_declaration.type_specifier_list = node;
break;
+ case NODE_TYPE_DECLARATOR:
case NODE_TYPE_SPECIFIER:
case NODE_TYPEALIAS:
case NODE_FLOATING_POINT:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
+ case NODE_CLOCK:
case NODE_VARIANT:
case NODE_STRUCT:
case NODE_TYPEALIAS:
return -EPERM;
}
break;
+ case NODE_CLOCK:
+ if (parent->type == NODE_ROOT) {
+ _cds_list_splice_tail(&node->tmp_head, &parent->u.root.clock);
+ } else {
+ return -EPERM;
+ }
+ break;
case NODE_CTF_EXPRESSION:
return reparent_ctf_expression(node, parent);
CDS_INIT_LIST_HEAD(&ast->root.u.root.trace);
CDS_INIT_LIST_HEAD(&ast->root.u.root.stream);
CDS_INIT_LIST_HEAD(&ast->root.u.root.event);
+ CDS_INIT_LIST_HEAD(&ast->root.u.root.clock);
return ast;
}
*/
%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 TOK_ALIGN
+%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 CLOCK TYPEALIAS TYPEDEF UNSIGNED VARIANT VOID _BOOL _COMPLEX _IMAGINARY DECIMAL_CONSTANT OCTAL_CONSTANT HEXADECIMAL_CONSTANT TOK_ALIGN
%token <gs> IDENTIFIER ID_TYPE
%token ERROR
%union
%type <n> event_declaration
%type <n> stream_declaration
%type <n> trace_declaration
+%type <n> clock_declaration
%type <n> integer_declaration_specifiers
%type <n> declaration_specifiers
%type <n> alias_declaration_specifiers
%type <n> type_specifier
%type <n> struct_type_specifier
%type <n> variant_type_specifier
-%type <n> declaration_specifiers_or_integer_constant
%type <n> enum_type_specifier
%type <n> struct_or_variant_declaration_list
%type <n> struct_or_variant_declaration
{ $$ = yylval.gs; }
| TRACE
{ $$ = yylval.gs; }
+ | CLOCK
+ { $$ = yylval.gs; }
| TOK_ALIGN
{ $$ = yylval.gs; }
;
{ $$ = $1; }
| trace_declaration
{ $$ = $1; }
+ | clock_declaration
+ { $$ = $1; }
| declaration_specifiers TYPEDEF declaration_specifiers type_declarator_list SEMICOLON
{
struct ctf_node *list;
{ pop_scope(scanner); }
;
-
trace_declaration:
trace_declaration_begin trace_declaration_end
{
{ pop_scope(scanner); }
;
+clock_declaration:
+ CLOCK clock_declaration_begin clock_declaration_end
+ {
+ $$ = make_node(scanner, NODE_CLOCK);
+ }
+ | CLOCK clock_declaration_begin ctf_assignment_expression_list clock_declaration_end
+ {
+ $$ = make_node(scanner, NODE_CLOCK);
+ if (set_parent_node($3, $$))
+ reparent_error(scanner, "trace_declaration");
+ }
+ ;
+
+clock_declaration_begin:
+ LBRAC
+ { push_scope(scanner); }
+ ;
+
+clock_declaration_end:
+ RBRAC SEMICOLON
+ { pop_scope(scanner); }
+ ;
+
integer_declaration_specifiers:
CONST
{
{ pop_scope(scanner); }
;
-declaration_specifiers_or_integer_constant:
- declaration_specifiers
- { $$ = $1; }
- | DECIMAL_CONSTANT
- {
- $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
- $$->u.unary_expression.type = UNARY_UNSIGNED_CONSTANT;
- sscanf(yylval.gs->s, "%" PRIu64,
- &$$->u.unary_expression.u.unsigned_constant);
- }
- | OCTAL_CONSTANT
- {
- $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
- $$->u.unary_expression.type = UNARY_UNSIGNED_CONSTANT;
- sscanf(yylval.gs->s, "0%" PRIo64,
- &$$->u.unary_expression.u.unsigned_constant);
- }
- | HEXADECIMAL_CONSTANT
- {
- $$ = make_node(scanner, NODE_UNARY_EXPRESSION);
- $$->u.unary_expression.type = UNARY_UNSIGNED_CONSTANT;
- sscanf(yylval.gs->s, "0x%" PRIx64,
- &$$->u.unary_expression.u.unsigned_constant);
- }
- ;
-
enum_type_specifier:
LBRAC enumerator_list RBRAC
{
$$->u.type_declarator.type = TYPEDEC_NESTED;
$$->u.type_declarator.u.nested.type_declarator = $2;
}
- | direct_abstract_declarator LSBRAC declaration_specifiers_or_integer_constant RSBRAC
+ | direct_abstract_declarator LSBRAC unary_expression RSBRAC
{
$$ = make_node(scanner, NODE_TYPE_DECLARATOR);
$$->u.type_declarator.type = TYPEDEC_NESTED;
$$->u.type_declarator.u.nested.type_declarator = $1;
- ($$)->u.type_declarator.u.nested.length = $3;
+ CDS_INIT_LIST_HEAD(&($$)->u.type_declarator.u.nested.length);
+ _cds_list_splice_tail(&($3)->tmp_head, &($$)->u.type_declarator.u.nested.length);
}
| direct_abstract_declarator LSBRAC RSBRAC
{
$$->u.type_declarator.type = TYPEDEC_NESTED;
$$->u.type_declarator.u.nested.type_declarator = $2;
}
- | direct_alias_abstract_declarator LSBRAC declaration_specifiers_or_integer_constant RSBRAC
+ | direct_alias_abstract_declarator LSBRAC unary_expression RSBRAC
{
$$ = make_node(scanner, NODE_TYPE_DECLARATOR);
$$->u.type_declarator.type = TYPEDEC_NESTED;
$$->u.type_declarator.u.nested.type_declarator = $1;
- ($$)->u.type_declarator.u.nested.length = $3;
+ CDS_INIT_LIST_HEAD(&($$)->u.type_declarator.u.nested.length);
+ _cds_list_splice_tail(&($3)->tmp_head, &($$)->u.type_declarator.u.nested.length);
}
| direct_alias_abstract_declarator LSBRAC RSBRAC
{
$$->u.type_declarator.type = TYPEDEC_NESTED;
$$->u.type_declarator.u.nested.type_declarator = $2;
}
- | direct_declarator LSBRAC declaration_specifiers_or_integer_constant RSBRAC
+ | direct_declarator LSBRAC unary_expression RSBRAC
{
$$ = make_node(scanner, NODE_TYPE_DECLARATOR);
$$->u.type_declarator.type = TYPEDEC_NESTED;
$$->u.type_declarator.u.nested.type_declarator = $1;
- ($$)->u.type_declarator.u.nested.length = $3;
+ CDS_INIT_LIST_HEAD(&($$)->u.type_declarator.u.nested.length);
+ _cds_list_splice_tail(&($3)->tmp_head, &($$)->u.type_declarator.u.nested.length);
}
;
$$->u.type_declarator.type = TYPEDEC_NESTED;
$$->u.type_declarator.u.nested.type_declarator = $2;
}
- | direct_type_declarator LSBRAC declaration_specifiers_or_integer_constant RSBRAC
+ | direct_type_declarator LSBRAC unary_expression RSBRAC
{
$$ = make_node(scanner, NODE_TYPE_DECLARATOR);
$$->u.type_declarator.type = TYPEDEC_NESTED;
$$->u.type_declarator.u.nested.type_declarator = $1;
- ($$)->u.type_declarator.u.nested.length = $3;
+ CDS_INIT_LIST_HEAD(&($$)->u.type_declarator.u.nested.length);
+ _cds_list_splice_tail(&($3)->tmp_head, &($$)->u.type_declarator.u.nested.length);
}
;