forked from osmocom/wireshark
dfilter: Improve syntax error message
Pass simple token value and use it for the error message. This string is freed in the parser destructor.
This commit is contained in:
parent
db18865e55
commit
2c55bffb41
|
@ -79,7 +79,10 @@ any "error" symbols are shifted, if possible. */
|
|||
|
||||
switch(stnode_type_id(TOKEN)) {
|
||||
case STTYPE_UNINITIALIZED:
|
||||
dfilter_fail(dfw, "Syntax error.");
|
||||
if ((TOKEN)->token_value != NULL)
|
||||
dfilter_fail(dfw, "Syntax error near \"%s\".", stnode_token_value(TOKEN));
|
||||
else
|
||||
dfilter_fail(dfw, "Syntax error.");
|
||||
break;
|
||||
case STTYPE_TEST:
|
||||
dfilter_fail(dfw, "Syntax error, TEST.");
|
||||
|
|
|
@ -88,7 +88,8 @@ static int set_lval_str(int token, const char *token_value);
|
|||
static int set_lval_field(int token, header_field_info *hfinfo, const char *token_value);
|
||||
static int set_lval_func(int token, df_func_def_t *func, const char *token_value);
|
||||
static int set_lval_int(dfwork_t *dfw, int token, const char *token_value);
|
||||
static int simple(int token);
|
||||
static int simple(int token, const char *token_value);
|
||||
#define SIMPLE(token) simple(token, yytext)
|
||||
static gboolean str_to_gint32(dfwork_t *dfw, const char *s, gint32* pint);
|
||||
|
||||
/*
|
||||
|
@ -117,61 +118,61 @@ static gboolean str_to_gint32(dfwork_t *dfw, const char *s, gint32* pint);
|
|||
* should have used commas from the beginning, but now we are stuck with
|
||||
* whitespace as separators. */
|
||||
if (yyextra->in_set) {
|
||||
return simple(TOKEN_WHITESPACE);
|
||||
return simple(TOKEN_WHITESPACE, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
"(" return simple(TOKEN_LPAREN);
|
||||
")" return simple(TOKEN_RPAREN);
|
||||
"," return simple(TOKEN_COMMA);
|
||||
"(" return SIMPLE(TOKEN_LPAREN);
|
||||
")" return SIMPLE(TOKEN_RPAREN);
|
||||
"," return SIMPLE(TOKEN_COMMA);
|
||||
|
||||
"{"[[:blank:]\n]* {
|
||||
yyextra->in_set = TRUE;
|
||||
return simple(TOKEN_LBRACE);
|
||||
return simple(TOKEN_LBRACE, "{");
|
||||
}
|
||||
[[:blank:]\n]*".."[[:blank:]\n]* return simple(TOKEN_DOTDOT);
|
||||
[[:blank:]\n]*".."[[:blank:]\n]* return simple(TOKEN_DOTDOT, "..");
|
||||
[[:blank:]\n]*"}" {
|
||||
yyextra->in_set = FALSE;
|
||||
return simple(TOKEN_RBRACE);
|
||||
return simple(TOKEN_RBRACE, "}");
|
||||
}
|
||||
|
||||
"==" return simple(TOKEN_TEST_EQ);
|
||||
"eq" return simple(TOKEN_TEST_EQ);
|
||||
"==" return SIMPLE(TOKEN_TEST_EQ);
|
||||
"eq" return SIMPLE(TOKEN_TEST_EQ);
|
||||
"!=" {
|
||||
add_deprecated_token(yyextra->deprecated, "!=");
|
||||
return simple(TOKEN_TEST_NE);
|
||||
return SIMPLE(TOKEN_TEST_NE);
|
||||
}
|
||||
"ne" {
|
||||
add_deprecated_token(yyextra->deprecated, "ne");
|
||||
return simple(TOKEN_TEST_NE);
|
||||
return SIMPLE(TOKEN_TEST_NE);
|
||||
}
|
||||
">" return simple(TOKEN_TEST_GT);
|
||||
"gt" return simple(TOKEN_TEST_GT);
|
||||
">=" return simple(TOKEN_TEST_GE);
|
||||
"ge" return simple(TOKEN_TEST_GE);
|
||||
"<" return simple(TOKEN_TEST_LT);
|
||||
"lt" return simple(TOKEN_TEST_LT);
|
||||
"<=" return simple(TOKEN_TEST_LE);
|
||||
"le" return simple(TOKEN_TEST_LE);
|
||||
"bitwise_and" return simple(TOKEN_TEST_BITWISE_AND);
|
||||
"&" return simple(TOKEN_TEST_BITWISE_AND);
|
||||
"contains" return simple(TOKEN_TEST_CONTAINS);
|
||||
"~" return simple(TOKEN_TEST_MATCHES);
|
||||
"matches" return simple(TOKEN_TEST_MATCHES);
|
||||
"!" return simple(TOKEN_TEST_NOT);
|
||||
"not" return simple(TOKEN_TEST_NOT);
|
||||
"&&" return simple(TOKEN_TEST_AND);
|
||||
"and" return simple(TOKEN_TEST_AND);
|
||||
"||" return simple(TOKEN_TEST_OR);
|
||||
"or" return simple(TOKEN_TEST_OR);
|
||||
"in" return simple(TOKEN_TEST_IN);
|
||||
">" return SIMPLE(TOKEN_TEST_GT);
|
||||
"gt" return SIMPLE(TOKEN_TEST_GT);
|
||||
">=" return SIMPLE(TOKEN_TEST_GE);
|
||||
"ge" return SIMPLE(TOKEN_TEST_GE);
|
||||
"<" return SIMPLE(TOKEN_TEST_LT);
|
||||
"lt" return SIMPLE(TOKEN_TEST_LT);
|
||||
"<=" return SIMPLE(TOKEN_TEST_LE);
|
||||
"le" return SIMPLE(TOKEN_TEST_LE);
|
||||
"bitwise_and" return SIMPLE(TOKEN_TEST_BITWISE_AND);
|
||||
"&" return SIMPLE(TOKEN_TEST_BITWISE_AND);
|
||||
"contains" return SIMPLE(TOKEN_TEST_CONTAINS);
|
||||
"~" return SIMPLE(TOKEN_TEST_MATCHES);
|
||||
"matches" return SIMPLE(TOKEN_TEST_MATCHES);
|
||||
"!" return SIMPLE(TOKEN_TEST_NOT);
|
||||
"not" return SIMPLE(TOKEN_TEST_NOT);
|
||||
"&&" return SIMPLE(TOKEN_TEST_AND);
|
||||
"and" return SIMPLE(TOKEN_TEST_AND);
|
||||
"||" return SIMPLE(TOKEN_TEST_OR);
|
||||
"or" return SIMPLE(TOKEN_TEST_OR);
|
||||
"in" return SIMPLE(TOKEN_TEST_IN);
|
||||
|
||||
|
||||
"[" {
|
||||
BEGIN(RANGE_INT);
|
||||
return simple(TOKEN_LBRACKET);
|
||||
return SIMPLE(TOKEN_LBRACKET);
|
||||
}
|
||||
|
||||
<RANGE_INT>[+-]?[[:digit:]]+ {
|
||||
|
@ -186,22 +187,22 @@ static gboolean str_to_gint32(dfwork_t *dfw, const char *s, gint32* pint);
|
|||
|
||||
<RANGE_INT,RANGE_PUNCT>":" {
|
||||
BEGIN(RANGE_INT);
|
||||
return simple(TOKEN_COLON);
|
||||
return SIMPLE(TOKEN_COLON);
|
||||
}
|
||||
|
||||
<RANGE_PUNCT>"-" {
|
||||
BEGIN(RANGE_INT);
|
||||
return simple(TOKEN_HYPHEN);
|
||||
return SIMPLE(TOKEN_HYPHEN);
|
||||
}
|
||||
|
||||
<RANGE_INT,RANGE_PUNCT>"," {
|
||||
BEGIN(RANGE_INT);
|
||||
return simple(TOKEN_COMMA);
|
||||
return SIMPLE(TOKEN_COMMA);
|
||||
}
|
||||
|
||||
<RANGE_INT,RANGE_PUNCT>"]" {
|
||||
BEGIN(INITIAL);
|
||||
return simple(TOKEN_RBRACKET);
|
||||
return SIMPLE(TOKEN_RBRACKET);
|
||||
}
|
||||
|
||||
/* Error if none of the above while scanning a range (slice) */
|
||||
|
@ -444,7 +445,7 @@ static gboolean str_to_gint32(dfwork_t *dfw, const char *s, gint32* pint);
|
|||
DIAG_ON_FLEX
|
||||
|
||||
static int
|
||||
simple(int token)
|
||||
simple(int token, const char *token_value)
|
||||
{
|
||||
switch (token) {
|
||||
case TOKEN_LPAREN:
|
||||
|
@ -475,6 +476,7 @@ simple(int token)
|
|||
default:
|
||||
ws_assert_not_reached();
|
||||
}
|
||||
stnode_init(df_lval, STTYPE_UNINITIALIZED, NULL, token_value);
|
||||
return token;
|
||||
}
|
||||
|
||||
|
|
|
@ -76,15 +76,17 @@ sttype_lookup(sttype_id_t type_id)
|
|||
return result;
|
||||
}
|
||||
|
||||
|
||||
stnode_t*
|
||||
stnode_new(sttype_id_t type_id, gpointer data, const char *token_value)
|
||||
void
|
||||
stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, const char *token_value)
|
||||
{
|
||||
sttype_t *type;
|
||||
stnode_t *node;
|
||||
|
||||
node = g_new0(stnode_t, 1);
|
||||
node->magic = STNODE_MAGIC;
|
||||
ws_assert_magic(node, STNODE_MAGIC);
|
||||
ws_assert(!node->type);
|
||||
ws_assert(!node->data);
|
||||
ws_assert(!node->token_value);
|
||||
node->flags = 0;
|
||||
node->value = 0;
|
||||
|
||||
if (type_id == STTYPE_UNINITIALIZED) {
|
||||
node->type = NULL;
|
||||
|
@ -103,6 +105,24 @@ stnode_new(sttype_id_t type_id, gpointer data, const char *token_value)
|
|||
|
||||
}
|
||||
node->token_value = g_strdup(token_value);
|
||||
}
|
||||
|
||||
void
|
||||
stnode_init_int(stnode_t *node, sttype_id_t type_id, gint32 value, const char *token_value)
|
||||
{
|
||||
stnode_init(node, type_id, NULL, token_value);
|
||||
node->value = value;
|
||||
}
|
||||
|
||||
stnode_t*
|
||||
stnode_new(sttype_id_t type_id, gpointer data, const char *token_value)
|
||||
{
|
||||
stnode_t *node;
|
||||
|
||||
node = g_new0(stnode_t, 1);
|
||||
node->magic = STNODE_MAGIC;
|
||||
|
||||
stnode_init(node, type_id, data, token_value);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
@ -135,38 +155,6 @@ stnode_dup(const stnode_t *org)
|
|||
return node;
|
||||
}
|
||||
|
||||
void
|
||||
stnode_init(stnode_t *node, sttype_id_t type_id, gpointer data, const char *token_value)
|
||||
{
|
||||
sttype_t *type;
|
||||
|
||||
ws_assert_magic(node, STNODE_MAGIC);
|
||||
ws_assert(!node->type);
|
||||
ws_assert(!node->data);
|
||||
ws_assert(!node->token_value);
|
||||
|
||||
type = sttype_lookup(type_id);
|
||||
ws_assert(type);
|
||||
node->type = type;
|
||||
node->flags = 0;
|
||||
|
||||
if (type->func_new) {
|
||||
node->data = type->func_new(data);
|
||||
}
|
||||
else {
|
||||
node->data = data;
|
||||
}
|
||||
node->value = 0;
|
||||
node->token_value = g_strdup(token_value);
|
||||
}
|
||||
|
||||
void
|
||||
stnode_init_int(stnode_t *node, sttype_id_t type_id, gint32 value, const char *token_value)
|
||||
{
|
||||
stnode_init(node, type_id, NULL, token_value);
|
||||
node->value = value;
|
||||
}
|
||||
|
||||
void
|
||||
stnode_free(stnode_t *node)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue