X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-parser.y;h=58ea245b8d30f2b43b17cb26b7a8a72594bd0dc2;hp=e7dfd80cf847aeea3bcd9ff14d21219984023a3d;hb=f9c67088c31c4e211e4ea9655c231d0b908a6290;hpb=c462e188f3e7819c7bc74f671038cdbf36e8c3c0 diff --git a/formats/ctf/metadata/ctf-parser.y b/formats/ctf/metadata/ctf-parser.y index e7dfd80c..58ea245b 100644 --- a/formats/ctf/metadata/ctf-parser.y +++ b/formats/ctf/metadata/ctf-parser.y @@ -39,7 +39,7 @@ #include "ctf-parser.h" #include "ctf-ast.h" -__attribute__((visibility("hidden"))) +BT_HIDDEN int yydebug; /* Join two lists, put "add" at the end of "head". */ @@ -55,16 +55,20 @@ _bt_list_splice_tail (struct bt_list_head *add, struct bt_list_head *head) } } -__attribute__((visibility("hidden"))) +BT_HIDDEN int yyparse(struct ctf_scanner *scanner); -__attribute__((visibility("hidden"))) +BT_HIDDEN int yylex(union YYSTYPE *yyval, struct ctf_scanner *scanner); -__attribute__((visibility("hidden"))) +BT_HIDDEN int yylex_init_extra(struct ctf_scanner *scanner, yyscan_t * ptr_yy_globals); -__attribute__((visibility("hidden"))) +BT_HIDDEN int yylex_destroy(yyscan_t yyscanner); -__attribute__((visibility("hidden"))) +BT_HIDDEN void yyrestart(FILE * in_str, yyscan_t scanner); +BT_HIDDEN +int yyget_lineno(yyscan_t yyscanner); +BT_HIDDEN +char *yyget_text(yyscan_t yyscanner); struct gc_string { struct bt_list_head gc; @@ -101,7 +105,7 @@ static const char *node_type_to_str[] = { [ NODE_STRUCT ] = "NODE_STRUCT", }; -__attribute__((visibility("hidden"))) +BT_HIDDEN const char *node_type(struct ctf_node *node) { if (node->type < NR_NODE_TYPES) @@ -132,7 +136,7 @@ static struct gc_string *gc_string_alloc(struct ctf_scanner *scanner, * gsrc will be garbage collected immediately, and gstr might be. * Should only be used to append characters to a string literal or constant. */ -__attribute__((visibility("hidden"))) +BT_HIDDEN struct gc_string *gc_string_append(struct ctf_scanner *scanner, struct gc_string *gstr, struct gc_string *gsrc) @@ -211,7 +215,7 @@ static int lookup_type(struct ctf_scanner_scope *s, const char *id) return ret; } -__attribute__((visibility("hidden"))) +BT_HIDDEN int is_type(struct ctf_scanner *scanner, const char *id) { struct ctf_scanner_scope *it; @@ -246,13 +250,14 @@ static struct ctf_node *make_node(struct ctf_scanner *scanner, return NULL; 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) { case NODE_ROOT: - fprintf(stderr, "[error] %s: trying to create root node\n", __func__); + printfn_fatal(node, "trying to create root node"); break; case NODE_EVENT: @@ -332,8 +337,7 @@ static struct ctf_node *make_node(struct ctf_scanner *scanner, case NODE_UNKNOWN: default: - fprintf(stderr, "[error] %s: unknown node type %d\n", __func__, - (int) type); + printfn_fatal(node, "unknown node type '%d'", (int) type); break; } @@ -392,8 +396,7 @@ static int reparent_ctf_expression(struct ctf_node *node, case NODE_UNKNOWN: default: - fprintf(stderr, "[error] %s: unknown node type %d\n", __func__, - (int) parent->type); + printfn_fatal(node, "unknown node type '%d'", (int) parent->type); return -EINVAL; } return 0; @@ -450,8 +453,7 @@ static int reparent_typedef(struct ctf_node *node, struct ctf_node *parent) case NODE_UNKNOWN: default: - fprintf(stderr, "[error] %s: unknown node type %d\n", __func__, - (int) parent->type); + printfn_fatal(node, "unknown node type %d", parent->type); return -EINVAL; } return 0; @@ -508,8 +510,7 @@ static int reparent_typealias(struct ctf_node *node, struct ctf_node *parent) case NODE_UNKNOWN: default: - fprintf(stderr, "[error] %s: unknown node type %d\n", __func__, - (int) parent->type); + printfn_fatal(node, "unknown node type '%d'", (int) parent->type); return -EINVAL; } return 0; @@ -550,8 +551,7 @@ static int reparent_type_specifier(struct ctf_node *node, case NODE_UNKNOWN: default: - fprintf(stderr, "[error] %s: unknown node type %d\n", __func__, - (int) parent->type); + printfn_fatal(node, "unknown node type '%d'", (int) parent->type); return -EINVAL; } return 0; @@ -617,8 +617,7 @@ static int reparent_type_specifier_list(struct ctf_node *node, case NODE_UNKNOWN: default: - fprintf(stderr, "[error] %s: unknown node type %d\n", __func__, - (int) parent->type); + printfn_fatal(node, "unknown node type '%d'", (int) parent->type); return -EINVAL; } return 0; @@ -669,8 +668,7 @@ static int reparent_type_declarator(struct ctf_node *node, case NODE_UNKNOWN: default: - fprintf(stderr, "[error] %s: unknown node type %d\n", __func__, - (int) parent->type); + printfn_fatal(node, "unknown node type '%d'", (int) parent->type); return -EINVAL; } return 0; @@ -693,7 +691,7 @@ static int set_parent_node(struct ctf_node *node, switch (node->type) { case NODE_ROOT: - fprintf(stderr, "[error] %s: trying to reparent root node\n", __func__); + printfn_fatal(node, "trying to reparent root node"); return -EINVAL; case NODE_EVENT: @@ -808,20 +806,21 @@ static int set_parent_node(struct ctf_node *node, case NODE_UNKNOWN: default: - fprintf(stderr, "[error] %s: unknown node type %d\n", __func__, - (int) parent->type); + printfn_fatal(node, "unknown node type '%d'", (int) parent->type); return -EINVAL; } return 0; } -__attribute__((visibility("hidden"))) +BT_HIDDEN void yyerror(struct ctf_scanner *scanner, const char *str) { - fprintf(stderr, "error %s\n", str); + printfl_error(yyget_lineno(scanner->scanner), + "token \"%s\": %s\n", + yyget_text(scanner->scanner), str); } -__attribute__((visibility("hidden"))) +BT_HIDDEN int yywrap(void) { return 1; @@ -829,7 +828,7 @@ int yywrap(void) #define reparent_error(scanner, str) \ do { \ - yyerror(scanner, YY_("reparent_error: " str "\n")); \ + yyerror(scanner, YY_("reparent_error: " str)); \ YYERROR; \ } while (0) @@ -890,7 +889,7 @@ struct ctf_scanner *ctf_scanner_alloc(FILE *input) ret = yylex_init_extra(scanner, &scanner->scanner); if (ret) { - fprintf(stderr, "yylex_init error\n"); + printf_fatal("yylex_init error"); goto cleanup_scanner; } /* Start processing new stream */ @@ -913,7 +912,7 @@ struct ctf_scanner *ctf_scanner_alloc(FILE *input) cleanup_lexer: ret = yylex_destroy(scanner->scanner); if (!ret) - fprintf(stderr, "yylex_destroy error\n"); + printf_fatal("yylex_destroy error"); cleanup_scanner: free(scanner); return NULL; @@ -928,7 +927,7 @@ void ctf_scanner_free(struct ctf_scanner *scanner) ctf_ast_free(scanner->ast); ret = yylex_destroy(scanner->scanner); if (ret) - fprintf(stderr, "yylex_destroy error\n"); + printf_error("yylex_destroy error"); free(scanner); } @@ -936,6 +935,7 @@ void ctf_scanner_free(struct ctf_scanner *scanner) %define api.pure /* %locations */ +%error-verbose %parse-param {struct ctf_scanner *scanner} %lex-param {struct ctf_scanner *scanner} /* @@ -1225,21 +1225,25 @@ unary_expression: postfix_expression { $$ = $1; } | PLUS postfix_expression - { $$ = $2; } - | MINUS postfix_expression { $$ = $2; - if ($$->u.unary_expression.type != UNARY_SIGNED_CONSTANT - && $$->u.unary_expression.type != UNARY_UNSIGNED_CONSTANT) + if ($$->u.unary_expression.type != UNARY_UNSIGNED_CONSTANT + && $$->u.unary_expression.type != UNARY_SIGNED_CONSTANT) { reparent_error(scanner, "expecting numeric constant"); - + } + } + | MINUS postfix_expression + { + $$ = $2; if ($$->u.unary_expression.type == UNARY_UNSIGNED_CONSTANT) { $$->u.unary_expression.type = UNARY_SIGNED_CONSTANT; $$->u.unary_expression.u.signed_constant = -($$->u.unary_expression.u.unsigned_constant); - } else { + } else if ($$->u.unary_expression.type == UNARY_UNSIGNED_CONSTANT) { $$->u.unary_expression.u.signed_constant = -($$->u.unary_expression.u.signed_constant); + } else { + reparent_error(scanner, "expecting numeric constant"); } } ;