diff options
author | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2012-06-19 12:12:41 +0000 |
---|---|---|
committer | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2012-06-19 12:12:41 +0000 |
commit | addf9236dc80679fb0701b3808f7d5264a9753dd (patch) | |
tree | 018fddc20b899c0af6a73b0bc39b2d10186f4867 /epan/dfilter/grammar.lemon | |
parent | 9ee8562c32dd4bf1968247e21460bce3fb3963a7 (diff) |
Support multiple relation test without logic and (python-like)
Like:
a == b == c
or
a < b <= c <= d < e
Real life example:
6660 <= tcp.port <= 6669
Just syntactic sugar, this is *NOT* optimized.
svn path=/trunk/; revision=43353
Diffstat (limited to 'epan/dfilter/grammar.lemon')
-rw-r--r-- | epan/dfilter/grammar.lemon | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/epan/dfilter/grammar.lemon b/epan/dfilter/grammar.lemon index c367f28a9f..a58b75406a 100644 --- a/epan/dfilter/grammar.lemon +++ b/epan/dfilter/grammar.lemon @@ -249,6 +249,27 @@ relation_test(T) ::= entity(E) rel_op2(O) entity(F). sttype_test_set2(T, O, E, F); } +/* 'a == b == c' or 'a < b <= c <= d < e' */ +relation_test(T) ::= entity(E) rel_op2(O) relation_test(R). +{ + stnode_t *L, *F; + /* for now generate it like E O F TEST_OP_AND F P G, later it could be optimized + or semantically checked (to make a <= b >= c or a == b != c invalid)? + */ + + F = R; + do { + g_assert(F != NULL && stnode_type_id(F) == STTYPE_TEST); + sttype_test_get(F, NULL, &F, NULL); + } while (stnode_type_id(F) == STTYPE_TEST); + + L = stnode_new(STTYPE_TEST, NULL); + sttype_test_set2(L, O, E, stnode_dup(F)); + + T = stnode_new(STTYPE_TEST, NULL); + sttype_test_set2(T, TEST_OP_AND, L, R); +} + rel_op2(O) ::= TEST_EQ. { O = TEST_OP_EQ; } rel_op2(O) ::= TEST_NE. { O = TEST_OP_NE; } rel_op2(O) ::= TEST_GT. { O = TEST_OP_GT; } |