diff options
author | Andrew Burgess <aburgess@redhat.com> | 2024-01-02 14:02:44 +0000 |
---|---|---|
committer | Andrew Burgess <aburgess@redhat.com> | 2024-01-04 09:24:18 +0000 |
commit | e89496f42ac7b2d6fbba15f98f3caf496de050f4 (patch) | |
tree | 0e411dc7a998c3a56e25bba1adde8ad2642d4122 /gdb | |
parent | c9f1e0dfc8f02a7772aa383cc305d9049075d1d8 (diff) |
gdb: merge error handling from different expression parsers
Many (all?) of the expression parsers implement yyerror to handle
parser errors, and all of these functions are basically identical.
This commit adds a new parser_state::parse_error() function, which
implements the common error handling code, this function can then be
called from all the different yyerror functions.
The benefit of this is that (in a future commit) I can improve the
error output, and all the expression parsers will benefit.
This commit is pure refactoring though, and so, there should be no
user visible changes after this commit.
Approved-By: John Baldwin <jhb@FreeBSD.org>
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ada-exp.y | 2 | ||||
-rw-r--r-- | gdb/c-exp.y | 5 | ||||
-rw-r--r-- | gdb/d-exp.y | 5 | ||||
-rw-r--r-- | gdb/f-exp.y | 5 | ||||
-rw-r--r-- | gdb/go-exp.y | 5 | ||||
-rw-r--r-- | gdb/m2-exp.y | 5 | ||||
-rw-r--r-- | gdb/p-exp.y | 5 | ||||
-rw-r--r-- | gdb/parse.c | 11 | ||||
-rw-r--r-- | gdb/parser-defs.h | 5 |
9 files changed, 23 insertions, 25 deletions
diff --git a/gdb/ada-exp.y b/gdb/ada-exp.y index fcb5aa4379b..2a1cff50887 100644 --- a/gdb/ada-exp.y +++ b/gdb/ada-exp.y @@ -1212,7 +1212,7 @@ ada_parse (struct parser_state *par_state) static void yyerror (const char *msg) { - error (_("Error in expression, near `%s'."), pstate->lexptr); + pstate->parse_error (msg); } /* Emit expression to access an instance of SYM, in block BLOCK (if diff --git a/gdb/c-exp.y b/gdb/c-exp.y index 2b4c21850d3..6697b3b2278 100644 --- a/gdb/c-exp.y +++ b/gdb/c-exp.y @@ -3482,8 +3482,5 @@ c_print_token (FILE *file, int type, YYSTYPE value) static void yyerror (const char *msg) { - if (pstate->prev_lexptr) - pstate->lexptr = pstate->prev_lexptr; - - error (_("A %s in expression, near `%s'."), msg, pstate->lexptr); + pstate->parse_error (msg); } diff --git a/gdb/d-exp.y b/gdb/d-exp.y index e2507982d50..627c681d895 100644 --- a/gdb/d-exp.y +++ b/gdb/d-exp.y @@ -1631,9 +1631,6 @@ d_parse (struct parser_state *par_state) static void yyerror (const char *msg) { - if (pstate->prev_lexptr) - pstate->lexptr = pstate->prev_lexptr; - - error (_("A %s in expression, near `%s'."), msg, pstate->lexptr); + pstate->parse_error (msg); } diff --git a/gdb/f-exp.y b/gdb/f-exp.y index e4e2171d641..88a95bccb11 100644 --- a/gdb/f-exp.y +++ b/gdb/f-exp.y @@ -1736,8 +1736,5 @@ f_language::parser (struct parser_state *par_state) const static void yyerror (const char *msg) { - if (pstate->prev_lexptr) - pstate->lexptr = pstate->prev_lexptr; - - error (_("A %s in expression, near `%s'."), msg, pstate->lexptr); + pstate->parse_error (msg); } diff --git a/gdb/go-exp.y b/gdb/go-exp.y index c9b9c0b1ab7..561a3bef1b0 100644 --- a/gdb/go-exp.y +++ b/gdb/go-exp.y @@ -1545,8 +1545,5 @@ go_language::parser (struct parser_state *par_state) const static void yyerror (const char *msg) { - if (pstate->prev_lexptr) - pstate->lexptr = pstate->prev_lexptr; - - error (_("A %s in expression, near `%s'."), msg, pstate->lexptr); + pstate->parse_error (msg); } diff --git a/gdb/m2-exp.y b/gdb/m2-exp.y index 092a8be248d..9a8767f5ac7 100644 --- a/gdb/m2-exp.y +++ b/gdb/m2-exp.y @@ -1006,8 +1006,5 @@ m2_language::parser (struct parser_state *par_state) const static void yyerror (const char *msg) { - if (pstate->prev_lexptr) - pstate->lexptr = pstate->prev_lexptr; - - error (_("A %s in expression, near `%s'."), msg, pstate->lexptr); + pstate->parse_error (msg); } diff --git a/gdb/p-exp.y b/gdb/p-exp.y index b0f334897ad..9dfa8c5fd4f 100644 --- a/gdb/p-exp.y +++ b/gdb/p-exp.y @@ -1660,8 +1660,5 @@ pascal_language::parser (struct parser_state *par_state) const static void yyerror (const char *msg) { - if (pstate->prev_lexptr) - pstate->lexptr = pstate->prev_lexptr; - - error (_("A %s in expression, near `%s'."), msg, pstate->lexptr); + pstate->parse_error (msg); } diff --git a/gdb/parse.c b/gdb/parse.c index b57d112fafd..efac0dee1af 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -244,6 +244,17 @@ parser_state::push_dollar (struct stoken str) (create_internalvar (copy.c_str () + 1)); } +/* See parser-defs.h. */ + +void +parser_state::parse_error (const char *msg) +{ + if (this->prev_lexptr) + this->lexptr = this->prev_lexptr; + + error (_("A %s in expression, near `%s'."), msg, this->lexptr); +} + const char * diff --git a/gdb/parser-defs.h b/gdb/parser-defs.h index 93ebdf5c061..24522bbbb15 100644 --- a/gdb/parser-defs.h +++ b/gdb/parser-defs.h @@ -262,6 +262,11 @@ struct parser_state : public expr_builder push (expr::make_operation<T> (std::move (lhs), std::move (rhs))); } + /* Function called from the various parsers' yyerror functions to throw + an error. The error will include a message identifying the location + of the error within the current expression. */ + void parse_error (const char *msg); + /* If this is nonzero, this block is used as the lexical context for symbol names. */ |