}
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
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) {
}
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",
#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);
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;
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)
{
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");
/* %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
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);