#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.
*/
}
}
-#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);
-int yylex_destroy(yyscan_t yyscanner) ;
-void yyset_in(FILE * in_str, yyscan_t scanner);
+int yylex_destroy(yyscan_t yyscanner);
+void yyrestart(FILE * in_str, yyscan_t scanner);
int yydebug;
{
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;
{
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);
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;
}
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);
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:
struct ctf_scanner *scanner;
int ret;
+ yydebug = babeltrace_debug;
+
scanner = malloc(sizeof(*scanner));
if (!scanner)
return NULL;
fprintf(stderr, "yylex_init error\n");
goto cleanup_scanner;
}
- yyset_in(input, scanner);
+ /* Start processing new stream */
+ yyrestart(input, scanner->scanner);
scanner->ast = ctf_ast_alloc();
if (!scanner->ast)
scanner->cs = &scanner->root_scope;
CDS_INIT_LIST_HEAD(&scanner->allocated_strings);
+ if (yydebug)
+ fprintf(stdout, "Scanner input is a%s.\n",
+ isatty(fileno(input)) ? "n interactive tty" :
+ " noninteractive file");
+
return scanner;
cleanup_lexer:
*/
%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
{ $$ = yylval.gs; }
| TRACE
{ $$ = yylval.gs; }
+ | TOK_ALIGN
+ { $$ = yylval.gs; }
;
/* 1.5 Constants */
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);
$$->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: