X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-parser.y;h=8fc83dfad49c154f4ad756da4e7f73a3a72de60a;hp=f394fda2702cd398506c0091f9922d5af975ad30;hb=a398348262109d4272d93b787014e9c901d99b67;hpb=61e9d0cef413869e6ac39ba85b7b4258d8f7fdbc diff --git a/formats/ctf/metadata/ctf-parser.y b/formats/ctf/metadata/ctf-parser.y index f394fda2..8fc83dfa 100644 --- a/formats/ctf/metadata/ctf-parser.y +++ b/formats/ctf/metadata/ctf-parser.y @@ -26,10 +26,13 @@ #include #include #include +#include #include "ctf-scanner.h" #include "ctf-parser.h" #include "ctf-ast.h" +int yydebug; + /* * TODO: support enum, variant and struct declarations in scopes. */ @@ -47,13 +50,11 @@ _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); int yylex_destroy(yyscan_t yyscanner); -void yyset_in(FILE * in_str, yyscan_t scanner); +void yyrestart(FILE * in_str, yyscan_t scanner); int yydebug; @@ -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); @@ -790,6 +791,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; @@ -800,7 +803,8 @@ struct ctf_scanner *ctf_scanner_alloc(FILE *input) 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) @@ -809,6 +813,11 @@ struct ctf_scanner *ctf_scanner_alloc(FILE *input) 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: @@ -1510,6 +1519,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);