aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dfilter/grammar.lemon
diff options
context:
space:
mode:
authorJakub Zawadzki <darkjames-ws@darkjames.pl>2012-06-19 12:12:41 +0000
committerJakub Zawadzki <darkjames-ws@darkjames.pl>2012-06-19 12:12:41 +0000
commitaddf9236dc80679fb0701b3808f7d5264a9753dd (patch)
tree018fddc20b899c0af6a73b0bc39b2d10186f4867 /epan/dfilter/grammar.lemon
parent9ee8562c32dd4bf1968247e21460bce3fb3963a7 (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.lemon21
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; }