aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2024-01-02 14:02:44 +0000
committerAndrew Burgess <aburgess@redhat.com>2024-01-04 09:24:18 +0000
commite89496f42ac7b2d6fbba15f98f3caf496de050f4 (patch)
tree0e411dc7a998c3a56e25bba1adde8ad2642d4122 /gdb
parentc9f1e0dfc8f02a7772aa383cc305d9049075d1d8 (diff)
downloadfsf-binutils-gdb-e89496f42ac7b2d6fbba15f98f3caf496de050f4.zip
fsf-binutils-gdb-e89496f42ac7b2d6fbba15f98f3caf496de050f4.tar.gz
fsf-binutils-gdb-e89496f42ac7b2d6fbba15f98f3caf496de050f4.tar.bz2
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.y2
-rw-r--r--gdb/c-exp.y5
-rw-r--r--gdb/d-exp.y5
-rw-r--r--gdb/f-exp.y5
-rw-r--r--gdb/go-exp.y5
-rw-r--r--gdb/m2-exp.y5
-rw-r--r--gdb/p-exp.y5
-rw-r--r--gdb/parse.c11
-rw-r--r--gdb/parser-defs.h5
9 files changed, 23 insertions, 25 deletions
diff --git a/gdb/ada-exp.y b/gdb/ada-exp.y
index fcb5aa4..2a1cff5 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 2b4c218..6697b3b 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 e250798..627c681 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 e4e2171..88a95bc 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 c9b9c0b..561a3be 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 092a8be..9a8767f 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 b0f3348..9dfa8c5 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 b57d112..efac0de 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 93ebdf5..24522bb 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. */