diff --git a/gdb/ada-exp.y b/gdb/ada-exp.y index 3e31d275046..23aebf0e236 100644 --- a/gdb/ada-exp.y +++ b/gdb/ada-exp.y @@ -1150,7 +1150,7 @@ ada_parse (struct parser_state *par_state) original_expr = par_state->lexptr; scoped_restore restore_yydebug = make_scoped_restore (&yydebug, - parser_debug); + par_state->debug); lexer_init (yyin); /* (Re-)initialize lexer. */ obstack_free (&temp_parse_space, NULL); diff --git a/gdb/c-exp.y b/gdb/c-exp.y index 9ee4115560a..a8c78414253 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -3403,7 +3403,7 @@ c_parse (struct parser_state *par_state) = make_scoped_restore (&expression_macro_scope, macro_scope.get ()); scoped_restore restore_yydebug = make_scoped_restore (&yydebug, - parser_debug); + par_state->debug); /* Initialize some state used by the lexer. */ last_was_structop = false; diff --git a/gdb/d-exp.y b/gdb/d-exp.y index 3a4e7ee0434..b0f2c0d1c10 100644 --- a/gdb/d-exp.y +++ b/gdb/d-exp.y @@ -1607,7 +1607,7 @@ d_parse (struct parser_state *par_state) pstate = par_state; scoped_restore restore_yydebug = make_scoped_restore (&yydebug, - parser_debug); + par_state->debug); struct type_stack stack; scoped_restore restore_type_stack = make_scoped_restore (&type_stack, diff --git a/gdb/expression.h b/gdb/expression.h index 2e2d2a090f9..c485b159ef8 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -296,6 +296,11 @@ enum parser_flag /* This flag is set if a top-level comma terminates the expression. */ PARSER_COMMA_TERMINATES = (1 << 1), + + /* This flag is set if the parser should print debugging output as + it parses. For yacc-based parsers, this translates to setting + yydebug. */ + PARSER_DEBUG = (1 << 2), }; DEF_ENUM_FLAGS_TYPE (enum parser_flag, parser_flags); diff --git a/gdb/f-exp.y b/gdb/f-exp.y index 7fb1a9054e3..c0afebc0589 100644 --- a/gdb/f-exp.y +++ b/gdb/f-exp.y @@ -1697,7 +1697,7 @@ f_language::parser (struct parser_state *par_state) const /* Setting up the parser state. */ scoped_restore pstate_restore = make_scoped_restore (&pstate); scoped_restore restore_yydebug = make_scoped_restore (&yydebug, - parser_debug); + par_state->debug); gdb_assert (par_state != NULL); pstate = par_state; last_was_structop = false; diff --git a/gdb/go-exp.y b/gdb/go-exp.y index 542a06d06d6..5c213f138f0 100644 --- a/gdb/go-exp.y +++ b/gdb/go-exp.y @@ -1525,7 +1525,7 @@ go_language::parser (struct parser_state *par_state) const pstate = par_state; scoped_restore restore_yydebug = make_scoped_restore (&yydebug, - parser_debug); + par_state->debug); /* Initialize some state used by the lexer. */ last_was_structop = 0; diff --git a/gdb/parse.c b/gdb/parse.c index 2f014dd2172..bbe5cf12d37 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -62,7 +62,7 @@ show_expressiondebug (struct ui_file *file, int from_tty, /* True if an expression parser should set yydebug. */ -bool parser_debug; +static bool parser_debug; static void show_parserdebug (struct ui_file *file, int from_tty, diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h index 39046d04c8d..93ebdf5c061 100644 --- a/gdb/parser-defs.h +++ b/gdb/parser-defs.h @@ -32,8 +32,6 @@ struct language_defn; struct internalvar; class innermost_block_tracker; -extern bool parser_debug; - /* A class that can be used to build a "struct expression". */ struct expr_builder @@ -157,7 +155,8 @@ struct parser_state : public expr_builder block_tracker (tracker), comma_terminates ((flags & PARSER_COMMA_TERMINATES) != 0), parse_completion (completion), - void_context_p ((flags & PARSER_VOID_CONTEXT) != 0) + void_context_p ((flags & PARSER_VOID_CONTEXT) != 0), + debug ((flags & PARSER_DEBUG) != 0) { } @@ -303,6 +302,9 @@ struct parser_state : public expr_builder /* True if no value is expected from the expression. */ bool void_context_p; + /* True if parser debugging should be enabled. */ + bool debug; + private: /* Data structure for saving values of arglist_len for function calls whose