summaryrefslogtreecommitdiff
path: root/rdns_scan/zmap4rdns/src/parser.y
diff options
context:
space:
mode:
Diffstat (limited to 'rdns_scan/zmap4rdns/src/parser.y')
-rw-r--r--rdns_scan/zmap4rdns/src/parser.y144
1 files changed, 144 insertions, 0 deletions
diff --git a/rdns_scan/zmap4rdns/src/parser.y b/rdns_scan/zmap4rdns/src/parser.y
new file mode 100644
index 0000000..dad3cd7
--- /dev/null
+++ b/rdns_scan/zmap4rdns/src/parser.y
@@ -0,0 +1,144 @@
+%{
+#include <stdio.h>
+#include <string.h>
+#include "expression.h"
+#include "lexer.h"
+#include "filter.h"
+
+void yyerror(const char *str)
+{
+ fprintf(stderr,"Parse error: %s\n",str);
+}
+
+int yywrap()
+{
+ return 1;
+}
+
+extern node_t *zfilter;
+
+%}
+
+%union {
+ int int_literal;
+ char *string_literal;
+ struct node_st *expr;
+}
+
+%token '(' ')' T_AND T_OR
+%token <int_literal> T_NUMBER
+%token <string_literal> T_FIELD
+%token T_NOT_EQ T_GT_EQ '>' '<' '=' T_LT_EQ
+
+%left T_OR
+%left T_AND
+
+%type <expr> filter
+%type <expr> number_filter
+%type <expr> string_filter
+%type <expr> filter_expr
+
+
+%%
+
+expression: filter_expr
+ {
+ zfilter = $1;
+ }
+
+
+filter_expr:
+ filter_expr T_OR filter_expr
+ {
+ $$ = make_op_node(OR);
+ $$->left_child = $1;
+ $$->right_child = $3;
+ }
+ | filter_expr T_AND filter_expr
+ {
+ $$ = make_op_node(AND);
+ $$->left_child = $1;
+ $$->right_child = $3;
+ }
+ | '(' filter_expr ')'
+ {
+ $$ = $2;
+ }
+ | filter
+ {
+ $$ = $1;
+ }
+ ;
+
+filter: number_filter
+ {
+ $$ = $1;
+ }
+ | string_filter
+ {
+ $$ = $1;
+ }
+ ;
+
+number_filter: T_FIELD '=' T_NUMBER
+ {
+ $$ = make_op_node(EQ);
+ $$->left_child = make_field_node($1);
+ $$->right_child = make_int_node($3);
+ }
+ |
+ T_FIELD '>' T_NUMBER
+ {
+ $$ = make_op_node(GT);
+ $$->left_child = make_field_node($1);
+ $$->right_child = make_int_node($3);
+ }
+ |
+ T_FIELD '<' T_NUMBER
+ {
+ $$ = make_op_node(LT);
+ $$->left_child = make_field_node($1);
+ $$->right_child = make_int_node($3);
+ }
+ |
+ T_FIELD T_NOT_EQ T_NUMBER
+ {
+ $$ = make_op_node(NEQ);
+ $$->left_child = make_field_node($1);
+ $$->right_child = make_int_node($3);
+ }
+ |
+ T_FIELD T_GT_EQ T_NUMBER
+ {
+ $$ = make_op_node(GT_EQ);
+ $$->left_child = make_field_node($1);
+ $$->right_child = make_int_node($3);
+ }
+ |
+ T_FIELD T_LT_EQ T_NUMBER
+ {
+ $$ = make_op_node(LT_EQ);
+ $$->left_child = make_field_node($1);
+ $$->right_child = make_int_node($3);
+ }
+ ;
+
+string_filter:
+ T_FIELD '=' T_FIELD
+ {
+ $$ = make_op_node(EQ);
+ $$->left_child = make_field_node($1);
+ $$->right_child = make_string_node($3);
+ }
+ |
+ T_FIELD T_NOT_EQ T_FIELD
+ {
+ $$ = make_op_node(NEQ);
+ $$->left_child = make_field_node($1);
+ $$->right_child = make_string_node($3);
+ }
+ ;
+
+%%
+
+