2001-02-01 20:21:25 +00:00
|
|
|
%{
|
2001-02-01 20:31:21 +00:00
|
|
|
/*
|
|
|
|
* $Id: scanner.l,v 1.2 2001/02/01 20:31:18 gram Exp $
|
2001-02-01 20:21:25 +00:00
|
|
|
*
|
2001-02-01 20:31:21 +00:00
|
|
|
* Ethereal - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@zing.org>
|
|
|
|
* Copyright 2001 Gerald Combs
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
2001-02-01 20:21:25 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "glib-util.h"
|
|
|
|
#include "dfilter-int.h"
|
|
|
|
#include "syntax-tree.h"
|
|
|
|
#include "grammar.h"
|
|
|
|
|
|
|
|
#define LVAL df_lval
|
|
|
|
#define LVAL_TYPE stnode_t*
|
|
|
|
#define LVAL_INIT_VAL NULL
|
|
|
|
#define MODNAME df
|
|
|
|
|
|
|
|
#include <lemonflex-head.inc>
|
|
|
|
|
|
|
|
/*#undef YY_NO_UNPUT*/
|
|
|
|
|
|
|
|
int set_lval(int token, gpointer data);
|
|
|
|
int simple(int token);
|
|
|
|
|
|
|
|
%}
|
|
|
|
|
|
|
|
%x RANGE
|
|
|
|
|
|
|
|
BWCHARS [[:alnum:]\[\]\-_.+!@#%^&*=/:]
|
|
|
|
INITVAR [_A-Za-z]
|
|
|
|
VARCHARS [[:alnum:]_]
|
|
|
|
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
|
|
[[:blank:]\n]+ /* ignore whitespace */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"(" return simple(TOKEN_LPAREN);
|
|
|
|
")" return simple(TOKEN_RPAREN);
|
|
|
|
|
|
|
|
"==" return simple(TOKEN_TEST_EQ);
|
|
|
|
"eq" return simple(TOKEN_TEST_EQ);
|
|
|
|
"!=" return simple(TOKEN_TEST_NE);
|
|
|
|
"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);
|
|
|
|
|
|
|
|
"!" 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);
|
|
|
|
|
|
|
|
|
|
|
|
"[" {
|
|
|
|
BEGIN(RANGE);
|
|
|
|
return simple(TOKEN_LBRACKET);
|
|
|
|
}
|
|
|
|
|
|
|
|
<RANGE>[+-]?[[:digit:]]+ {
|
|
|
|
return set_lval(TOKEN_STRING, g_strdup(yytext));
|
|
|
|
}
|
|
|
|
<RANGE>[+-]?0x[[:xdigit:]]+ {
|
|
|
|
return set_lval(TOKEN_STRING, g_strdup(yytext));
|
|
|
|
}
|
|
|
|
<RANGE>":" return simple(TOKEN_COLON);
|
|
|
|
|
|
|
|
<RANGE>"]" {
|
|
|
|
BEGIN(INITIAL);
|
|
|
|
return simple(TOKEN_RBRACKET);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
\"[^"]*\" {
|
|
|
|
return set_lval(TOKEN_STRING, g_substrdup(yytext, 1, -2));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[[:alnum:]_.:]+ {
|
|
|
|
/* Is it a field name? */
|
|
|
|
header_field_info *hfinfo;
|
|
|
|
|
|
|
|
hfinfo = dfilter_lookup_token(yytext);
|
|
|
|
if (hfinfo) {
|
|
|
|
/* Yes, it's a field name */
|
|
|
|
return set_lval(TOKEN_FIELD, hfinfo);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* No, so treat it as a string */
|
|
|
|
return set_lval(TOKEN_STRING, g_strdup(yytext));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
|
|
int
|
|
|
|
simple(int token)
|
|
|
|
{
|
|
|
|
switch (token) {
|
|
|
|
case TOKEN_LPAREN:
|
|
|
|
case TOKEN_RPAREN:
|
|
|
|
case TOKEN_LBRACKET:
|
|
|
|
case TOKEN_RBRACKET:
|
|
|
|
case TOKEN_COLON:
|
|
|
|
case TOKEN_TEST_EQ:
|
|
|
|
case TOKEN_TEST_NE:
|
|
|
|
case TOKEN_TEST_GT:
|
|
|
|
case TOKEN_TEST_GE:
|
|
|
|
case TOKEN_TEST_LT:
|
|
|
|
case TOKEN_TEST_LE:
|
|
|
|
case TOKEN_TEST_NOT:
|
|
|
|
case TOKEN_TEST_AND:
|
|
|
|
case TOKEN_TEST_OR:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
g_assert_not_reached();
|
|
|
|
}
|
|
|
|
return token;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
set_lval(int token, gpointer data)
|
|
|
|
{
|
|
|
|
sttype_id_t type_id = STTYPE_UNINITIALIZED;
|
|
|
|
|
|
|
|
switch (token) {
|
|
|
|
case TOKEN_STRING:
|
|
|
|
type_id = STTYPE_STRING;
|
|
|
|
break;
|
|
|
|
case TOKEN_FIELD:
|
|
|
|
type_id = STTYPE_FIELD;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
g_assert_not_reached();
|
|
|
|
}
|
|
|
|
|
|
|
|
stnode_init(df_lval, type_id, data);
|
|
|
|
return token;
|
|
|
|
}
|
|
|
|
|
|
|
|
#include <lemonflex-tail.inc>
|