X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-parser.y;h=821f0f7469b351cff47707e8be85d7fd3d165b12;hp=84d4702ebb30afa0cb78b8e9008c3475487a1a23;hb=3f4bae2a85a43606999ca7e701dcc9a493352ed3;hpb=8aa95b17d3af243a1c49d093e2429799f0dd6e58 diff --git a/formats/ctf/metadata/ctf-parser.y b/formats/ctf/metadata/ctf-parser.y index 84d4702e..821f0f74 100644 --- a/formats/ctf/metadata/ctf-parser.y +++ b/formats/ctf/metadata/ctf-parser.y @@ -58,15 +58,15 @@ _bt_list_splice_tail (struct bt_list_head *add, struct bt_list_head *head) } BT_HIDDEN -int yyparse(struct ctf_scanner *scanner); +int yyparse(struct ctf_scanner *scanner, yyscan_t yyscanner); BT_HIDDEN -int yylex(union YYSTYPE *yyval, struct ctf_scanner *scanner); +int yylex(union YYSTYPE *yyval, yyscan_t yyscanner); BT_HIDDEN int yylex_init_extra(struct ctf_scanner *scanner, yyscan_t * ptr_yy_globals); BT_HIDDEN int yylex_destroy(yyscan_t yyscanner); BT_HIDDEN -void yyrestart(FILE * in_str, yyscan_t scanner); +void yyrestart(FILE * in_str, yyscan_t yyscanner); BT_HIDDEN int yyget_lineno(yyscan_t yyscanner); BT_HIDDEN @@ -362,19 +362,16 @@ static void add_type(struct ctf_scanner *scanner, char *id) static struct ctf_node *make_node(struct ctf_scanner *scanner, enum node_type type) { - struct ctf_ast *ast = ctf_scanner_get_ast(scanner); struct ctf_node *node; - node = malloc(sizeof(*node)); + node = objstack_alloc(scanner->objstack, sizeof(*node)); if (!node) { printfl_fatal(yyget_lineno(scanner->scanner), "out of memory"); return &error_node; } - memset(node, 0, sizeof(*node)); node->type = type; node->lineno = yyget_lineno(scanner->scanner); BT_INIT_LIST_HEAD(&node->tmp_head); - bt_list_add(&node->gc, &ast->allocated_nodes); bt_list_add(&node->siblings, &node->tmp_head); switch (type) { @@ -937,7 +934,7 @@ static int set_parent_node(struct ctf_node *node, } BT_HIDDEN -void yyerror(struct ctf_scanner *scanner, const char *str) +void yyerror(struct ctf_scanner *scanner, yyscan_t yyscanner, const char *str) { printfl_error(yyget_lineno(scanner->scanner), "token \"%s\": %s\n", @@ -952,19 +949,17 @@ int yywrap(void) #define reparent_error(scanner, str) \ do { \ - yyerror(scanner, YY_("reparent_error: " str)); \ + yyerror(scanner, scanner->scanner, YY_("reparent_error: " str)); \ YYERROR; \ } while (0) -static struct ctf_ast *ctf_ast_alloc(void) +static struct ctf_ast *ctf_ast_alloc(struct ctf_scanner *scanner) { struct ctf_ast *ast; - ast = malloc(sizeof(*ast)); + ast = objstack_alloc(scanner->objstack, sizeof(*ast)); if (!ast) return NULL; - memset(ast, 0, sizeof(*ast)); - BT_INIT_LIST_HEAD(&ast->allocated_nodes); ast->root.type = NODE_ROOT; BT_INIT_LIST_HEAD(&ast->root.tmp_head); BT_INIT_LIST_HEAD(&ast->root.u.root.declaration_list); @@ -977,21 +972,18 @@ static struct ctf_ast *ctf_ast_alloc(void) return ast; } -static void ctf_ast_free(struct ctf_ast *ast) +int ctf_scanner_append_ast(struct ctf_scanner *scanner, FILE *input) { - struct ctf_node *node, *tmp; - - bt_list_for_each_entry_safe(node, tmp, &ast->allocated_nodes, gc) - free(node); - free(ast); -} - -int ctf_scanner_append_ast(struct ctf_scanner *scanner) -{ - return yyparse(scanner); + /* Start processing new stream */ + yyrestart(input, scanner->scanner); + if (yydebug) + fprintf(stdout, "Scanner input is a%s.\n", + isatty(fileno(input)) ? "n interactive tty" : + " noninteractive file"); + return yyparse(scanner, scanner->scanner); } -struct ctf_scanner *ctf_scanner_alloc(FILE *input) +struct ctf_scanner *ctf_scanner_alloc(void) { struct ctf_scanner *scanner; int ret; @@ -1002,33 +994,24 @@ struct ctf_scanner *ctf_scanner_alloc(FILE *input) if (!scanner) return NULL; memset(scanner, 0, sizeof(*scanner)); - ret = yylex_init_extra(scanner, &scanner->scanner); if (ret) { printf_fatal("yylex_init error"); goto cleanup_scanner; } - /* Start processing new stream */ - yyrestart(input, scanner->scanner); - - scanner->ast = ctf_ast_alloc(); - if (!scanner->ast) - goto cleanup_lexer; scanner->objstack = objstack_create(); if (!scanner->objstack) - goto cleanup_ast; + goto cleanup_lexer; + scanner->ast = ctf_ast_alloc(scanner); + if (!scanner->ast) + goto cleanup_objstack; init_scope(&scanner->root_scope, NULL); scanner->cs = &scanner->root_scope; - if (yydebug) - fprintf(stdout, "Scanner input is a%s.\n", - isatty(fileno(input)) ? "n interactive tty" : - " noninteractive file"); - return scanner; -cleanup_ast: - ctf_ast_free(scanner->ast); +cleanup_objstack: + objstack_destroy(scanner->objstack); cleanup_lexer: ret = yylex_destroy(scanner->scanner); if (!ret) @@ -1042,9 +1025,10 @@ void ctf_scanner_free(struct ctf_scanner *scanner) { int ret; + if (!scanner) + return; finalize_scope(&scanner->root_scope); objstack_destroy(scanner->objstack); - ctf_ast_free(scanner->ast); ret = yylex_destroy(scanner->scanner); if (ret) printf_error("yylex_destroy error"); @@ -1057,7 +1041,8 @@ void ctf_scanner_free(struct ctf_scanner *scanner) /* %locations */ %error-verbose %parse-param {struct ctf_scanner *scanner} -%lex-param {struct ctf_scanner *scanner} +%parse-param {yyscan_t yyscanner} +%lex-param {yyscan_t yyscanner} /* * Expect two shift-reduce conflicts. Caused by enum name-opt : type {} * vs struct { int :value; } (unnamed bit-field). The default is to @@ -1266,6 +1251,15 @@ postfix_expression: bt_list_splice(&($1)->tmp_head, &($$)->tmp_head); bt_list_add_tail(&($$)->siblings, &($$)->tmp_head); } + | postfix_expression DOT keywords + { + $$ = make_node(scanner, NODE_UNARY_EXPRESSION); + $$->u.unary_expression.type = UNARY_STRING; + $$->u.unary_expression.u.string = yylval.s; + $$->u.unary_expression.link = UNARY_DOTLINK; + bt_list_splice(&($1)->tmp_head, &($$)->tmp_head); + bt_list_add_tail(&($$)->siblings, &($$)->tmp_head); + } | postfix_expression RARROW IDENTIFIER { $$ = make_node(scanner, NODE_UNARY_EXPRESSION);